mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 05:18:00 +00:00
Update entrances when entrance nodes are updated
This commit is contained in:
@@ -196,8 +196,8 @@ def _format_details_json(result: DetailedResult, options: Mapping[str, Any]) ->
|
||||
else:
|
||||
_add_address_rows(out, 'hierarchy', result.parented_rows, locales)
|
||||
|
||||
if result.entrances is not None:
|
||||
out.keyval('entrances', result.entrances)
|
||||
if options.get('entrances', False):
|
||||
format_json.write_entrances(out, result.entrances)
|
||||
|
||||
out.end_object()
|
||||
|
||||
|
||||
@@ -7,11 +7,12 @@
|
||||
"""
|
||||
Helper functions for output of results in json formats.
|
||||
"""
|
||||
from typing import Mapping, Any, Optional, Tuple, Union
|
||||
from typing import Mapping, Any, Optional, Tuple, Union, List
|
||||
|
||||
from ..utils.json_writer import JsonWriter
|
||||
from ..results import AddressLines, ReverseResults, SearchResults
|
||||
from . import classtypes as cl
|
||||
from ..types import EntranceDetails
|
||||
|
||||
|
||||
def _write_osm_id(out: JsonWriter, osm_object: Optional[Tuple[str, int]]) -> None:
|
||||
@@ -64,6 +65,28 @@ def _write_geocodejson_address(out: JsonWriter,
|
||||
out.keyval('country_code', country_code)
|
||||
|
||||
|
||||
def write_entrances(out: JsonWriter, entrances: Optional[List[EntranceDetails]]) -> None:
|
||||
if entrances is None:
|
||||
out.keyval('entrances', None)
|
||||
return
|
||||
|
||||
out.key('entrances')\
|
||||
.start_array()
|
||||
|
||||
for entrance in entrances:
|
||||
out.start_object()\
|
||||
.keyval('osm_id', entrance.osm_id)\
|
||||
.keyval('type', entrance.type)\
|
||||
.keyval('lat', f"{entrance.lat:0.7f}")\
|
||||
.keyval('lon', f"{entrance.lon:0.7f}")
|
||||
|
||||
if entrance.extratags:
|
||||
out.keyval('extratags', entrance.extratags)
|
||||
out.end_object().next()
|
||||
|
||||
out.end_array().next()
|
||||
|
||||
|
||||
def format_base_json(results: Union[ReverseResults, SearchResults],
|
||||
options: Mapping[str, Any], simple: bool,
|
||||
class_label: str) -> str:
|
||||
@@ -107,8 +130,8 @@ def format_base_json(results: Union[ReverseResults, SearchResults],
|
||||
_write_typed_address(out, result.address_rows, result.country_code)
|
||||
out.end_object().next()
|
||||
|
||||
if options.get('entrances', False) and result.entrances:
|
||||
out.keyval('entrances', result.entrances)
|
||||
if options.get('entrances', False):
|
||||
write_entrances(out, result.entrances)
|
||||
|
||||
if options.get('extratags', False):
|
||||
out.keyval('extratags', result.extratags)
|
||||
@@ -184,7 +207,7 @@ def format_base_geojson(results: Union[ReverseResults, SearchResults],
|
||||
out.end_object().next()
|
||||
|
||||
if options.get('entrances', False):
|
||||
out.keyval('entrances', result.entrances)
|
||||
write_entrances(out, result.entrances)
|
||||
|
||||
if options.get('extratags', False):
|
||||
out.keyval('extratags', result.extratags)
|
||||
@@ -258,7 +281,7 @@ def format_base_geocodejson(results: Union[ReverseResults, SearchResults],
|
||||
out.end_object().next()
|
||||
|
||||
if options.get('entrances', False):
|
||||
out.keyval('entrances', result.entrances)
|
||||
write_entrances(out, result.entrances)
|
||||
|
||||
if options.get('extratags', False):
|
||||
out.keyval('extra', result.extratags)
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
Helper functions for output of results in XML format.
|
||||
"""
|
||||
from typing import Mapping, Any, Optional, Union
|
||||
import dataclasses
|
||||
import datetime as dt
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from ..results import AddressLines, ReverseResult, ReverseResults, \
|
||||
SearchResult, SearchResults
|
||||
from . import classtypes as cl
|
||||
from ..types import EntranceDetails
|
||||
|
||||
|
||||
def _write_xml_address(root: ET.Element, address: AddressLines,
|
||||
@@ -83,6 +83,18 @@ def _create_base_entry(result: Union[ReverseResult, SearchResult],
|
||||
return place
|
||||
|
||||
|
||||
def _create_entrance(root: ET.Element, entrance: EntranceDetails) -> None:
|
||||
entrance_node = ET.SubElement(root, 'entrance', attrib={
|
||||
"osm_id": str(entrance.osm_id),
|
||||
"type": entrance.type,
|
||||
"lat": f"{entrance.lat:0.7f}",
|
||||
"lon": f"{entrance.lon:0.7f}",
|
||||
})
|
||||
if entrance.extratags:
|
||||
for k, v in entrance.extratags.items():
|
||||
ET.SubElement(entrance_node, 'tag', attrib={'key': k, 'value': v})
|
||||
|
||||
|
||||
def format_base_xml(results: Union[ReverseResults, SearchResults],
|
||||
options: Mapping[str, Any],
|
||||
simple: bool, xml_root_tag: str,
|
||||
@@ -126,7 +138,7 @@ def format_base_xml(results: Union[ReverseResults, SearchResults],
|
||||
if options.get('entrances', False):
|
||||
eroot = ET.SubElement(root if simple else place, 'entrances')
|
||||
if result.entrances:
|
||||
for entrance_detail in result.entrances:
|
||||
ET.SubElement(eroot, 'entrance', attrib=dataclasses.asdict(entrance_detail))
|
||||
for entrance in result.entrances:
|
||||
_create_entrance(eroot, entrance)
|
||||
|
||||
return '<?xml version="1.0" encoding="UTF-8" ?>\n' + ET.tostring(root, encoding='unicode')
|
||||
|
||||
@@ -180,7 +180,9 @@ async def details_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:
|
||||
result, fmt,
|
||||
{'locales': locales,
|
||||
'group_hierarchy': params.get_bool('group_hierarchy', False),
|
||||
'icon_base_url': params.config().MAPICON_URL})
|
||||
'icon_base_url': params.config().MAPICON_URL,
|
||||
'entrances': params.get_bool('entrances', False),
|
||||
})
|
||||
|
||||
return build_response(params, output, num_results=1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user