X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/104722a56a4773eae275b25987b4d340f19d35bb..8f299838f756045e2340a38d56a5dfe99d3f6196:/nominatim/api/v1/format.py?ds=sidebyside diff --git a/nominatim/api/v1/format.py b/nominatim/api/v1/format.py index 3643af83..ad635e39 100644 --- a/nominatim/api/v1/format.py +++ b/nominatim/api/v1/format.py @@ -13,6 +13,7 @@ import collections import nominatim.api as napi from nominatim.api.result_formatting import FormatDispatcher from nominatim.api.v1.classtypes import ICONS +from nominatim.api.v1 import format_json, format_xml from nominatim.utils.json_writer import JsonWriter dispatch = FormatDispatcher() @@ -45,7 +46,7 @@ def _add_address_row(writer: JsonWriter, row: napi.AddressLine, locales: napi.Locales) -> None: writer.start_object()\ .keyval('localname', locales.display_name(row.names))\ - .keyval('place_id', row.place_id) + .keyval_not_none('place_id', row.place_id) if row.osm_object is not None: writer.keyval('osm_id', row.osm_object[1])\ @@ -92,16 +93,16 @@ def _add_parent_rows_grouped(writer: JsonWriter, rows: napi.AddressLines, writer.end_object().next() -@dispatch.format_func(napi.SearchResult, 'details-json') -def _format_search_json(result: napi.SearchResult, options: Mapping[str, Any]) -> str: +@dispatch.format_func(napi.DetailedResult, 'json') +def _format_details_json(result: napi.DetailedResult, options: Mapping[str, Any]) -> str: locales = options.get('locales', napi.Locales()) geom = result.geometry.get('geojson') - centroid = result.centroid_as_geojson() + centroid = result.centroid.to_geojson() out = JsonWriter() out.start_object()\ - .keyval('place_id', result.place_id)\ - .keyval('parent_place_id', result.parent_place_id) + .keyval_not_none('place_id', result.place_id)\ + .keyval_not_none('parent_place_id', result.parent_place_id) if result.osm_object is not None: out.keyval('osm_type', result.osm_object[0])\ @@ -110,17 +111,17 @@ def _format_search_json(result: napi.SearchResult, options: Mapping[str, Any]) - out.keyval('category', result.category[0])\ .keyval('type', result.category[1])\ .keyval('admin_level', result.admin_level)\ - .keyval('localname', locales.display_name(result.names))\ - .keyval('names', result.names or [])\ - .keyval('addresstags', result.address or [])\ - .keyval('housenumber', result.housenumber)\ - .keyval('calculated_postcode', result.postcode)\ - .keyval('country_code', result.country_code)\ + .keyval('localname', result.locale_name or '')\ + .keyval('names', result.names or {})\ + .keyval('addresstags', result.address or {})\ + .keyval_not_none('housenumber', result.housenumber)\ + .keyval_not_none('calculated_postcode', result.postcode)\ + .keyval_not_none('country_code', result.country_code)\ .keyval_not_none('indexed_date', result.indexed_date, lambda v: v.isoformat())\ - .keyval('importance', result.importance)\ + .keyval_not_none('importance', result.importance)\ .keyval('calculated_importance', result.calculated_importance())\ - .keyval('extratags', result.extratags or [])\ - .keyval('calculated_wikipedia', result.wikipedia)\ + .keyval('extratags', result.extratags or {})\ + .keyval_not_none('calculated_wikipedia', result.wikipedia)\ .keyval('rank_address', result.rank_address)\ .keyval('rank_search', result.rank_search)\ .keyval('isarea', 'Polygon' in (geom or result.geometry.get('type') or ''))\ @@ -161,3 +162,73 @@ def _format_search_json(result: napi.SearchResult, options: Mapping[str, Any]) - out.end_object() return out() + + +@dispatch.format_func(napi.ReverseResults, 'xml') +def _format_reverse_xml(results: napi.ReverseResults, options: Mapping[str, Any]) -> str: + return format_xml.format_base_xml(results, + options, True, 'reversegeocode', + {'querystring': options.get('query', '')}) + + +@dispatch.format_func(napi.ReverseResults, 'geojson') +def _format_reverse_geojson(results: napi.ReverseResults, + options: Mapping[str, Any]) -> str: + return format_json.format_base_geojson(results, options, True) + + +@dispatch.format_func(napi.ReverseResults, 'geocodejson') +def _format_reverse_geocodejson(results: napi.ReverseResults, + options: Mapping[str, Any]) -> str: + return format_json.format_base_geocodejson(results, options, True) + + +@dispatch.format_func(napi.ReverseResults, 'json') +def _format_reverse_json(results: napi.ReverseResults, + options: Mapping[str, Any]) -> str: + return format_json.format_base_json(results, options, True, + class_label='class') + + +@dispatch.format_func(napi.ReverseResults, 'jsonv2') +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_search_xml(results: napi.SearchResults, options: Mapping[str, Any]) -> str: + extra = {'querystring': options.get('query', '')} + for attr in ('more_url', 'exclude_place_ids', 'viewbox'): + if options.get(attr): + extra[attr] = options[attr] + return format_xml.format_base_xml(results, options, False, 'searchresults', + extra) + + + +@dispatch.format_func(napi.SearchResults, 'geojson') +def _format_search_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_search_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_search_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_search_jsonv2(results: napi.SearchResults, + options: Mapping[str, Any]) -> str: + return format_json.format_base_json(results, options, False, + class_label='category')