X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/2723553593f2c52ebf981d958942cc473f3db7e3..a2cf6db61be508bb1f23e78f87e4eaa109f62c62:/lib-php/PlaceLookup.php?ds=sidebyside diff --git a/lib-php/PlaceLookup.php b/lib-php/PlaceLookup.php index 715f1ced..895a30df 100644 --- a/lib-php/PlaceLookup.php +++ b/lib-php/PlaceLookup.php @@ -86,7 +86,7 @@ class PlaceLookup ($this->bIncludePolygonAsSVG ? 1 : 0); if ($iWantedTypes > CONST_PolygonOutput_MaximumTypes) { if (CONST_PolygonOutput_MaximumTypes) { - userError('Select only '.CONST_PolygonOutput_MaximumTypes.' polgyon output option'); + userError('Select only '.CONST_PolygonOutput_MaximumTypes.' polygon output option'); } else { userError('Polygon output is disabled'); } @@ -187,12 +187,12 @@ class PlaceLookup return null; } - $aResults = $this->lookup(array($iPlaceID => new Result($iPlaceID))); + $aResults = $this->lookup(array($iPlaceID => new Result($iPlaceID)), 0, 30, true); return empty($aResults) ? null : reset($aResults); } - public function lookup($aResults, $iMinRank = 0, $iMaxRank = 30) + public function lookup($aResults, $iMinRank = 0, $iMaxRank = 30, $bAllowLinked = false) { Debug::newFunction('Place lookup'); @@ -247,7 +247,9 @@ class PlaceLookup if ($this->sAllowedTypesSQLList) { $sSQL .= 'AND placex.class in '.$this->sAllowedTypesSQLList; } - $sSQL .= ' AND linked_place_id is null '; + if (!$bAllowLinked) { + $sSQL .= ' AND linked_place_id is null '; + } $sSQL .= ' GROUP BY '; $sSQL .= ' osm_type, '; $sSQL .= ' osm_id, '; @@ -445,7 +447,7 @@ class PlaceLookup if ($this->bExtraTags) { if ($aPlace['extra']) { - $aPlace['sExtraTags'] = json_decode($aPlace['extra']); + $aPlace['sExtraTags'] = json_decode($aPlace['extra'], true); } else { $aPlace['sExtraTags'] = (object) array(); } @@ -482,7 +484,7 @@ class PlaceLookup return (object) array(); } - $aFullNames = json_decode($sNames); + $aFullNames = json_decode($sNames, true); $aNames = array(); foreach ($aFullNames as $sKey => $sValue) { @@ -522,12 +524,7 @@ 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 .= ' 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,'; - } + $sSQL .= ' ST_Y(centroid) as centrelat, ST_X(centroid) as centrelon,'; $sSQL .= ' ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,'; $sSQL .= ' ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon'; if ($this->bIncludePolygonAsGeoJSON) { @@ -542,19 +539,21 @@ class PlaceLookup if ($this->bIncludePolygonAsText) { $sSQL .= ',ST_AsText(geometry) as astext'; } + + $sSQL .= ' FROM (SELECT place_id'; if ($fLonReverse != null && $fLatReverse != null) { - $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'; + $sSQL .= ',CASE WHEN (class = \'highway\') AND (ST_GeometryType(geometry) = \'ST_LineString\') THEN '; + $sSQL .=' ST_ClosestPoint(geometry, ST_SetSRID(ST_Point('.$fLatReverse.','.$fLonReverse.'),4326))'; + $sSQL .=' ELSE centroid END AS centroid'; } else { - $sFrom = ' from placex where place_id = '.$iPlaceID; + $sSQL .= ',centroid'; } if ($this->fPolygonSimplificationThreshold > 0) { - $sSQL .= ' from (select place_id,centroid,ST_SimplifyPreserveTopology(geometry,'.$this->fPolygonSimplificationThreshold.') as geometry'.$sFrom.') as plx'; + $sSQL .= ',ST_SimplifyPreserveTopology(geometry,'.$this->fPolygonSimplificationThreshold.') as geometry'; } else { - $sSQL .= $sFrom; + $sSQL .= ',geometry'; } + $sSQL .= ' FROM placex where place_id = '.$iPlaceID.') as plx'; $aPointPolygon = $this->oDB->getRow($sSQL, null, 'Could not get outline');