mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
add lookup call to server glue
This commit is contained in:
@@ -32,5 +32,7 @@ from .results import (SourceTable as SourceTable,
|
||||
WordInfos as WordInfos,
|
||||
DetailedResult as DetailedResult,
|
||||
ReverseResult as ReverseResult,
|
||||
ReverseResults as ReverseResults)
|
||||
ReverseResults as ReverseResults,
|
||||
SearchResult as SearchResult,
|
||||
SearchResults as SearchResults)
|
||||
from .localization import (Locales as Locales)
|
||||
|
||||
@@ -195,3 +195,36 @@ def _format_reverse_jsonv2(results: napi.ReverseResults,
|
||||
options: Mapping[str, Any]) -> str:
|
||||
return format_json.format_base_json(results, options, True,
|
||||
class_label='category')
|
||||
|
||||
|
||||
@dispatch.format_func(napi.SearchResults, 'xml')
|
||||
def _format_reverse_xml(results: napi.SearchResults, options: Mapping[str, Any]) -> str:
|
||||
return format_xml.format_base_xml(results,
|
||||
options, False, 'searchresults',
|
||||
{'querystring': 'TODO'})
|
||||
|
||||
|
||||
@dispatch.format_func(napi.SearchResults, 'geojson')
|
||||
def _format_reverse_geojson(results: napi.SearchResults,
|
||||
options: Mapping[str, Any]) -> str:
|
||||
return format_json.format_base_geojson(results, options, False)
|
||||
|
||||
|
||||
@dispatch.format_func(napi.SearchResults, 'geocodejson')
|
||||
def _format_reverse_geocodejson(results: napi.SearchResults,
|
||||
options: Mapping[str, Any]) -> str:
|
||||
return format_json.format_base_geocodejson(results, options, False)
|
||||
|
||||
|
||||
@dispatch.format_func(napi.SearchResults, 'json')
|
||||
def _format_reverse_json(results: napi.SearchResults,
|
||||
options: Mapping[str, Any]) -> str:
|
||||
return format_json.format_base_json(results, options, False,
|
||||
class_label='class')
|
||||
|
||||
|
||||
@dispatch.format_func(napi.SearchResults, 'jsonv2')
|
||||
def _format_reverse_jsonv2(results: napi.SearchResults,
|
||||
options: Mapping[str, Any]) -> str:
|
||||
return format_json.format_base_json(results, options, False,
|
||||
class_label='category')
|
||||
|
||||
@@ -249,7 +249,7 @@ def format_base_geocodejson(results: napi.ReverseResults,
|
||||
out.keyval('osm_key', result.category[0])\
|
||||
.keyval('osm_value', result.category[1])\
|
||||
.keyval('type', GEOCODEJSON_RANKS[max(3, min(28, result.rank_address))])\
|
||||
.keyval_not_none('accuracy', result.distance, transform=int)\
|
||||
.keyval_not_none('accuracy', getattr(result, 'distance', None), transform=int)\
|
||||
.keyval('label', ', '.join(label_parts))\
|
||||
.keyval_not_none('name', result.names, transform=locales.display_name)\
|
||||
|
||||
|
||||
@@ -226,6 +226,30 @@ class ASGIAdaptor(abc.ABC):
|
||||
return fmt
|
||||
|
||||
|
||||
def parse_geometry_details(self, fmt: str) -> napi.LookupDetails:
|
||||
details = napi.LookupDetails(address_details=True,
|
||||
geometry_simplification=self.get_float('polygon_threshold', 0.0))
|
||||
numgeoms = 0
|
||||
if self.get_bool('polygon_geojson', False):
|
||||
details.geometry_output |= napi.GeometryFormat.GEOJSON
|
||||
numgeoms += 1
|
||||
if fmt not in ('geojson', 'geocodejson'):
|
||||
if self.get_bool('polygon_text', False):
|
||||
details.geometry_output |= napi.GeometryFormat.TEXT
|
||||
numgeoms += 1
|
||||
if self.get_bool('polygon_kml', False):
|
||||
details.geometry_output |= napi.GeometryFormat.KML
|
||||
numgeoms += 1
|
||||
if self.get_bool('polygon_svg', False):
|
||||
details.geometry_output |= napi.GeometryFormat.SVG
|
||||
numgeoms += 1
|
||||
|
||||
if numgeoms > self.config().get_int('POLYGON_OUTPUT_MAX_TYPES'):
|
||||
self.raise_error('Too many polgyon output options selected.')
|
||||
|
||||
return details
|
||||
|
||||
|
||||
async def status_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any:
|
||||
""" Server glue for /status endpoint. See API docs for details.
|
||||
"""
|
||||
@@ -291,28 +315,10 @@ async def reverse_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) ->
|
||||
debug = params.setup_debugging()
|
||||
coord = napi.Point(params.get_float('lon'), params.get_float('lat'))
|
||||
locales = napi.Locales.from_accept_languages(params.get_accepted_languages())
|
||||
details = params.parse_geometry_details(fmt)
|
||||
|
||||
zoom = max(0, min(18, params.get_int('zoom', 18)))
|
||||
|
||||
details = napi.LookupDetails(address_details=True,
|
||||
geometry_simplification=params.get_float('polygon_threshold', 0.0))
|
||||
numgeoms = 0
|
||||
if params.get_bool('polygon_geojson', False):
|
||||
details.geometry_output |= napi.GeometryFormat.GEOJSON
|
||||
numgeoms += 1
|
||||
if fmt not in ('geojson', 'geocodejson'):
|
||||
if params.get_bool('polygon_text', False):
|
||||
details.geometry_output |= napi.GeometryFormat.TEXT
|
||||
numgeoms += 1
|
||||
if params.get_bool('polygon_kml', False):
|
||||
details.geometry_output |= napi.GeometryFormat.KML
|
||||
numgeoms += 1
|
||||
if params.get_bool('polygon_svg', False):
|
||||
details.geometry_output |= napi.GeometryFormat.SVG
|
||||
numgeoms += 1
|
||||
|
||||
if numgeoms > params.config().get_int('POLYGON_OUTPUT_MAX_TYPES'):
|
||||
params.raise_error('Too many polgyon output options selected.')
|
||||
|
||||
result = await api.reverse(coord, REVERSE_MAX_RANKS[zoom],
|
||||
params.get_layers() or
|
||||
@@ -326,9 +332,6 @@ async def reverse_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) ->
|
||||
'extratags': params.get_bool('extratags', False),
|
||||
'namedetails': params.get_bool('namedetails', False),
|
||||
'addressdetails': params.get_bool('addressdetails', True)}
|
||||
if fmt == 'xml':
|
||||
fmt_options['xml_roottag'] = 'reversegeocode'
|
||||
fmt_options['xml_extra_info'] = {'querystring': 'TODO'}
|
||||
|
||||
output = formatting.format_result(napi.ReverseResults([result] if result else []),
|
||||
fmt, fmt_options)
|
||||
@@ -336,6 +339,37 @@ async def reverse_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) ->
|
||||
return params.build_response(output)
|
||||
|
||||
|
||||
async def lookup_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any:
|
||||
""" Server glue for /lookup endpoint. See API docs for details.
|
||||
"""
|
||||
fmt = params.parse_format(napi.SearchResults, 'xml')
|
||||
debug = params.setup_debugging()
|
||||
locales = napi.Locales.from_accept_languages(params.get_accepted_languages())
|
||||
details = params.parse_geometry_details(fmt)
|
||||
|
||||
places = []
|
||||
for oid in params.get('osm_ids', '').split(','):
|
||||
oid = oid.strip()
|
||||
if len(oid) > 1 and oid[0] in 'RNWrnw' and oid[1:].isdigit():
|
||||
places.append(napi.OsmID(oid[0], int(oid[1:])))
|
||||
|
||||
if places:
|
||||
results = await api.lookup(places, details)
|
||||
else:
|
||||
results = napi.SearchResults()
|
||||
|
||||
if debug:
|
||||
return params.build_response(loglib.get_and_disable())
|
||||
|
||||
fmt_options = {'locales': locales,
|
||||
'extratags': params.get_bool('extratags', False),
|
||||
'namedetails': params.get_bool('namedetails', False),
|
||||
'addressdetails': params.get_bool('addressdetails', True)}
|
||||
|
||||
output = formatting.format_result(results, fmt, fmt_options)
|
||||
|
||||
return params.build_response(output)
|
||||
|
||||
EndpointFunc = Callable[[napi.NominatimAPIAsync, ASGIAdaptor], Any]
|
||||
|
||||
REVERSE_MAX_RANKS = [2, 2, 2, # 0-2 Continent/Sea
|
||||
@@ -357,5 +391,6 @@ REVERSE_MAX_RANKS = [2, 2, 2, # 0-2 Continent/Sea
|
||||
ROUTES = [
|
||||
('status', status_endpoint),
|
||||
('details', details_endpoint),
|
||||
('reverse', reverse_endpoint)
|
||||
('reverse', reverse_endpoint),
|
||||
('lookup', lookup_endpoint)
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user