import {
osmLink, wikipediaLink, coverageType, isAdminBoundary,
- formatAddressRank, formatKeywordToken
+ formatAddressRank, formatKeywordToken, formatOSMType
} from '../lib/helpers.js';
import Header from '../components/Header.svelte';
import MapIcon from '../components/MapIcon.svelte';
import SearchSectionDetails from '../components/SearchSectionDetails.svelte';
import DetailsOneRow from '../components/DetailsOneRow.svelte';
import DetailsLink from '../components/DetailsLink.svelte';
+ import DetailsPostcodeHint from '../components/DetailsPostcodeHint.svelte';
import InfoRow from '../components/DetailsInfoRow.svelte';
import InfoRowList from '../components/DetailsInfoRowList.svelte';
import Map from '../components/Map.svelte';
let aPlace;
- let base_url = window.location.search;
+ let base_url;
let api_request_params;
let api_request_finished = false;
}
}
+ function place_has_keywords(aThisPlace) {
+ // Return false if Nominatim API sends 'keywords: { name: [], address: [] }'
+ // Like no longer needed after Nominatim version 4.3
+ return (
+ aThisPlace.keywords && aThisPlace.keywords.name && aThisPlace.keywords.address
+ && (aThisPlace.keywords.name.length > 0 || aThisPlace.keywords.address.length > 0)
+ );
+ }
+
$: {
let pageinfo = $page;
if (pageinfo.tab === 'details') {
loaddata(pageinfo.params);
+ base_url = window.location.search;
}
}
+ $: reverse_only = Nominatim_Config.Reverse_Only;
</script>
<Header>
<div class="row">
<div class="col-sm-10">
<h1>
- {aPlace.localname}
+ {aPlace.localname || `${formatOSMType(aPlace.osm_type)} ${aPlace.osm_id}` }
<small><DetailsLink feature={aPlace}>link to this page</DetailsLink></small>
</h1>
</div>
- <div class="col-sm-2 text-right">
+ <div class="col-sm-2 text-end">
<MapIcon aPlace={aPlace} />
</div>
</div>
<div class="col-md-6">
<table id="locationdetails" class="table table-striped table-responsive">
<tbody>
- <InfoRow title="Name"><InfoRowList items={aPlace.names} /></InfoRow>
+ <InfoRow title="Name">
+ {#if aPlace.names && typeof (aPlace.names) === 'object'
+ && Object.keys(aPlace.names).length}
+ <InfoRowList items={aPlace.names} />
+ {:else}
+ <span class="noname fw-bold">No Name</span>
+ {/if}
+ </InfoRow>
<InfoRow title="Type">{aPlace.category}:{aPlace.type}</InfoRow>
<InfoRow title="Last Updated">{aPlace.indexed_date}</InfoRow>
{#if (isAdminBoundary(aPlace)) }
<InfoRow title="Admin Level">{aPlace.admin_level}</InfoRow>
{/if}
<InfoRow title="Search Rank">{aPlace.rank_search}</InfoRow>
- <InfoRow title="Address Rank">{aPlace.rank_address} ({formatAddressRank(aPlace.rank_address)})</InfoRow>
+ <InfoRow title="Address Rank">
+ {aPlace.rank_address} ({formatAddressRank(aPlace.rank_address)})
+ </InfoRow>
{#if aPlace.calculated_importance}
<InfoRow title="Importance">
{aPlace.calculated_importance}
<InfoRow title="Centre Point (lat,lon)">
{aPlace.centroid.coordinates[1]},{aPlace.centroid.coordinates[0]}
</InfoRow>
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
<InfoRow title="OSM">{@html osmLink(aPlace)}</InfoRow>
<InfoRow title="Place Id">
{aPlace.place_id}
- (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">on this server</a>)
+ (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">
+ on this server
+ </a>)
</InfoRow>
{#if aPlace.calculated_wikipedia}
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
<InfoRow title="Wikipedia Calculated">{@html wikipediaLink(aPlace)}</InfoRow>
{/if}
- <InfoRow title="Computed Postcode">{aPlace.calculated_postcode || ''}</InfoRow>
+ <InfoRow title="Computed Postcode">
+ {#if aPlace.calculated_postcode}
+ {aPlace.calculated_postcode}
+ <DetailsPostcodeHint postcode={aPlace.calculated_postcode}
+ lat={aPlace.centroid.coordinates[1]}
+ lon={aPlace.centroid.coordinates[0]} />
+ {/if}
+ </InfoRow>
<InfoRow title="Address Tags"><InfoRowList items={aPlace.addresstags} /></InfoRow>
<InfoRow title="Extra Tags"><InfoRowList items={aPlace.extratags} /></InfoRow>
</tbody>
<tbody>
{#if aPlace.address}
{#each aPlace.address as addressLine}
- <DetailsOneRow addressLine={addressLine} bDistanceInMeters=false />
+ <DetailsOneRow addressLine={addressLine}
+ bMarkUnusedLines={true}
+ bDistanceInMeters={false} />
{/each}
{/if}
{#if aPlace.linked_places}
- <tr class="all-columns"><td colspan="6"><h2>Linked Places</h2></td></tr>
+ <tr class="all-columns"><td colspan="7"><h2>Linked Places</h2></td></tr>
{#each aPlace.linked_places as addressLine}
- <DetailsOneRow addressLine={addressLine} bDistanceInMeters=true />
+ <DetailsOneRow addressLine={addressLine}
+ bMarkUnusedLines={true}
+ bDistanceInMeters={true} />
{/each}
{/if}
- <tr class="all-columns"><td colspan="6"><h2>Keywords</h2></td></tr>
- {#if aPlace.keywords}
- <tr class="all-columns"><td colspan="6"><h3>Name Keywords</h3></td></tr>
- {#each aPlace.keywords.name as keyword}
- <tr>
- <td>{formatKeywordToken(keyword.token)}</td>
- {#if keyword.id}
- <td>word id: {keyword.id}</td>
- {/if}
- </tr>
- {/each}
+ {#if !reverse_only}
+ <tr class="all-columns"><td colspan="7"><h2>Keywords</h2></td></tr>
+ {#if api_request_params.keywords}
- <tr class="all-columns"><td colspan="6"><h3>Address Keywords</h3></td></tr>
- {#each aPlace.keywords.address as keyword}
- <tr>
- <td>{formatKeywordToken(keyword.token)}</td>
- {#if keyword.id}
- <td>word id: {keyword.id}</td>
+ {#if place_has_keywords(aPlace)}
+ <tr class="all-columns"><td colspan="7"><h3>Name Keywords</h3></td></tr>
+ {#each aPlace.keywords.name as keyword}
+ <tr>
+ <td>{formatKeywordToken(keyword.token)}</td>
+ {#if keyword.id}
+ <td>word id: {keyword.id}</td>
+ {/if}
+ </tr>
+ {/each}
+
+ {#if aPlace.keywords.address}
+ <tr class="all-columns"><td colspan="7"><h3>Address Keywords</h3></td></tr>
+ {#each aPlace.keywords.address as keyword}
+ <tr>
+ <td>{formatKeywordToken(keyword.token)}</td>
+ {#if keyword.id}
+ <td>word id: {keyword.id}</td>
+ {/if}
+ </tr>
+ {/each}
{/if}
- </tr>
- {/each}
- {:else}
- <tr>
- <td>
- <a class="btn btn-outline-secondary btn-sm"
- href="{base_url}&keywords=1">display keywords</a>
- </td>
- </tr>
+ {:else}
+ <tr><td>Place has no keywords</td></tr>
+ {/if}
+ {:else}
+ <tr>
+ <td>
+ <a class="btn btn-outline-secondary btn-sm"
+ href="{base_url}&keywords=1">display keywords</a>
+ </td>
+ </tr>
+ {/if}
{/if}
- <tr class="all-columns"><td colspan="6"><h2>Parent Of</h2></td></tr>
- {#if aPlace.hierarchy}
+ <tr class="all-columns"><td colspan="7"><h2>Parent Of</h2></td></tr>
+ {#if api_request_params.hierarchy}
+ {#if aPlace.hierarchy && typeof (aPlace.hierarchy) === 'object'
+ && Object.keys(aPlace.hierarchy).length}
+ {#each Object.keys(aPlace.hierarchy) as type}
+ <tr class="all-columns"><td colspan="7"><h3>{type}</h3></td></tr>
+ {#each aPlace.hierarchy[type] as line}
+ <DetailsOneRow addressLine={line} bDistanceInMeters={true} />
+ {/each}
+ {/each}
- {#each Object.keys(aPlace.hierarchy) as type}
- <tr class="all-columns"><td colspan="6"><h3>{type}</h3></td></tr>
- {#each aPlace.hierarchy[type] as line}
- <DetailsOneRow addressLine={line} bDistanceInMeters=true />
- {/each}
- {/each}
-
- {#if Object.keys(aPlace.hierarchy) > 500}
- <p>There are more child objects which are not shown.</p>
+ {#if Object.keys(aPlace.hierarchy) > 500}
+ <p>There are more child objects which are not shown.</p>
+ {/if}
+ {:else}
+ <tr><td>Place is not parent of other places</td></tr>
{/if}
{:else}
<tr>
}
tr.all-columns {
- background-color: white !important;
+ background-color: white !important;
border: none;
}
tr.all-columns td {
border-top: none !important;
padding-left: 0 !important;
}
+ :global(span.noname){
+ color:#800;
+ }
#map-wrapper {
+ position: relative;
width:100%;
min-height: auto;
height:300px;