Update entrances when entrance nodes are updated

This commit is contained in:
Emily Love Watson
2025-08-20 14:59:25 -05:00
parent 823ad5d279
commit e916d27b7c
10 changed files with 232 additions and 21 deletions

View File

@@ -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()

View File

@@ -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)

View File

@@ -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')

View File

@@ -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)