X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/41249377d25c9c0df1855c6750f9b9e21a16a650..92f86de938fcb2fb18b22531bf491512e5b8c190:/lib/PlaceLookup.php diff --git a/lib/PlaceLookup.php b/lib/PlaceLookup.php index 7620ac0d..c94121f8 100644 --- a/lib/PlaceLookup.php +++ b/lib/PlaceLookup.php @@ -11,6 +11,7 @@ class PlaceLookup protected $aLangPrefOrderSql = "''"; protected $bAddressDetails = false; + protected $bAddressAdminLevels = false; protected $bExtraTags = false; protected $bNameDetails = false; @@ -42,6 +43,11 @@ class PlaceLookup $this->bIncludePolygonAsPoints = $b; } + public function setAddressAdminLevels($b = true) + { + $this->bAddressAdminLevels = $b; + } + public function loadParamArray($oParams, $sGeomType = null) { $aLangs = $oParams->getPreferredLanguages(); @@ -54,17 +60,21 @@ class PlaceLookup $this->bDeDupe = $oParams->getBool('dedupe', $this->bDeDupe); - if ($sGeomType === null || $sGeomType == 'text') { - $this->bIncludePolygonAsText = $oParams->getBool('polygon_text'); - } if ($sGeomType === null || $sGeomType == 'geojson') { $this->bIncludePolygonAsGeoJSON = $oParams->getBool('polygon_geojson'); + $this->bIncludePolygonAsPoints = false; } - if ($sGeomType === null || $sGeomType == 'kml') { - $this->bIncludePolygonAsKML = $oParams->getBool('polygon_kml'); - } - if ($sGeomType === null || $sGeomType == 'svg') { - $this->bIncludePolygonAsSVG = $oParams->getBool('polygon_svg'); + + if ($oParams->getString('format', '') !== 'geojson') { + if ($sGeomType === null || $sGeomType == 'text') { + $this->bIncludePolygonAsText = $oParams->getBool('polygon_text'); + } + if ($sGeomType === null || $sGeomType == 'kml') { + $this->bIncludePolygonAsKML = $oParams->getBool('polygon_kml'); + } + if ($sGeomType === null || $sGeomType == 'svg') { + $this->bIncludePolygonAsSVG = $oParams->getBool('polygon_svg'); + } } $this->fPolygonSimplificationThreshold = $oParams->getFloat('polygon_threshold', 0.0); @@ -429,6 +439,13 @@ class PlaceLookup ); } + if ($this->bAddressAdminLevels) { + $aPlace['aAddressAdminLevels'] = $this->getAddressAdminLevels( + $aPlace['place_id'], + $aPlace['housenumber'] + ); + } + if ($this->bExtraTags) { if ($aPlace['extra']) { $aPlace['sExtraTags'] = json_decode($aPlace['extra']); @@ -514,6 +531,35 @@ class PlaceLookup return $aAddress; } + /* "Downing Street, London" + * [ + * "level15" => "Covent Garden", + * "level8" => "Westminster", + * "level6" => "London", + * "level5" => "Greater London", + * "level4" => "England", + * "level2" => "United Kingdom" + * ] + */ + + public function getAddressAdminLevels($iPlaceID, $sHousenumber = null) + { + $aAddressLines = $this->getAddressDetails( + $iPlaceID, + true, + $sHousenumber === null ? -1 : $sHousenumber + ); + + $aAddress = array(); + foreach ($aAddressLines as $aLine) { + if (isset($aLine['admin_level']) + && $aLine['admin_level'] < 15 + && !isset($aAddress['level'.$aLine['admin_level']])) { + $aAddress['level'.$aLine['admin_level']] = $aLine['localname']; + } + } + return $aAddress; + } /* returns an array which will contain the keys @@ -538,14 +584,8 @@ class PlaceLookup // Get the bounding box and outline polygon $sSQL = 'select place_id,0 as numfeatures,st_area(geometry) as area,'; if ($fLonReverse != null && $fLatReverse != null) { - $sSQL .= ' CASE WHEN (class = \'highway\') AND (ST_GeometryType(geometry) = \'ST_LineString\') THEN'; - $sSQL .= ' ST_Y(closest_point)'; - $sSQL .= ' ELSE ST_Y(centroid) '; - $sSQL .= ' END as centrelat, '; - $sSQL .= ' CASE WHEN (class = \'highway\') AND (ST_GeometryType(geometry) = \'ST_LineString\') THEN'; - $sSQL .= ' ST_X(closest_point)'; - $sSQL .= ' ELSE ST_X(centroid) '; - $sSQL .= ' END as centrelon, '; + $sSQL .= ' ST_Y(closest_point) as centrelat,'; + $sSQL .= ' ST_X(closest_point) as centrelon,'; } else { $sSQL .= ' ST_Y(centroid) as centrelat, ST_X(centroid) as centrelon,'; } @@ -556,11 +596,13 @@ class PlaceLookup if ($this->bIncludePolygonAsSVG) $sSQL .= ',ST_AsSVG(geometry) as assvg'; if ($this->bIncludePolygonAsText || $this->bIncludePolygonAsPoints) $sSQL .= ',ST_AsText(geometry) as astext'; if ($fLonReverse != null && $fLatReverse != null) { - $sFrom = ' from (SELECT * , ST_ClosestPoint(geometry, ST_SetSRID(ST_Point('.$fLatReverse.','.$fLonReverse.'),4326)) AS closest_point'; + $sFrom = ' from (SELECT * , CASE WHEN (class = \'highway\') AND (ST_GeometryType(geometry) = \'ST_LineString\') THEN '; + $sFrom .=' ST_ClosestPoint(geometry, ST_SetSRID(ST_Point('.$fLatReverse.','.$fLonReverse.'),4326))'; + $sFrom .=' ELSE centroid END AS closest_point'; + $sFrom .= ' from placex where place_id = '.$iPlaceID.') as plx'; } else { - $sFrom = $sFrom = ' from placex where place_id = '.$iPlaceID; + $sFrom = ' from placex where place_id = '.$iPlaceID; } - $sFrom .= ' from placex where place_id = '.$iPlaceID.') as plx'; if ($this->fPolygonSimplificationThreshold > 0) { $sSQL .= ' from (select place_id,centroid,ST_SimplifyPreserveTopology(geometry,'.$this->fPolygonSimplificationThreshold.') as geometry'.$sFrom.') as plx'; } else {