move zoom_to_rank computation to extra file

This commit is contained in:
Sarah Hoffmann
2023-05-18 18:29:41 +02:00
parent d9d8b9c526
commit 32dbf83747
3 changed files with 35 additions and 20 deletions

View File

@@ -0,0 +1,31 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This file is part of Nominatim. (https://nominatim.org)
#
# Copyright (C) 2023 by the Nominatim developer community.
# For a full list of authors see the git log.
"""
Helper function for parsing parameters and and outputting data
specifically for the v1 version of the API.
"""
REVERSE_MAX_RANKS = [2, 2, 2, # 0-2 Continent/Sea
4, 4, # 3-4 Country
8, # 5 State
10, 10, # 6-7 Region
12, 12, # 8-9 County
16, 17, # 10-11 City
18, # 12 Town
19, # 13 Village/Suburb
22, # 14 Hamlet/Neighbourhood
25, # 15 Localities
26, # 16 Major Streets
27, # 17 Minor Streets
30 # 18 Building
]
def zoom_to_rank(zoom: int) -> int:
""" Convert a zoom parameter into a rank according to the v1 API spec.
"""
return REVERSE_MAX_RANKS[max(0, min(18, zoom))]

View File

@@ -17,6 +17,7 @@ from nominatim.config import Configuration
import nominatim.api as napi import nominatim.api as napi
import nominatim.api.logging as loglib import nominatim.api.logging as loglib
from nominatim.api.v1.format import dispatch as formatting from nominatim.api.v1.format import dispatch as formatting
from nominatim.api.v1 import helpers
CONTENT_TYPE = { CONTENT_TYPE = {
'text': 'text/plain; charset=utf-8', 'text': 'text/plain; charset=utf-8',
@@ -319,10 +320,9 @@ async def reverse_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) ->
debug = params.setup_debugging() debug = params.setup_debugging()
coord = napi.Point(params.get_float('lon'), params.get_float('lat')) coord = napi.Point(params.get_float('lon'), params.get_float('lat'))
locales = napi.Locales.from_accept_languages(params.get_accepted_languages()) locales = napi.Locales.from_accept_languages(params.get_accepted_languages())
zoom = max(0, min(18, params.get_int('zoom', 18)))
details = params.parse_geometry_details(fmt) details = params.parse_geometry_details(fmt)
details['max_rank'] = REVERSE_MAX_RANKS[zoom] details['max_rank'] = helpers.zoom_to_rank(params.get_int('zoom', 18))
details['layers'] = params.get_layers() details['layers'] = params.get_layers()
result = await api.reverse(coord, **details) result = await api.reverse(coord, **details)
@@ -374,22 +374,6 @@ async def lookup_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A
EndpointFunc = Callable[[napi.NominatimAPIAsync, ASGIAdaptor], Any] EndpointFunc = Callable[[napi.NominatimAPIAsync, ASGIAdaptor], Any]
REVERSE_MAX_RANKS = [2, 2, 2, # 0-2 Continent/Sea
4, 4, # 3-4 Country
8, # 5 State
10, 10, # 6-7 Region
12, 12, # 8-9 County
16, 17, # 10-11 City
18, # 12 Town
19, # 13 Village/Suburb
22, # 14 Hamlet/Neighbourhood
25, # 15 Localities
26, # 16 Major Streets
27, # 17 Minor Streets
30 # 18 Building
]
ROUTES = [ ROUTES = [
('status', status_endpoint), ('status', status_endpoint),
('details', details_endpoint), ('details', details_endpoint),

View File

@@ -18,7 +18,7 @@ from nominatim.errors import UsageError
from nominatim.clicmd.args import NominatimArgs from nominatim.clicmd.args import NominatimArgs
import nominatim.api as napi import nominatim.api as napi
import nominatim.api.v1 as api_output import nominatim.api.v1 as api_output
from nominatim.api.v1.server_glue import REVERSE_MAX_RANKS from nominatim.api.v1.helpers import zoom_to_rank
# Do not repeat documentation of subcommand classes. # Do not repeat documentation of subcommand classes.
# pylint: disable=C0111 # pylint: disable=C0111
@@ -164,7 +164,7 @@ class APIReverse:
api = napi.NominatimAPI(args.project_dir) api = napi.NominatimAPI(args.project_dir)
result = api.reverse(napi.Point(args.lon, args.lat), result = api.reverse(napi.Point(args.lon, args.lat),
max_rank=REVERSE_MAX_RANKS[max(0, min(18, args.zoom or 18))], max_rank=zoom_to_rank(args.zoom or 18),
layers=args.get_layers(napi.DataLayer.ADDRESS | napi.DataLayer.POI), layers=args.get_layers(napi.DataLayer.ADDRESS | napi.DataLayer.POI),
address_details=True, # needed for display name address_details=True, # needed for display name
geometry_output=args.get_geometry_output(), geometry_output=args.get_geometry_output(),