X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/ab3b556144a90efa93841d4c57f0fe5250aaf2bb..a88527b2a02359086e99599e5324934bb9e73338:/lib/NearPoint.php diff --git a/lib/NearPoint.php b/lib/NearPoint.php index 6a0e7598..4f0531d9 100644 --- a/lib/NearPoint.php +++ b/lib/NearPoint.php @@ -13,6 +13,7 @@ class NearPoint private $sSQL; + public function __construct($lat, $lon, $radius = 0.1) { $this->fLat = (float)$lat; @@ -21,11 +22,20 @@ class NearPoint $this->sSQL = 'ST_SetSRID(ST_Point('.$this->fLon.','.$this->fLat.'),4326)'; } - public function lat() { return $this->fLat; } + public function lat() + { + return $this->fLat; + } - public function lon() { return $this->fLon; } + public function lon() + { + return $this->fLon; + } - public function radius() { return $this->fRadius; } + public function radius() + { + return $this->fRadius; + } public function distanceSQL($sObj) { @@ -34,17 +44,13 @@ class NearPoint public function withinSQL($sObj) { - return sprintf( - 'ST_DWithin(%S, ST_SetSRID(ST_Point(%F,%F),4326), %F)', - $sObj, - $this->fLon, - $this->fLat, - $this->fRadius - ); + return sprintf('ST_DWithin(%s, %s, %F)', $sObj, $this->sSQL, $this->fRadius); } /** * Check that the coordinates are valid WSG84 coordinates. + * + * @return bool True if the coordinates are correctly bounded. */ public function isValid() { @@ -59,6 +65,12 @@ class NearPoint * * If a coordinate is found an array of a new NearPoint and the * remaining query is returned or false otherwise. + * + * @param string $sQuery Query to scan. + * + * @return array|false If a coordinate was found, an array with + * `pt` as the NearPoint coordinates and `query` + * with the remaining query string. False otherwiese. */ public static function extractFromQuery($sQuery) { @@ -121,8 +133,8 @@ class NearPoint $sFound = $aData[0]; $fQueryLat = ($aData[2]=='N'?1:-1) * ($aData[1]); $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[3]); - } elseif (preg_match('/(\\[|^|\\b)(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData)) { - /* 1 2 3 4 + } elseif (preg_match('/(\\[|^|\\b)?(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData)) { + /* 1 2 3 4 * degrees decimal * 12.34, 56.78 * [12.456,-78.90] @@ -131,16 +143,15 @@ class NearPoint $fQueryLat = $aData[2]; $fQueryLon = $aData[3]; } else { - return False; + return false; } $oPt = new NearPoint($fQueryLat, $fQueryLon); - if (!$oPt->isValid()) return False; + if (!$oPt->isValid()) return false; $sQuery = trim(str_replace($sFound, ' ', $sQuery)); return array('pt' => $oPt, 'query' => $sQuery); } - }