X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/2b6a163ef9799a7bd03862da7e504e59f32184b9..8d96e87b930c835ffc4c7f1cbf9ebee7283c4129:/website/search.php diff --git a/website/search.php b/website/search.php index 3272aff3..c7171f98 100755 --- a/website/search.php +++ b/website/search.php @@ -17,10 +17,11 @@ $sSuggestion = $sSuggestionURL = false; $bDeDupe = isset($_GET['dedupe'])?(bool)$_GET['dedupe']:true; $bReverseInPlan = false; - $iLimit = isset($_GET['limit'])?(int)$_GET['limit']:10; + $iFinalLimit = isset($_GET['limit'])?(int)$_GET['limit']:10; $iOffset = isset($_GET['offset'])?(int)$_GET['offset']:0; $iMaxRank = 20; - if ($iLimit > 100) $iLimit = 100; + if ($iFinalLimit > 50) $iFinalLimit = 50; + $iLimit = $iFinalLimit + min($iFinalLimit, 10); $iMinAddressRank = 0; $iMaxAddressRank = 30; @@ -32,22 +33,30 @@ // Show / use polygons $bShowPolygons = (boolean)isset($_GET['polygon']) && $_GET['polygon']; - $bAsGeoJSON = (boolean)isset($_GET['polygon_geojson']) && $_GET['polygon_geojson']; - $bAsKML = (boolean)isset($_GET['polygon_kml']) && $_GET['polygon_kml']; - $bAsSVG = (boolean)isset($_GET['polygon_svg']) && $_GET['polygon_svg']; - $bAsText = (boolean)isset($_GET['polygon_text']) && $_GET['polygon_text']; - if ((($bShowPolygons?1:0) - + ($bAsGeoJSON?1:0) - + ($bAsKML?1:0) - + ($bAsSVG?1:0) - + ($bAsText?1:0) - ) > CONST_PolygonOutput_MaximumTypes) { - if (CONST_PolygonOutput_MaximumTypes) { - userError("Select only ".CONST_PolygonOutput_MaximumTypes." polgyon output option"); - } else { - userError("Polygon output is disabled"); + if ($sOutputFormat == 'html') { + $bAsText = $bShowPolygons; + $bShowPolygons = false; + $bAsGeoJSON = false; + $bAsKML = false; + $bAsSVG = false; + } else { + $bAsGeoJSON = (boolean)isset($_GET['polygon_geojson']) && $_GET['polygon_geojson']; + $bAsKML = (boolean)isset($_GET['polygon_kml']) && $_GET['polygon_kml']; + $bAsSVG = (boolean)isset($_GET['polygon_svg']) && $_GET['polygon_svg']; + $bAsText = (boolean)isset($_GET['polygon_text']) && $_GET['polygon_text']; + if ((($bShowPolygons?1:0) + + ($bAsGeoJSON?1:0) + + ($bAsKML?1:0) + + ($bAsSVG?1:0) + + ($bAsText?1:0) + ) > CONST_PolygonOutput_MaximumTypes) { + if (CONST_PolygonOutput_MaximumTypes) { + userError("Select only ".CONST_PolygonOutput_MaximumTypes." polgyon output option"); + } else { + userError("Polygon output is disabled"); + } + exit; } - exit; } // Show address breakdown @@ -856,7 +865,7 @@ else $sSQL .= " limit ".$iLimit; - if (CONST_Debug) var_dump($sSQL); + if (CONST_Debug) { var_dump($sSQL); } $aViewBoxPlaceIDs = $oDB->getAll($sSQL); if (PEAR::IsError($aViewBoxPlaceIDs)) { @@ -931,7 +940,7 @@ { $sPlaceIDs = join(',',$aPlaceIDs); - $aResultPlaceIDs = array(); + $aClassPlaceIDs = array(); if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'name') { @@ -941,7 +950,7 @@ if ($sCountryCodesSQL) $sSQL .= " and country_code in ($sCountryCodesSQL)"; $sSQL .= " order by rank_search asc limit $iLimit"; if (CONST_Debug) var_dump($sSQL); - $aResultPlaceIDs = $oDB->getCol($sSQL); + $aClassPlaceIDs = $oDB->getCol($sSQL); } if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'near') // & in @@ -959,9 +968,9 @@ if ($iMaxRank < 9 && $bCacheTable) { // Try and get a polygon to search in instead - $sSQL = "select geometry from placex where place_id in ($sPlaceIDs) and rank_search < $iMaxRank + 5 and st_geometrytype(geometry) in ('ST_Polygon','ST_MultiPolygon') order by rank_search asc limit 1"; - if (CONST_Debug) var_dump($sSQL); - $sPlaceGeom = $oDB->getOne($sSQL); + $sSQL = "select geometry from placex where place_id in ($sPlaceIDs) and rank_search < $iMaxRank + 5 and st_geometrytype(geometry) in ('ST_Polygon','ST_MultiPolygon') order by rank_search asc limit 1"; + if (CONST_Debug) var_dump($sSQL); + $sPlaceGeom = $oDB->getOne($sSQL); } if ($sPlaceGeom) @@ -1012,7 +1021,7 @@ if ($iOffset) $sSQL .= " offset $iOffset"; $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); - $aResultPlaceIDs = array_merge($aResultPlaceIDs, $oDB->getCol($sSQL)); + $aClassPlaceIDs = array_merge($aClassPlaceIDs, $oDB->getCol($sSQL)); } else { @@ -1034,12 +1043,12 @@ if ($iOffset) $sSQL .= " offset $iOffset"; $sSQL .= " limit $iLimit"; if (CONST_Debug) var_dump($sSQL); - $aResultPlaceIDs = array_merge($aResultPlaceIDs, $oDB->getCol($sSQL)); + $aClassPlaceIDs = array_merge($aClassPlaceIDs, $oDB->getCol($sSQL)); } } } - $aPlaceIDs = $aResultPlaceIDs; + $aPlaceIDs = $aClassPlaceIDs; } @@ -1058,6 +1067,7 @@ } if ($iQueryLoop > 20) break; } + //exit; if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs)) break; if ($iGroupLoop > 4) break; @@ -1228,8 +1238,7 @@ if ($bAsGeoJSON) $sSQL .= ",ST_AsGeoJSON(geometry) as asgeojson"; if ($bAsKML) $sSQL .= ",ST_AsKML(geometry) as askml"; if ($bAsSVG) $sSQL .= ",ST_AsSVG(geometry) as assvg"; - if ($bAsText) $sSQL .= ",ST_AsText(geometry) as astext"; - if ($bShowPolygons) $sSQL .= ",ST_AsText(geometry) as outlinestring"; + if ($bAsText || $bShowPolygons) $sSQL .= ",ST_AsText(geometry) as astext"; $sSQL .= " from placex where place_id = ".$aResult['place_id'].' and st_geometrytype(Box2D(geometry)) = \'ST_Polygon\''; $aPointPolygon = $oDB->getRow($sSQL); if (PEAR::IsError($aPointPolygon)) @@ -1250,15 +1259,15 @@ if ($bShowPolygons) { // Translate geometary string to point array - if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['outlinestring'],$aMatch)) + if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['astext'],$aMatch)) { preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER); } - elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#',$aPointPolygon['outlinestring'],$aMatch)) + elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#',$aPointPolygon['astext'],$aMatch)) { preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER); } - elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#',$aPointPolygon['outlinestring'],$aMatch)) + elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#',$aPointPolygon['astext'],$aMatch)) { $fRadius = 0.01; $iSteps = ($fRadius * 40000)^2; @@ -1410,7 +1419,7 @@ } // Absolute limit on number of results - if (sizeof($aSearchResults) >= $iLimit) break; + if (sizeof($aSearchResults) >= $iFinalLimit) break; } $sDataDate = $oDB->getOne("select TO_CHAR(lastimportdate - '1 day'::interval,'YYYY/MM/DD') from import_status limit 1");