From: Sarah Hoffmann Date: Mon, 10 Aug 2015 19:42:40 +0000 (+0200) Subject: implement namedetails and extratags parameter for search X-Git-Tag: v.2.5.0~35^2~3 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/a1f3bfb35afbe70f97b130874bd1b43ee844a6b2 implement namedetails and extratags parameter for search --- diff --git a/lib/Geocode.php b/lib/Geocode.php index c89cc48c..93498c33 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -6,6 +6,8 @@ protected $aLangPrefOrder = array(); protected $bIncludeAddressDetails = false; + protected $bIncludeExtraTags = false; + protected $bIncludeNameDetails = false; protected $bIncludePolygonAsPoints = false; protected $bIncludePolygonAsText = false; @@ -68,6 +70,16 @@ return $this->bIncludeAddressDetails; } + function getIncludeExtraTags() + { + return $this->bIncludeExtraTags; + } + + function getIncludeNameDetails() + { + return $this->bIncludeNameDetails; + } + function setIncludePolygonAsPoints($b = true) { $this->bIncludePolygonAsPoints = $b; @@ -214,6 +226,8 @@ function loadParamArray($aParams) { if (isset($aParams['addressdetails'])) $this->bIncludeAddressDetails = (bool)$aParams['addressdetails']; + if (isset($aParams['extratags'])) $this->bIncludeExtraTags = (bool)$aParams['extratags']; + if (isset($aParams['namedetails'])) $this->bIncludeNameDetails = (bool)$aParams['namedetails']; if (isset($aParams['bounded'])) $this->bBoundedSearch = (bool)$aParams['bounded']; if (isset($aParams['dedupe'])) $this->bDeDupe = (bool)$aParams['dedupe']; @@ -389,6 +403,8 @@ $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= "get_name_by_language(name, $sLanguagePrefArraySQL) as placename,"; $sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,"; + if ($this->bIncludeExtraTags) $sSQL .= "hstore_to_json(extratags)::text as extra,"; + if ($this->bIncludeNameDetails) $sSQL .= "hstore_to_json(name)::text as names,"; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= $sImportanceSQL."coalesce(importance,0.75-(rank_search::float/40)) as importance, "; $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(CASE WHEN placex.rank_search < 28 THEN placex.place_id ELSE placex.parent_place_id END) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, "; @@ -405,6 +421,8 @@ $sSQL .= ",langaddress "; $sSQL .= ",placename "; $sSQL .= ",ref "; + if ($this->bIncludeExtraTags) $sSQL .= ",extratags"; + if ($this->bIncludeNameDetails) $sSQL .= ",name"; $sSQL .= ",extratags->'place' "; if (30 >= $this->iMinAddressRank && 30 <= $this->iMaxAddressRank) @@ -414,6 +432,8 @@ $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= "null as placename,"; $sSQL .= "null as ref,"; + if ($this->bIncludeExtraTags) $sSQL .= "null as extra,"; + if ($this->bIncludeNameDetails) $sSQL .= "null as names,"; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= $sImportanceSQL."-1.15 as importance, "; $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_tiger.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, "; @@ -427,6 +447,8 @@ $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= "null as placename,"; $sSQL .= "null as ref,"; + if ($this->bIncludeExtraTags) $sSQL .= "null as extra,"; + if ($this->bIncludeNameDetails) $sSQL .= "null as names,"; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= $sImportanceSQL."-1.10 as importance, "; $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, "; @@ -1756,6 +1778,30 @@ } } + if ($this->bIncludeExtraTags) + { + if ($aResult['extra']) + { + $aResult['sExtraTags'] = json_decode($aResult['extra']); + } + else + { + $aResult['sExtraTags'] = array(); + } + } + + if ($this->bIncludeNameDetails) + { + if ($aResult['names']) + { + $aResult['sNameDetails'] = json_decode($aResult['names']); + } + else + { + $aResult['sNameDetails'] = array(); + } + } + // Adjust importance for the number of exact string matches in the result $aResult['importance'] = max(0.001,$aResult['importance']); $iCountWords = 0; @@ -1790,6 +1836,7 @@ { $aResult['foundorder'] += 0.01; } + if (CONST_Debug) { var_dump($aResult); } $aSearchResults[$iResNum] = $aResult; } uasort($aSearchResults, 'byImportance'); diff --git a/lib/template/address-xml.php b/lib/template/address-xml.php index ba085eea..39d9a147 100644 --- a/lib/template/address-xml.php +++ b/lib/template/address-xml.php @@ -47,9 +47,7 @@ echo ""; foreach ($aPlace['sExtraTags'] as $sKey => $sValue) { - echo ''; - echo htmlspecialchars($sValue); - echo ""; + echo ''; } echo ""; } @@ -59,7 +57,7 @@ echo ""; foreach ($aPlace['sNameDetails'] as $sKey => $sValue) { - echo ''; + echo ''; echo htmlspecialchars($sValue); echo ""; } diff --git a/lib/template/search-json.php b/lib/template/search-json.php index 57586fb9..3dcaabdb 100644 --- a/lib/template/search-json.php +++ b/lib/template/search-json.php @@ -74,6 +74,9 @@ $aPlace['geokml'] = $aPointDetails['askml']; } + if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags']; + if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails']; + $aFilteredPlaces[] = $aPlace; } diff --git a/lib/template/search-jsonv2.php b/lib/template/search-jsonv2.php index 126f7866..8006e3c2 100644 --- a/lib/template/search-jsonv2.php +++ b/lib/template/search-jsonv2.php @@ -73,6 +73,9 @@ $aPlace['geokml'] = $aPointDetails['askml']; } + if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags']; + if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails']; + $aFilteredPlaces[] = $aPlace; } diff --git a/lib/template/search-xml.php b/lib/template/search-xml.php index c1fd58f0..b61ff22f 100644 --- a/lib/template/search-xml.php +++ b/lib/template/search-xml.php @@ -88,20 +88,59 @@ echo " icon='".htmlspecialchars($aResult['icon'], ENT_QUOTES)."'"; } - if (isset($aResult['address']) || isset($aResult['askml'])) - { - echo ">"; - } + $bHasDelim = false; if (isset($aResult['askml'])) { + if (!$bHasDelim) + { + $bHasDelim = true; + echo ">"; + } echo "\n"; echo $aResult['askml']; echo ""; } + if (isset($aResult['sExtraTags'])) + { + if (!$bHasDelim) + { + $bHasDelim = true; + echo ">"; + } + echo "\n"; + foreach ($aResult['sExtraTags'] as $sKey => $sValue) + { + echo ''; + } + echo ""; + } + + if (isset($aResult['sNameDetails'])) + { + if (!$bHasDelim) + { + $bHasDelim = true; + echo ">"; + } + echo "\n"; + foreach ($aResult['sNameDetails'] as $sKey => $sValue) + { + echo ''; + echo htmlspecialchars($sValue); + echo ""; + } + echo ""; + } + if (isset($aResult['address'])) { + if (!$bHasDelim) + { + $bHasDelim = true; + echo ">"; + } echo "\n"; foreach($aResult['address'] as $sKey => $sValue) { @@ -112,7 +151,7 @@ } } - if (isset($aResult['address']) || isset($aResult['askml'])) + if ($bHasDelim) { echo ""; } diff --git a/website/search.php b/website/search.php index bf27ef9a..b18c391e 100755 --- a/website/search.php +++ b/website/search.php @@ -126,6 +126,8 @@ if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) $sMoreURL .= '&accept-language='.$_SERVER["HTTP_ACCEPT_LANGUAGE"]; if ($bShowPolygons) $sMoreURL .= '&polygon=1'; if ($oGeocode->getIncludeAddressDetails()) $sMoreURL .= '&addressdetails=1'; + if ($oGeocode->getIncludeExtraTags()) $sMoreURL .= '&extratags=1'; + if ($oGeocode->getIncludeNameDetails()) $sMoreURL .= '&namedetails=1'; if ($sViewBox) $sMoreURL .= '&viewbox='.urlencode($sViewBox); if (isset($_GET['nearlat']) && isset($_GET['nearlon'])) $sMoreURL .= '&nearlat='.(float)$_GET['nearlat'].'&nearlon='.(float)$_GET['nearlon']; $sMoreURL .= '&q='.urlencode($sQuery);