X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/47fdb33adf065b46df7104675e0251dd2ffb9bf4..c0d21d0bd3ec04d340c2e716a9f9482d36dff310:/website/search.php diff --git a/website/search.php b/website/search.php old mode 100755 new mode 100644 index d4004ddb..d2a1cc67 --- a/website/search.php +++ b/website/search.php @@ -1,211 +1,82 @@ setLanguagePreference($aLangPrefOrder); - - if (isset($aLangPrefOrder['name:de'])) $oGeocode->setReverseInPlan(true); - if (isset($aLangPrefOrder['name:ru'])) $oGeocode->setReverseInPlan(true); - if (isset($aLangPrefOrder['name:ja'])) $oGeocode->setReverseInPlan(true); - if (isset($aLangPrefOrder['name:pl'])) $oGeocode->setReverseInPlan(true); - - function loadParamsToGeocode($oGeocode, $aParams, $bBatch = false) - { - if (isset($aParams['addressdetails'])) $oGeocode->setIncludeAddressDetails((bool)$aParams['addressdetails']); - if (isset($aParams['bounded'])) $oGeocode->setBounded((bool)$aParams['bounded']); - if (isset($aParams['dedupe'])) $oGeocode->setDedupe((bool)$aParams['dedupe']); - - if (isset($aParams['limit'])) $oGeocode->setLimit((int)$aParams['limit']); - if (isset($aParams['offset'])) $oGeocode->setOffset((int)$aParams['offset']); - - if (isset($aParams['fallback'])) $oGeocode->setFallback((int)$aParams['fallback']); - - // List of excluded Place IDs - used for more acurate pageing - if (isset($aParams['exclude_place_ids']) && $aParams['exclude_place_ids']) - { - foreach(explode(',',$aParams['exclude_place_ids']) as $iExcludedPlaceID) - { - $iExcludedPlaceID = (int)$iExcludedPlaceID; - if ($iExcludedPlaceID) $aExcludePlaceIDs[$iExcludedPlaceID] = $iExcludedPlaceID; - } - $oGeocode->setExcludedPlaceIds($aExcludePlaceIDs); - } - - // Only certain ranks of feature - if (isset($aParams['featureType'])) $oGeocode->setFeatureType($aParams['featureType']); - if (isset($aParams['featuretype'])) $oGeocode->setFeatureType($aParams['featuretype']); - - // Country code list - if (isset($aParams['countrycodes'])) - { - $aCountryCodes = array(); - foreach(explode(',',$aParams['countrycodes']) as $sCountryCode) - { - if (preg_match('/^[a-zA-Z][a-zA-Z]$/', $sCountryCode)) - { - $aCountryCodes[] = strtolower($sCountryCode); - } - } - $oGeocode->setCountryCodesList($aCountryCodes); - } - - if (isset($aParams['viewboxlbrt']) && $aParams['viewboxlbrt']) - { - $aCoOrdinatesLBRT = explode(',',$aParams['viewboxlbrt']); - $oGeocode->setViewBox($aCoOrdinatesLBRT[0], $aCoOrdinatesLBRT[1], $aCoOrdinatesLBRT[2], $aCoOrdinatesLBRT[3]); - } - else if (isset($aParams['viewbox']) && $aParams['viewbox']) - { - $aCoOrdinatesLTRB = explode(',',$aParams['viewbox']); - $oGeocode->setViewBox($aCoOrdinatesLTRB[0], $aCoOrdinatesLTRB[3], $aCoOrdinatesLTRB[2], $aCoOrdinatesLTRB[1]); - } - - if (isset($aParams['route']) && $aParams['route'] && isset($aParams['routewidth']) && $aParams['routewidth']) - { - $aPoints = explode(',',$aParams['route']); - if (sizeof($aPoints) % 2 != 0) - { - userError("Uneven number of points"); - exit; - } - $fPrevCoord = false; - $aRoute = array(); - foreach($aPoints as $i => $fPoint) - { - if ($i%2) - { - $aRoute[] = array((float)$fPoint, $fPrevCoord); - } - else - { - $fPrevCoord = (float)$fPoint; - } - } - $oGeocode->setRoute($aRoute); - } - - // Search query - $sQuery = (isset($aParams['q'])?trim($aParams['q']):''); - if (!$sQuery && !$bBatch && isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'][0] == '/') - { - $sQuery = substr($_SERVER['PATH_INFO'], 1); - - // reverse order of '/' separated string - $aPhrases = explode('/', $sQuery); - $aPhrases = array_reverse($aPhrases); - $sQuery = join(', ',$aPhrases); - } - if (!$sQuery) - { - $oGeocode->setStructuredQuery(@$aParams['amenity'], @$aParams['street'], @$aParams['city'], @$aParams['county'], @$aParams['state'], @$aParams['country'], @$aParams['postalcode']); - $oGeocode->setReverseInPlan(false); - } - else - { - $oGeocode->setQuery($sQuery); - } - - } - - // Format for output - $sOutputFormat = 'html'; - if (isset($_GET['format']) && ($_GET['format'] == 'html' || $_GET['format'] == 'xml' || $_GET['format'] == 'json' || $_GET['format'] == 'jsonv2')) - { - $sOutputFormat = $_GET['format']; - } - - // Show / use polygons - if ($sOutputFormat == 'html') - { - if (isset($_GET['polygon'])) $oGeocode->setIncludePolygonAsText((bool)$_GET['polygon']); - } - else - { - $bAsPoints = (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 ( ( ($bAsGeoJSON?1:0) - + ($bAsKML?1:0) - + ($bAsSVG?1:0) - + ($bAsText?1:0) - + ($bAsPoints?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; - } - $oGeocode->setIncludePolygonAsPoints($bAsPoints); - $oGeocode->setIncludePolygonAsText($bAsText); - $oGeocode->setIncludePolygonAsGeoJSON($bAsGeoJSON); - $oGeocode->setIncludePolygonAsKML($bAsKML); - $oGeocode->setIncludePolygonAsSVG($bAsSVG); - } - - loadParamsToGeocode($oGeocode, $_GET, false); - - if (CONST_Search_BatchMode && isset($_GET['batch'])) - { - $aBatch = json_decode($_GET['batch'], true); - $aBatchResults = array(); - foreach($aBatch as $aBatchParams) - { - $oBatchGeocode = clone $oGeocode; - loadParamsToGeocode($oBatchGeocode, $aBatchParams, true); - $aSearchResults = $oBatchGeocode->lookup(); - $aBatchResults[] = $aSearchResults; - } - include(CONST_BasePath.'/lib/template/search-batch-json.php'); - exit; - } - - $hLog = logStart($oDB, 'search', $oGeocode->getQueryString(), $aLangPrefOrder); - - $aSearchResults = $oGeocode->lookup(); - if ($aSearchResults === false) $aSearchResults = array(); - - $sDataDate = $oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"); - - logEnd($oDB, $hLog, sizeof($aSearchResults)); - - $bAsText = $oGeocode->getIncludePolygonAsText(); - $sQuery = $oGeocode->getQueryString(); - $sViewBox = $oGeocode->getViewBoxString(); - $bShowPolygons = (isset($_GET['polygon']) && $_GET['polygon']); - $aExcludePlaceIDs = $oGeocode->getExcludedPlaceIDs(); - - $sMoreURL = CONST_Website_BaseURL.'search?format='.urlencode($sOutputFormat).'&exclude_place_ids='.join(',',$oGeocode->getExcludedPlaceIDs()); - if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) $sMoreURL .= '&accept-language='.$_SERVER["HTTP_ACCEPT_LANGUAGE"]; - if ($bShowPolygons) $sMoreURL .= '&polygon=1'; - if ($oGeocode->getIncludeAddressDetails()) $sMoreURL .= '&addressdetails=1'; - if ($sViewBox) $sMoreURL .= '&viewbox='.urlencode($sViewBox); - if (isset($_GET['nearlat']) && isset($_GET['nearlon'])) $sMoreURL .= '&nearlat='.(float)$_GET['nearlat'].'&nearlon='.(float)$_GET['nearlon']; - $sMoreURL .= '&q='.urlencode($sQuery); - - if (CONST_Debug) exit; - - include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php'); + +require_once(CONST_BasePath.'/lib/init-website.php'); +require_once(CONST_BasePath.'/lib/log.php'); +require_once(CONST_BasePath.'/lib/Geocode.php'); +require_once(CONST_BasePath.'/lib/output.php'); +ini_set('memory_limit', '200M'); + +$oDB = new Nominatim\DB(); +$oDB->connect(); +$oParams = new Nominatim\ParameterParser(); + +$oGeocode = new Nominatim\Geocode($oDB); + +$aLangPrefOrder = $oParams->getPreferredLanguages(); +$oGeocode->setLanguagePreference($aLangPrefOrder); + +if (CONST_Search_ReversePlanForAll + || isset($aLangPrefOrder['name:de']) + || isset($aLangPrefOrder['name:ru']) + || isset($aLangPrefOrder['name:ja']) + || isset($aLangPrefOrder['name:pl']) +) { + $oGeocode->setReverseInPlan(true); +} + +// Format for output +$sOutputFormat = $oParams->getSet('format', array('xml', 'json', 'jsonv2', 'geojson', 'geocodejson'), 'jsonv2'); +set_exception_handler_by_format($sOutputFormat); + +$oGeocode->loadParamArray($oParams, null); + +if (CONST_Search_BatchMode && isset($_GET['batch'])) { + $aBatch = json_decode($_GET['batch'], true); + $aBatchResults = array(); + foreach ($aBatch as $aBatchParams) { + $oBatchGeocode = clone $oGeocode; + $oBatchParams = new Nominatim\ParameterParser($aBatchParams); + $oBatchGeocode->loadParamArray($oBatchParams); + $oBatchGeocode->setQueryFromParams($oBatchParams); + $aSearchResults = $oBatchGeocode->lookup(); + $aBatchResults[] = $aSearchResults; + } + include(CONST_BasePath.'/lib/template/search-batch-json.php'); + exit; +} + +$oGeocode->setQueryFromParams($oParams); + +if (!$oGeocode->getQueryString() + && isset($_SERVER['PATH_INFO']) + && strlen($_SERVER['PATH_INFO']) > 0 + && $_SERVER['PATH_INFO'][0] == '/' +) { + $sQuery = substr(rawurldecode($_SERVER['PATH_INFO']), 1); + + // reverse order of '/' separated string + $aPhrases = explode('/', $sQuery); + $aPhrases = array_reverse($aPhrases); + $sQuery = join(', ', $aPhrases); + $oGeocode->setQuery($sQuery); +} + +$hLog = logStart($oDB, 'search', $oGeocode->getQueryString(), $aLangPrefOrder); + +$aSearchResults = $oGeocode->lookup(); + +logEnd($oDB, $hLog, count($aSearchResults)); + +$sQuery = $oGeocode->getQueryString(); + +$aMoreParams = $oGeocode->getMoreUrlParams(); +$aMoreParams['format'] = $sOutputFormat; +if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + $aMoreParams['accept-language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE']; +} +$sMoreURL = CONST_Website_BaseURL.'search.php?'.http_build_query($aMoreParams); + +if (CONST_Debug) exit; + +$sOutputTemplate = ($sOutputFormat == 'jsonv2') ? 'json' : $sOutputFormat; +include(CONST_BasePath.'/lib/template/search-'.$sOutputTemplate.'.php');