X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/e1be3d9f48b51a927c26d1ac0035b50b82423916..756c23f39fcfa5d5a20ba587460f59cf2840e537:/lib/Geocode.php?ds=sidebyside diff --git a/lib/Geocode.php b/lib/Geocode.php index 2537ec84..fd381c7a 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -1,4 +1,7 @@ oDB =& $oDB; } - function setReverseInPlan($bReverse) + public function setReverseInPlan($bReverse) { $this->bReverseInPlan = $bReverse; } - function setLanguagePreference($aLangPref) + public function setLanguagePreference($aLangPref) { $this->aLangPrefOrder = $aLangPref; } - function getIncludeAddressDetails() + public function getIncludeAddressDetails() { return $this->bIncludeAddressDetails; } - function getIncludeExtraTags() + public function getIncludeExtraTags() { return $this->bIncludeExtraTags; } - function getIncludeNameDetails() + public function getIncludeNameDetails() { return $this->bIncludeNameDetails; } - function setIncludePolygonAsPoints($b = true) + public function setIncludePolygonAsPoints($b = true) { $this->bIncludePolygonAsPoints = $b; } - function setIncludePolygonAsText($b = true) + public function setIncludePolygonAsText($b = true) { $this->bIncludePolygonAsText = $b; } - function setIncludePolygonAsGeoJSON($b = true) + public function setIncludePolygonAsGeoJSON($b = true) { $this->bIncludePolygonAsGeoJSON = $b; } - function setIncludePolygonAsKML($b = true) + public function setIncludePolygonAsKML($b = true) { $this->bIncludePolygonAsKML = $b; } - function setIncludePolygonAsSVG($b = true) + public function setIncludePolygonAsSVG($b = true) { $this->bIncludePolygonAsSVG = $b; } - function setPolygonSimplificationThreshold($f) + public function setPolygonSimplificationThreshold($f) { $this->fPolygonSimplificationThreshold = $f; } - function setLimit($iLimit = 10) + public function setLimit($iLimit = 10) { if ($iLimit > 50) $iLimit = 50; if ($iLimit < 1) $iLimit = 1; @@ -118,18 +121,18 @@ class Geocode $this->iLimit = $iLimit + min($iLimit, 10); } - function getExcludedPlaceIDs() + public function getExcludedPlaceIDs() { return $this->aExcludePlaceIDs; } - function getViewBoxString() + public function getViewBoxString() { if (!$this->aViewBox) return null; return $this->aViewBox[0].','.$this->aViewBox[3].','.$this->aViewBox[2].','.$this->aViewBox[1]; } - function setFeatureType($sFeatureType) + public function setFeatureType($sFeatureType) { switch ($sFeatureType) { case 'country': @@ -147,19 +150,19 @@ class Geocode } } - function setRankRange($iMin, $iMax) + public function setRankRange($iMin, $iMax) { $this->iMinAddressRank = $iMin; $this->iMaxAddressRank = $iMax; } - function setRoute($aRoutePoints, $fRouteWidth) + public function setRoute($aRoutePoints, $fRouteWidth) { $this->aViewBox = false; $this->sViewboxCentreSQL = "ST_SetSRID('LINESTRING("; $sSep = ''; - foreach ($this->aRoutePoints as $aPoint) { + foreach ($aRoutePoints as $aPoint) { $fPoint = (float)$aPoint; $this->sViewboxCentreSQL .= $sSep.$fPoint; $sSep = ($sSep == ' ') ? ',' : ' '; @@ -173,10 +176,20 @@ class Geocode $this->sViewboxLargeSQL .= ','.($fRouteWidth/30).')'; } - function setViewbox($aViewbox) + public function setViewbox($aViewbox) { $this->aViewBox = array_map('floatval', $aViewbox); + if ($this->aViewBox[0] < -180 + || $this->aViewBox[2] > 180 + || $this->aViewBox[0] >= $this->aViewBox[2] + || $this->aViewBox[1] < -90 + || $this->aViewBox[3] > 90 + || $this->aViewBox[1] >= $this->aViewBox[3] + ) { + userError("Bad parameter 'viewbox'. Out of range."); + } + $fHeight = $this->aViewBox[0] - $this->aViewBox[2]; $fWidth = $this->aViewBox[1] - $this->aViewBox[3]; $aBigViewBox[0] = $this->aViewBox[0] + $fHeight; @@ -189,24 +202,24 @@ class Geocode $this->sViewboxLargeSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".$aBigViewBox[0].",".$aBigViewBox[1]."),ST_Point(".$aBigViewBox[2].",".$aBigViewBox[3].")),4326)"; } - function setNearPoint($aNearPoint, $fRadiusDeg = 0.1) + public function setNearPoint($aNearPoint, $fRadiusDeg = 0.1) { $this->aNearPoint = array((float)$aNearPoint[0], (float)$aNearPoint[1], (float)$fRadiusDeg); } - function setQuery($sQueryString) + public function setQuery($sQueryString) { $this->sQuery = $sQueryString; $this->aStructuredQuery = false; } - function getQueryString() + public function getQueryString() { return $this->sQuery; } - function loadParamArray($oParams) + public function loadParamArray($oParams) { $this->bIncludeAddressDetails = $oParams->getBool('addressdetails', $this->bIncludeAddressDetails); @@ -249,16 +262,22 @@ class Geocode $aCountries[] = strtolower($sCountryCode); } } - if (isset($aCountryCodes)) + if (isset($aCountries)) $this->aCountryCodes = $aCountries; } $aViewbox = $oParams->getStringList('viewboxlbrt'); if ($aViewbox) { + if (count($aViewbox) != 4) { + userError("Bad parmater 'viewbox'. Expected 4 coordinates."); + } $this->setViewbox($aViewbox); } else { $aViewbox = $oParams->getStringList('viewbox'); if ($aViewbox) { + if (count($aViewbox) != 4) { + userError("Bad parmater 'viewbox'. Expected 4 coordinates."); + } $this->setViewBox(array( $aViewbox[0], $aViewbox[3], @@ -275,7 +294,7 @@ class Geocode } } - function setQueryFromParams($oParams) + public function setQueryFromParams($oParams) { // Search query $sQuery = $oParams->getString('q'); @@ -295,7 +314,7 @@ class Geocode } } - function loadStructuredAddressElement($sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues) + public function loadStructuredAddressElement($sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues) { $sValue = trim($sValue); if (!$sValue) return false; @@ -308,7 +327,7 @@ class Geocode return true; } - function setStructuredQuery($sAmentiy = false, $sStreet = false, $sCity = false, $sCounty = false, $sState = false, $sCountry = false, $sPostalCode = false) + public function setStructuredQuery($sAmentiy = false, $sStreet = false, $sCity = false, $sCounty = false, $sState = false, $sCountry = false, $sPostalCode = false) { $this->sQuery = false; @@ -336,7 +355,7 @@ class Geocode } } - function fallbackStructuredQuery() + public function fallbackStructuredQuery() { if (!$this->aStructuredQuery) return false; @@ -357,7 +376,7 @@ class Geocode return false; } - function getDetails($aPlaceIDs) + public function getDetails($aPlaceIDs) { //$aPlaceIDs is an array with key: placeID and value: tiger-housenumber, if found, else -1 if (sizeof($aPlaceIDs) == 0) return array(); @@ -488,7 +507,7 @@ class Geocode return $aSearchResults; } - function getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases) + public function getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases) { /* Calculate all searches using aValidTokens i.e. @@ -742,7 +761,7 @@ class Geocode */ - function lookup() + public function lookup() { if (!$this->sQuery && !$this->aStructuredQuery) return false; @@ -877,7 +896,7 @@ class Geocode foreach ($aPhrases as $iPhrase => $sPhrase) { $aPhrase = chksql( $this->oDB->getRow("select make_standard_name('".pg_escape_string($sPhrase)."') as string"), - "Cannot nomralize query string (is it an UTF-8 string?)" + "Cannot normalize query string (is it a UTF-8 string?)" ); if (trim($aPhrase['string'])) { $aPhrases[$iPhrase] = $aPhrase; @@ -1149,19 +1168,20 @@ class Geocode // TODO: filter out the pointless search terms (2 letter name tokens and less) // they might be right - but they are just too darned expensive to run if (sizeof($aSearch['aName'])) $aTerms[] = "name_vector @> ARRAY[".join($aSearch['aName'], ",")."]"; - if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]"; + //if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]"; if (sizeof($aSearch['aAddress']) && $aSearch['aName'] != $aSearch['aAddress']) { // For infrequent name terms disable index usage for address if (CONST_Search_NameOnlySearchFrequencyThreshold && sizeof($aSearch['aName']) == 1 && $aWordFrequencyScores[$aSearch['aName'][reset($aSearch['aName'])]] < CONST_Search_NameOnlySearchFrequencyThreshold ) { - $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]"; + //$aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]"; + $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddress'],",")."]"; } else { $aTerms[] = "nameaddress_vector @> ARRAY[".join($aSearch['aAddress'], ",")."]"; - if (sizeof($aSearch['aAddressNonSearch'])) { + /*if (sizeof($aSearch['aAddressNonSearch'])) { $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddressNonSearch'], ",")."]"; - } + }*/ } } if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'"; @@ -1477,6 +1497,7 @@ class Geocode if ($aLookup['place_id']) { $aSearchResults = $this->getDetails(array($aLookup['place_id'] => -1)); + $aResultPlaceIDs[$aLookup['place_id']] = -1; } else { $aSearchResults = array(); } @@ -1548,7 +1569,7 @@ class Geocode // getAddressDetails() is defined in lib.php and uses the SQL function get_addressdata in functions.sql $aResult['address'] = getAddressDetails($this->oDB, $sLanguagePrefArraySQL, $aResult['place_id'], $aResult['country_code'], $aResultPlaceIDs[$aResult['place_id']]); if ($aResult['extra_place'] == 'city' && !isset($aResult['address']['city'])) { - $aResult['address'] = array_merge(array('city' => array_shift(array_values($aResult['address']))), $aResult['address']); + $aResult['address'] = array_merge(array('city' => array_values($aResult['address'])[0]), $aResult['address']); } }