X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/08eff3c482ce1c7479b4b1b5548276a56f9cffba..cf35f1931887e8d3548393d2c04e1bb8cf643e0c:/lib/Geocode.php?ds=sidebyside diff --git a/lib/Geocode.php b/lib/Geocode.php index 48518dd3..132be9a5 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -20,6 +20,7 @@ protected $iLimit = 20; protected $iFinalLimit = 10; protected $iOffset = 0; + protected $bFallback = false; protected $aCountryCodes = false; protected $aNearPoint = false; @@ -118,6 +119,11 @@ $this->iOffset = $iOffset; } + function setFallback($bFallback = true) + { + $this->bFallback = (bool)$bFallback; + } + function setExcludedPlaceIDs($a) { // TODO: force to int @@ -214,6 +220,11 @@ { $this->sQuery = false; + // Reset + $this->iMinAddressRank = 0; + $this->iMaxAddressRank = 30; + $this->aAddressRankList = array(); + $this->aStructuredQuery = array(); $this->sAllowedTypesSQLList = ''; @@ -233,7 +244,29 @@ $sAllowedTypesSQLList = '(\'place\',\'boundary\')'; } } + } + function fallbackStructuredQuery() + { + if (!$this->aStructuredQuery) return false; + + $aParams = $this->aStructuredQuery; + + if (sizeof($aParams) == 1) return false; + + $aOrderToFallback = array('postalcode', 'street', 'city', 'county', 'state'); + + foreach($aOrderToFallback as $sType) + { + if (isset($aParams[$sType])) + { + unset($aParams[$sType]); + $this->setStructuredQuery(@$aParams['amenity'], @$aParams['street'], @$aParams['city'], @$aParams['county'], @$aParams['state'], @$aParams['country'], @$aParams['postalcode']); + return true; + } + } + + return false; } function getDetails($aPlaceIDs) @@ -384,11 +417,12 @@ if ($this->aRoutePoints) { $sViewboxCentreSQL = "ST_SetSRID('LINESTRING("; - $bFirst = false; - foreach($this->aRouteaPoints as $aPoint) + $bFirst = true; + foreach($this->aRoutePoints as $aPoint) { if (!$bFirst) $sViewboxCentreSQL .= ","; $sViewboxCentreSQL .= $aPoint[1].' '.$aPoint[0]; + $bFirst = false; } $sViewboxCentreSQL .= ")'::geometry,4326)"; @@ -1410,6 +1444,14 @@ // No results? Done if (!sizeof($aSearchResults)) { + if ($this->bFallback) + { + if ($this->fallbackStructuredQuery()) + { + return $this->lookup(); + } + } + return array(); }