From: Brian Quinion Date: Thu, 23 Jan 2014 14:40:37 +0000 (+0000) Subject: nominatim fallback mode for structured queries X-Git-Tag: v2.2.0~18 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/47fdb33adf065b46df7104675e0251dd2ffb9bf4 nominatim fallback mode for structured queries --- diff --git a/lib/Geocode.php b/lib/Geocode.php index 16c40f52..d5612240 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; @@ -117,6 +118,11 @@ $this->iOffset = $iOffset; } + function setFallback($bFallback = true) + { + $this->bFallback = (bool)$bFallback; + } + function setExcludedPlaceIDs($a) { // TODO: force to int @@ -213,6 +219,11 @@ { $this->sQuery = false; + // Reset + $this->iMinAddressRank = 0; + $this->iMaxAddressRank = 30; + $this->aAddressRankList = array(); + $this->aStructuredQuery = array(); $this->sAllowedTypesSQLList = ''; @@ -232,7 +243,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) @@ -1374,6 +1407,14 @@ // No results? Done if (!sizeof($aSearchResults)) { + if ($this->bFallback) + { + if ($this->fallbackStructuredQuery()) + { + return $this->lookup(); + } + } + return array(); } diff --git a/website/search.php b/website/search.php index 7e96e10e..d4004ddb 100755 --- a/website/search.php +++ b/website/search.php @@ -34,6 +34,8 @@ if (isset($aParams['limit'])) $oGeocode->setLimit((int)$aParams['limit']); if (isset($aParams['offset'])) $oGeocode->setOffset((int)$aParams['offset']); + if (isset($aParams['fallback'])) $oGeocode->setFallback((int)$aParams['fallback']); + // List of excluded Place IDs - used for more acurate pageing if (isset($aParams['exclude_place_ids']) && $aParams['exclude_place_ids']) {