forked from hans/Nominatim
add search for postcode
Implements the 'postcode' operator.
This commit is contained in:
@@ -476,6 +476,35 @@ class Geocode
|
|||||||
if ($this->bIncludeNameDetails) $sSQL .= "name, ";
|
if ($this->bIncludeNameDetails) $sSQL .= "name, ";
|
||||||
$sSQL .= " extratags->'place' ";
|
$sSQL .= " extratags->'place' ";
|
||||||
|
|
||||||
|
// postcode table
|
||||||
|
$sSQL .= "UNION ";
|
||||||
|
$sSQL .= "SELECT";
|
||||||
|
$sSQL .= " 'P' as osm_type,";
|
||||||
|
$sSQL .= " (SELECT osm_id from placex p WHERE p.place_id = parent_place_id) as osm_id,";
|
||||||
|
$sSQL .= " 'place' as class, 'postcode' as type,";
|
||||||
|
$sSQL .= " null as admin_level, rank_search, rank_address,";
|
||||||
|
$sSQL .= " place_id, parent_place_id, country_code,";
|
||||||
|
$sSQL .= " get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) AS langaddress,";
|
||||||
|
$sSQL .= " postcode as placename,";
|
||||||
|
$sSQL .= " postcode as ref,";
|
||||||
|
if ($this->bIncludeExtraTags) $sSQL .= "null AS extra,";
|
||||||
|
if ($this->bIncludeNameDetails) $sSQL .= "null AS names,";
|
||||||
|
$sSQL .= " ST_x(st_centroid(geometry)) AS lon, ST_y(st_centroid(geometry)) AS lat,";
|
||||||
|
$sSQL .= $sImportanceSQL."(0.75-(rank_search::float/40)) AS importance, ";
|
||||||
|
$sSQL .= " (";
|
||||||
|
$sSQL .= " SELECT max(p.importance*(p.rank_address+2))";
|
||||||
|
$sSQL .= " FROM ";
|
||||||
|
$sSQL .= " place_addressline s, ";
|
||||||
|
$sSQL .= " placex p";
|
||||||
|
$sSQL .= " WHERE s.place_id = parent_place_id";
|
||||||
|
$sSQL .= " AND p.place_id = s.address_place_id ";
|
||||||
|
$sSQL .= " AND s.isaddress";
|
||||||
|
$sSQL .= " AND p.importance is not null";
|
||||||
|
$sSQL .= " ) AS addressimportance, ";
|
||||||
|
$sSQL .= " null AS extra_place ";
|
||||||
|
$sSQL .= "FROM location_postcode";
|
||||||
|
$sSQL .= " WHERE place_id in ($sPlaceIDs) ";
|
||||||
|
|
||||||
if (30 >= $this->iMinAddressRank && 30 <= $this->iMaxAddressRank) {
|
if (30 >= $this->iMinAddressRank && 30 <= $this->iMaxAddressRank) {
|
||||||
// only Tiger housenumbers and interpolation lines need to be interpolated, because they are saved as lines
|
// only Tiger housenumbers and interpolation lines need to be interpolated, because they are saved as lines
|
||||||
// with start- and endnumber, the common osm housenumbers are usually saved as points
|
// with start- and endnumber, the common osm housenumbers are usually saved as points
|
||||||
@@ -719,7 +748,7 @@ class Geocode
|
|||||||
$aNewSearch = $aSearch;
|
$aNewSearch = $aSearch;
|
||||||
$aNewSearch['sOperator'] = 'postcode';
|
$aNewSearch['sOperator'] = 'postcode';
|
||||||
$aNewSearch['aAddress'] = array_merge($aNewSearch['aAddress'], $aNewSearch['aName']);
|
$aNewSearch['aAddress'] = array_merge($aNewSearch['aAddress'], $aNewSearch['aName']);
|
||||||
$aNewSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_token'];
|
$aNewSearch['aName'][$aSearchTerm['word_id']] = substr($aSearchTerm['word_token'], 1);
|
||||||
if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aNewSearch;
|
if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aNewSearch;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1308,6 +1337,18 @@ class Geocode
|
|||||||
// If a coordinate is given, the search must either
|
// If a coordinate is given, the search must either
|
||||||
// be for a name or a special search. Ignore everythin else.
|
// be for a name or a special search. Ignore everythin else.
|
||||||
$aPlaceIDs = array();
|
$aPlaceIDs = array();
|
||||||
|
} elseif ($aSearch['sOperator'] == 'postcode') {
|
||||||
|
$sSQL = "SELECT place_id FROM location_postcode ";
|
||||||
|
$sSQL .= "WHERE postcode = '".pg_escape_string(reset($aSearch['aName']))."'";
|
||||||
|
if ($aSearch['sCountryCode']) {
|
||||||
|
$sSQL .= " AND country_code = '".$aSearch['sCountryCode']."'";
|
||||||
|
}
|
||||||
|
if ($sCountryCodesSQL) {
|
||||||
|
$sSQL .= " AND country_code in ($sCountryCodesSQL)";
|
||||||
|
}
|
||||||
|
$sSQL .= " LIMIT $this->iLimit";
|
||||||
|
if (CONST_Debug) var_dump($sSQL);
|
||||||
|
$aPlaceIDs = chksql($this->oDB->getCol($sSQL));
|
||||||
} else {
|
} else {
|
||||||
$aPlaceIDs = array();
|
$aPlaceIDs = array();
|
||||||
|
|
||||||
|
|||||||
@@ -516,7 +516,7 @@ function _debugDumpGroupedSearches($aData, $aTokens)
|
|||||||
echo "<table border=\"1\">";
|
echo "<table border=\"1\">";
|
||||||
echo "<tr><th>rank</th><th>Name Tokens</th><th>Name Not</th>";
|
echo "<tr><th>rank</th><th>Name Tokens</th><th>Name Not</th>";
|
||||||
echo "<th>Address Tokens</th><th>Address Not</th><th>country</th>";
|
echo "<th>Address Tokens</th><th>Address Not</th><th>country</th>";
|
||||||
echo "<th>operator</th><th>class</th><th>type</th><th>house#</th>";
|
echo "<th>operator</th><th>class</th><th>type</th><th>postcode</th><th>house#</th>";
|
||||||
echo "<th>Lat</th><th>Lon</th><th>Radius</th></tr>";
|
echo "<th>Lat</th><th>Lon</th><th>Radius</th></tr>";
|
||||||
foreach ($aData as $iRank => $aRankedSet) {
|
foreach ($aData as $iRank => $aRankedSet) {
|
||||||
foreach ($aRankedSet as $aRow) {
|
foreach ($aRankedSet as $aRow) {
|
||||||
@@ -561,6 +561,7 @@ function _debugDumpGroupedSearches($aData, $aTokens)
|
|||||||
echo "<td>".$aRow['sClass']."</td>";
|
echo "<td>".$aRow['sClass']."</td>";
|
||||||
echo "<td>".$aRow['sType']."</td>";
|
echo "<td>".$aRow['sType']."</td>";
|
||||||
|
|
||||||
|
echo "<td>".$aRow['sPostcode']."</td>";
|
||||||
echo "<td>".$aRow['sHouseNumber']."</td>";
|
echo "<td>".$aRow['sHouseNumber']."</td>";
|
||||||
|
|
||||||
echo "<td>".$aRow['fLat']."</td>";
|
echo "<td>".$aRow['fLat']."</td>";
|
||||||
|
|||||||
@@ -2436,6 +2436,14 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
-- %NOAUXDATA% END IF;
|
-- %NOAUXDATA% END IF;
|
||||||
|
|
||||||
|
-- postcode table
|
||||||
|
IF for_place_id IS NULL THEN
|
||||||
|
select parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
|
||||||
|
FROM location_postcode
|
||||||
|
WHERE place_id = in_place_id
|
||||||
|
INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode, searchclass, searchtype;
|
||||||
|
END IF;
|
||||||
|
|
||||||
IF for_place_id IS NULL THEN
|
IF for_place_id IS NULL THEN
|
||||||
select parent_place_id, country_code, housenumber, rank_search, postcode, name, class, type from placex
|
select parent_place_id, country_code, housenumber, rank_search, postcode, name, class, type from placex
|
||||||
WHERE place_id = in_place_id and rank_search > 27
|
WHERE place_id = in_place_id and rank_search > 27
|
||||||
|
|||||||
@@ -212,6 +212,7 @@ CREATE TABLE location_postcode (
|
|||||||
geometry GEOMETRY(Geometry, 4326)
|
geometry GEOMETRY(Geometry, 4326)
|
||||||
);
|
);
|
||||||
CREATE INDEX idx_postcode_geometry ON location_postcode USING GIST (geometry) {ts:address-index};
|
CREATE INDEX idx_postcode_geometry ON location_postcode USING GIST (geometry) {ts:address-index};
|
||||||
|
GRANT SELECT ON location_postcode TO "{www-user}" ;
|
||||||
|
|
||||||
CREATE TRIGGER location_postcode_before_update BEFORE UPDATE ON location_postcode
|
CREATE TRIGGER location_postcode_before_update BEFORE UPDATE ON location_postcode
|
||||||
FOR EACH ROW EXECUTE PROCEDURE postcode_update();
|
FOR EACH ROW EXECUTE PROCEDURE postcode_update();
|
||||||
|
|||||||
Reference in New Issue
Block a user