mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-03-11 13:24:07 +00:00
new method /lookup.php - Reverse search by multiple osm ids
This commit is contained in:
@@ -5,7 +5,8 @@
|
|||||||
echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
|
echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
|
||||||
echo ">\n";
|
echo ">\n";
|
||||||
|
|
||||||
echo "<searchresults";
|
echo "<";
|
||||||
|
echo (isset($sXmlRootTag)?$sXmlRootTag:'searchresults');
|
||||||
echo " timestamp='".date(DATE_RFC822)."'";
|
echo " timestamp='".date(DATE_RFC822)."'";
|
||||||
echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
|
echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
|
||||||
echo " querystring='".htmlspecialchars($sQuery, ENT_QUOTES)."'";
|
echo " querystring='".htmlspecialchars($sQuery, ENT_QUOTES)."'";
|
||||||
@@ -121,4 +122,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "</searchresults>";
|
echo "</" . (isset($sXmlRootTag)?$sXmlRootTag:'searchresults') . ">";
|
||||||
|
|||||||
@@ -100,6 +100,8 @@
|
|||||||
@define('CONST_Search_TryDroppedAddressTerms', false);
|
@define('CONST_Search_TryDroppedAddressTerms', false);
|
||||||
@define('CONST_Search_NameOnlySearchFrequencyThreshold', 500);
|
@define('CONST_Search_NameOnlySearchFrequencyThreshold', 500);
|
||||||
|
|
||||||
|
@define('CONST_Places_Max_ID_count', 50);
|
||||||
|
|
||||||
// Set to zero to disable polygon output
|
// Set to zero to disable polygon output
|
||||||
@define('CONST_PolygonOutput_MaximumTypes', 1);
|
@define('CONST_PolygonOutput_MaximumTypes', 1);
|
||||||
|
|
||||||
|
|||||||
17
tests/features/api/lookup.feature
Normal file
17
tests/features/api/lookup.feature
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Feature: Places by osm_type and osm_id Tests
|
||||||
|
Simple tests for internal server errors and response format.
|
||||||
|
|
||||||
|
@mtm
|
||||||
|
Scenario: address lookup for existing node, way, relation
|
||||||
|
When looking up xml places N158845944,W72493656,,R62422,X99,N0
|
||||||
|
Then the result is valid xml
|
||||||
|
exactly 3 results are returned
|
||||||
|
When looking up json places N158845944,W72493656,,R62422,X99,N0
|
||||||
|
Then the result is valid json
|
||||||
|
exactly 3 results are returned
|
||||||
|
|
||||||
|
@mtm
|
||||||
|
Scenario: address lookup for non-existing or invalid node, way, relation
|
||||||
|
When looking up xml places X99,,N0,nN158845944,ABC,,W9
|
||||||
|
Then the result is valid xml
|
||||||
|
exactly 0 results are returned
|
||||||
@@ -94,4 +94,4 @@ Feature: Simple Reverse Tests
|
|||||||
| 48.966.0 | 8.4482
|
| 48.966.0 | 8.4482
|
||||||
| 48.966 | 8.448.2
|
| 48.966 | 8.448.2
|
||||||
| Nan | 8.448
|
| Nan | 8.448
|
||||||
| 48.966 | Nan
|
| 48.966 | Nan
|
||||||
@@ -27,7 +27,7 @@ def _parse_xml():
|
|||||||
world.results = []
|
world.results = []
|
||||||
|
|
||||||
# results
|
# results
|
||||||
if page.nodeName == 'searchresults':
|
if page.nodeName == 'searchresults' or page.nodeName == 'lookupresults':
|
||||||
for node in page.childNodes:
|
for node in page.childNodes:
|
||||||
if node.nodeName != "#text":
|
if node.nodeName != "#text":
|
||||||
assert_equals(node.nodeName, 'place', msg="Unexpected element '%s'" % node.nodeName)
|
assert_equals(node.nodeName, 'place', msg="Unexpected element '%s'" % node.nodeName)
|
||||||
|
|||||||
@@ -123,6 +123,13 @@ def api_setup_details(step, obj):
|
|||||||
world.params['place_id'] = obj
|
world.params['place_id'] = obj
|
||||||
api_call('details')
|
api_call('details')
|
||||||
|
|
||||||
|
@step(u'looking up (\w+) places ((?:[a-z]\d+,*)+)')
|
||||||
|
def api_setup_lookup(step, fmt, ids):
|
||||||
|
world.params['osm_ids'] = ids
|
||||||
|
if fmt and fmt.strip():
|
||||||
|
world.params['format'] = fmt.strip()
|
||||||
|
api_call('lookup')
|
||||||
|
|
||||||
@step(u'sending an API call (\w+)')
|
@step(u'sending an API call (\w+)')
|
||||||
def api_general_call(step, call):
|
def api_general_call(step, call):
|
||||||
api_call(call)
|
api_call(call)
|
||||||
|
|||||||
@@ -710,6 +710,7 @@
|
|||||||
@symlink(CONST_BasePath.'/website/reverse.php', $sTargetDir.'/reverse.php');
|
@symlink(CONST_BasePath.'/website/reverse.php', $sTargetDir.'/reverse.php');
|
||||||
@symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/search.php');
|
@symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/search.php');
|
||||||
@symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/index.php');
|
@symlink(CONST_BasePath.'/website/search.php', $sTargetDir.'/index.php');
|
||||||
|
@symlink(CONST_BasePath.'/website/lookup.php', $sTargetDir.'/lookup.php');
|
||||||
@symlink(CONST_BasePath.'/website/deletable.php', $sTargetDir.'/deletable.php');
|
@symlink(CONST_BasePath.'/website/deletable.php', $sTargetDir.'/deletable.php');
|
||||||
@symlink(CONST_BasePath.'/website/polygons.php', $sTargetDir.'/polygons.php');
|
@symlink(CONST_BasePath.'/website/polygons.php', $sTargetDir.'/polygons.php');
|
||||||
@symlink(CONST_BasePath.'/website/status.php', $sTargetDir.'/status.php');
|
@symlink(CONST_BasePath.'/website/status.php', $sTargetDir.'/status.php');
|
||||||
|
|||||||
93
website/lookup.php
Executable file
93
website/lookup.php
Executable file
@@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
@define('CONST_ConnectionBucket_PageType', 'Reverse');
|
||||||
|
|
||||||
|
require_once(dirname(dirname(__FILE__)).'/lib/init-website.php');
|
||||||
|
require_once(CONST_BasePath.'/lib/log.php');
|
||||||
|
require_once(CONST_BasePath.'/lib/PlaceLookup.php');
|
||||||
|
|
||||||
|
if (strpos(CONST_BulkUserIPs, ','.$_SERVER["REMOTE_ADDR"].',') !== false)
|
||||||
|
{
|
||||||
|
$fLoadAvg = getLoadAverage();
|
||||||
|
if ($fLoadAvg > 2) sleep(60);
|
||||||
|
if ($fLoadAvg > 4) sleep(120);
|
||||||
|
if ($fLoadAvg > 6)
|
||||||
|
{
|
||||||
|
userError("Bulk User: Temporary block due to high server load");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$oDB =& getDB();
|
||||||
|
ini_set('memory_limit', '200M');
|
||||||
|
|
||||||
|
// Format for output
|
||||||
|
$sOutputFormat = 'xml';
|
||||||
|
if (isset($_GET['format']) && ($_GET['format'] == 'xml' || $_GET['format'] == 'json'))
|
||||||
|
{
|
||||||
|
$sOutputFormat = $_GET['format'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show address breakdown
|
||||||
|
$bShowAddressDetails = true;
|
||||||
|
if (isset($_GET['addressdetails'])) $bShowAddressDetails = (bool)$_GET['addressdetails'];
|
||||||
|
|
||||||
|
// Preferred language
|
||||||
|
$aLangPrefOrder = getPreferredLanguages();
|
||||||
|
|
||||||
|
$hLog = logStart($oDB, 'place', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
|
||||||
|
|
||||||
|
$aSearchResults = array();
|
||||||
|
if (isset($_GET['osm_ids']))
|
||||||
|
{
|
||||||
|
$oPlaceLookup = new PlaceLookup($oDB);
|
||||||
|
$oPlaceLookup->setLanguagePreference($aLangPrefOrder);
|
||||||
|
$oPlaceLookup->setIncludeAddressDetails($bShowAddressDetails);
|
||||||
|
|
||||||
|
$osm_ids = explode(',', $_GET['osm_ids']);
|
||||||
|
|
||||||
|
if ( count($osm_ids) > CONST_Places_Max_ID_count )
|
||||||
|
{
|
||||||
|
userError('Bulk User: Only ' . CONST_Places_Max_ID_count . " ids are allowed in one request.");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = '';
|
||||||
|
$id = 0;
|
||||||
|
foreach ($osm_ids AS $item)
|
||||||
|
{
|
||||||
|
// Skip empty items
|
||||||
|
if (empty($item)) continue;
|
||||||
|
|
||||||
|
$type = $item[0];
|
||||||
|
$id = (int) substr($item, 1);
|
||||||
|
if ( $id > 0 && ($type == 'N' || $type == 'W' || $type == 'R') )
|
||||||
|
{
|
||||||
|
$oPlaceLookup->setOSMID($type, $id);
|
||||||
|
$oPlace = $oPlaceLookup->lookup();
|
||||||
|
if ($oPlace){
|
||||||
|
// we want to use the search-* output templates, so we need to fill
|
||||||
|
// $aSearchResults and slightly change the (reverse search) oPlace
|
||||||
|
// key names
|
||||||
|
$oResult = $oPlace;
|
||||||
|
unset($oResult['aAddress']);
|
||||||
|
$oResult['address'] = $oPlace['aAddress'];
|
||||||
|
unset($oResult['langaddress']);
|
||||||
|
$oResult['name'] = $oPlace['langaddress'];
|
||||||
|
$aSearchResults[] = $oResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (CONST_Debug) exit;
|
||||||
|
|
||||||
|
$sXmlRootTag = 'lookupresults';
|
||||||
|
// we initialize these to avoid warnings in our logfile
|
||||||
|
$sQuery = '';
|
||||||
|
$sViewBox = '';
|
||||||
|
$bShowPolygons = '';
|
||||||
|
$aExcludePlaceIDs = [];
|
||||||
|
$sMoreURL = '';
|
||||||
|
|
||||||
|
include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');
|
||||||
Reference in New Issue
Block a user