X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/30511fd3ab9d731b0afec202386fc2425a0b1b9f..55629a48913d6e091247105cf52d6492574691f7:/lib/SearchContext.php diff --git a/lib/SearchContext.php b/lib/SearchContext.php index a6b63586..f5eab95a 100644 --- a/lib/SearchContext.php +++ b/lib/SearchContext.php @@ -16,10 +16,14 @@ require_once(CONST_BasePath.'/lib/lib.php'); class SearchContext { private $fNearRadius = false; - - // cached SQL + public $bViewboxBounded = false; public $sqlNear = ''; + public $sqlViewboxSmall = ''; + public $sqlViewboxLarge = ''; + public $sqlViewboxCentre = ''; + public $sqlCountryList = ''; + private $sqlExcludeList = ''; public function hasNearPoint() { @@ -37,6 +41,68 @@ class SearchContext $this->sqlNear = 'ST_SetSRID(ST_Point('.$fLon.','.$fLat.'),4326)'; } + public function isBoundedSearch() + { + return $this->hasNearPoint() || ($this->sqlViewboxSmall && $this->bViewboxBounded); + + } + + public function setViewboxFromBox(&$aViewBox, $bBounded) + { + $this->bViewboxBounded = $bBounded; + $this->sqlViewboxCentre = ''; + + $this->sqlViewboxSmall = sprintf( + 'ST_SetSRID(ST_MakeBox2D(ST_Point(%F,%F),ST_Point(%F,%F)),4326)', + $aViewBox[0], + $aViewBox[1], + $aViewBox[2], + $aViewBox[3] + ); + + $fHeight = $aViewBox[0] - $aViewBox[2]; + $fWidth = $aViewBox[1] - $aViewBox[3]; + + $this->sqlViewboxLarge = sprintf( + 'ST_SetSRID(ST_MakeBox2D(ST_Point(%F,%F),ST_Point(%F,%F)),4326)', + max($aViewBox[0], $aViewBox[2]) + $fHeight, + max($aViewBox[1], $aViewBox[3]) + $fWidth, + min($aViewBox[0], $aViewBox[2]) - $fHeight, + min($aViewBox[1], $aViewBox[3]) - $fWidth + ); + } + + public function setViewboxFromRoute(&$oDB, $aRoutePoints, $fRouteWidth, $bBounded) + { + $this->bViewboxBounded = $bBounded; + $this->sqlViewboxCentre = "ST_SetSRID('LINESTRING("; + $sSep = ''; + foreach ($aRoutePoints as $aPoint) { + $fPoint = (float)$aPoint; + $this->sqlViewboxCentre .= $sSep.$fPoint; + $sSep = ($sSep == ' ') ? ',' : ' '; + } + $this->sqlViewboxCentre .= ")'::geometry,4326)"; + + $sSQL = 'ST_BUFFER('.$this->sqlViewboxCentre.','.($fRouteWidth/69).')'; + $sGeom = chksql($oDB->getOne("select ".$sSQL), "Could not get small viewbox"); + $this->sqlViewboxSmall = "'".$sGeom."'::geometry"; + + $sSQL = 'ST_BUFFER('.$this->sqlViewboxCentre.','.($fRouteWidth/30).')'; + $sGeom = chksql($oDB->getOne("select ".$sSQL), "Could not get large viewbox"); + $this->sqlViewboxLarge = "'".$sGeom."'::geometry"; + } + + public function setExcludeList($aExcluded) + { + $this->sqlExcludeList = ' not in ('.join(',', $aExcluded).')'; + } + + public function setCountryList($aCountries) + { + $this->sqlCountryList = '('.join(',', array_map('addQuotes', $aCountries)).')'; + } + /** * Extract a coordinate point from a query string. * @@ -70,4 +136,27 @@ class SearchContext { return sprintf('ST_DWithin(%s, %s, %F)', $sObj, $this->sqlNear, $this->fNearRadius); } + + public function viewboxImportanceSQL($sObj) + { + $sSQL = ''; + + if ($this->sqlViewboxSmall) { + $sSQL = " * CASE WHEN ST_Contains($this->sqlViewboxSmall, $sObj) THEN 1 ELSE 0.5 END"; + } + if ($this->sqlViewboxLarge) { + $sSQL = " * CASE WHEN ST_Contains($this->sqlViewboxLarge, $sObj) THEN 1 ELSE 0.5 END"; + } + + return $sSQL; + } + + public function excludeSQL($sVariable) + { + if ($this->sqlExcludeList) { + return $sVariable.$this->sqlExcludeList; + } + + return ''; + } }