mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
handle pure lat,lon search by passing to reverse geocoding and returning first match as a search result
This commit is contained in:
@@ -183,7 +183,7 @@
|
||||
$_GET['nearlon'] = ($aData[6]=='E'?1:-1) * ($aData[4] + $aData[5]/60);
|
||||
$sQuery = trim(str_replace($aData[0], ' ', $sQuery));
|
||||
}
|
||||
elseif (preg_match('/(\\[|\\b)(-?[0-9]+[0-9.]*)[, ]+(-?[0-9]+[0-9.]*)(\\]|\\b])/', $sQuery, $aData))
|
||||
elseif (preg_match('/(\\[|\\b)(-?[0-9]+[0-9.]*)[, ]+(-?[0-9]+[0-9.]*)(\\]|\\b)/', $sQuery, $aData))
|
||||
{
|
||||
$_GET['nearlat'] = $aData[2];
|
||||
$_GET['nearlon'] = $aData[3];
|
||||
@@ -192,7 +192,6 @@
|
||||
|
||||
if ($sQuery)
|
||||
{
|
||||
|
||||
// Start with a blank search
|
||||
$aSearches = array(
|
||||
array('iSearchRank' => 0, 'iNamePhrase' => -1, 'sCountryCode' => false, 'aName'=>array(), 'aAddress'=>array(),
|
||||
@@ -983,6 +982,75 @@
|
||||
$aSearchResults = $oDB->getAll($sSQL);
|
||||
//var_dump($sSQL,$aSearchResults);exit;
|
||||
|
||||
if (PEAR::IsError($aSearchResults))
|
||||
{
|
||||
var_dump($sSQL, $aSearchResults);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
} // end if ($sQuery)
|
||||
else
|
||||
{
|
||||
if (isset($_GET['nearlat']) && trim($_GET['nearlat'])!=='' && isset($_GET['nearlon']) && trim($_GET['nearlon']) !== '')
|
||||
{
|
||||
$iPlaceID = geocodeReverse($_GET['nearlat'], $_GET['nearlon']);
|
||||
$aResultPlaceIDs = array($iPlaceID);
|
||||
|
||||
// TODO: this needs refactoring!
|
||||
|
||||
// Get the details for display (is this a redundant extra step?)
|
||||
$sPlaceIDs = join(',',$aResultPlaceIDs);
|
||||
$sOrderSQL = 'CASE ';
|
||||
foreach(array_keys($aResultPlaceIDs) as $iOrder => $iPlaceID)
|
||||
{
|
||||
$sOrderSQL .= 'when min(place_id) = '.$iPlaceID.' then '.$iOrder.' ';
|
||||
}
|
||||
$sOrderSQL .= ' ELSE 10000000 END';
|
||||
$sSQL = "select osm_type,osm_id,class,type,admin_level,rank_search,rank_address,min(place_id) as place_id,country_code,";
|
||||
$sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
|
||||
$sSQL .= "get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
|
||||
$sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
|
||||
$sSQL .= "avg(ST_X(ST_Centroid(geometry))) as lon,avg(ST_Y(ST_Centroid(geometry))) as lat, ";
|
||||
// $sSQL .= $sOrderSQL." as porder, ";
|
||||
$sSQL .= "coalesce(importance,0.9-(rank_search::float/30)) as importance ";
|
||||
$sSQL .= "from placex where place_id in ($sPlaceIDs) ";
|
||||
$sSQL .= "and placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
|
||||
$sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,country_code,importance";
|
||||
if (!$bDeDupe) $sSQL .= ",place_id";
|
||||
$sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) ";
|
||||
$sSQL .= ",get_name_by_language(name, $sLanguagePrefArraySQL) ";
|
||||
$sSQL .= ",get_name_by_language(name, ARRAY['ref']) ";
|
||||
$sSQL .= " union ";
|
||||
$sSQL .= "select 'T' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,";
|
||||
$sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
|
||||
$sSQL .= "null as placename,";
|
||||
$sSQL .= "null as ref,";
|
||||
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
|
||||
// $sSQL .= $sOrderSQL." as porder, ";
|
||||
$sSQL .= "-0.15 as importance ";
|
||||
$sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) ";
|
||||
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
|
||||
$sSQL .= "group by place_id";
|
||||
if (!$bDeDupe) $sSQL .= ",place_id";
|
||||
$sSQL .= " union ";
|
||||
$sSQL .= "select 'L' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,";
|
||||
$sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
|
||||
$sSQL .= "null as placename,";
|
||||
$sSQL .= "null as ref,";
|
||||
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
|
||||
// $sSQL .= $sOrderSQL." as porder, ";
|
||||
$sSQL .= "-0.10 as importance ";
|
||||
$sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
|
||||
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
|
||||
$sSQL .= "group by place_id";
|
||||
if (!$bDeDupe) $sSQL .= ",place_id";
|
||||
$sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) ";
|
||||
$sSQL .= "order by importance desc";
|
||||
// $sSQL .= "order by rank_search,rank_address,porder asc";
|
||||
if (CONST_Debug) var_dump('<hr>',$sSQL);
|
||||
$aSearchResults = $oDB->getAll($sSQL);
|
||||
//var_dump($sSQL,$aSearchResults);exit;
|
||||
|
||||
if (PEAR::IsError($aSearchResults))
|
||||
{
|
||||
var_dump($sSQL, $aSearchResults);
|
||||
@@ -995,6 +1063,8 @@
|
||||
$sSearchResult = '';
|
||||
if (!sizeof($aSearchResults) && isset($_GET['q']) && $_GET['q'])
|
||||
{
|
||||
echo "here";
|
||||
exit;
|
||||
$sSearchResult = 'No Results Found';
|
||||
}
|
||||
//var_Dump($aSearchResults);
|
||||
|
||||
Reference in New Issue
Block a user