X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/24e7ffb289fcc7e7f76a0a18ea17259ef07f7a01..2f547325007dccf17ccfcfd309c18c2f41147772:/nominatim/api/lookup.py diff --git a/nominatim/api/lookup.py b/nominatim/api/lookup.py index 27706ff3..3952d4b8 100644 --- a/nominatim/api/lookup.py +++ b/nominatim/api/lookup.py @@ -8,6 +8,7 @@ Implementation of place lookup by ID. """ from typing import Optional +import datetime as dt import sqlalchemy as sa @@ -46,8 +47,7 @@ async def find_in_placex(conn: SearchConnection, place: ntyp.PlaceRef, t.c.importance, t.c.wikipedia, t.c.indexed_date, t.c.parent_place_id, t.c.rank_address, t.c.rank_search, t.c.linked_place_id, - sa.func.ST_X(t.c.centroid).label('x'), - sa.func.ST_Y(t.c.centroid).label('y'), + t.c.centroid, _select_column_geometry(t.c.geometry, details.geometry_output)) if isinstance(place, ntyp.PlaceID): @@ -76,8 +76,7 @@ async def find_in_osmline(conn: SearchConnection, place: ntyp.PlaceRef, sql = sa.select(t.c.place_id, t.c.osm_id, t.c.parent_place_id, t.c.indexed_date, t.c.startnumber, t.c.endnumber, t.c.step, t.c.address, t.c.postcode, t.c.country_code, - sa.func.ST_X(sa.func.ST_Centroid(t.c.linegeo)).label('x'), - sa.func.ST_Y(sa.func.ST_Centroid(t.c.linegeo)).label('y'), + t.c.linegeo.ST_Centroid().label('centroid'), _select_column_geometry(t.c.linegeo, details.geometry_output)) if isinstance(place, ntyp.PlaceID): @@ -106,8 +105,7 @@ async def find_in_tiger(conn: SearchConnection, place: ntyp.PlaceRef, sql = sa.select(t.c.place_id, t.c.parent_place_id, t.c.startnumber, t.c.endnumber, t.c.step, t.c.postcode, - sa.func.ST_X(sa.func.ST_Centroid(t.c.linegeo)).label('x'), - sa.func.ST_Y(sa.func.ST_Centroid(t.c.linegeo)).label('y'), + t.c.linegeo.ST_Centroid().label('centroid'), _select_column_geometry(t.c.linegeo, details.geometry_output)) if isinstance(place, ntyp.PlaceID): @@ -128,8 +126,7 @@ async def find_in_postcode(conn: SearchConnection, place: ntyp.PlaceRef, sql = sa.select(t.c.place_id, t.c.parent_place_id, t.c.rank_search, t.c.rank_address, t.c.indexed_date, t.c.postcode, t.c.country_code, - sa.func.ST_X(t.c.geometry).label('x'), - sa.func.ST_Y(t.c.geometry).label('y'), + t.c.geometry.label('centroid'), _select_column_geometry(t.c.geometry, details.geometry_output)) if isinstance(place, ntyp.PlaceID): @@ -141,7 +138,7 @@ async def find_in_postcode(conn: SearchConnection, place: ntyp.PlaceRef, async def get_place_by_id(conn: SearchConnection, place: ntyp.PlaceRef, - details: ntyp.LookupDetails) -> Optional[nres.SearchResult]: + details: ntyp.LookupDetails) -> Optional[nres.DetailedResult]: """ Retrieve a place with additional details from the database. """ log().function('get_place_by_id', place=place, details=details) @@ -150,32 +147,36 @@ async def get_place_by_id(conn: SearchConnection, place: ntyp.PlaceRef, raise ValueError("lookup only supports geojosn polygon output.") row = await find_in_placex(conn, place, details) + log().var_dump('Result (placex)', row) if row is not None: - result = nres.create_from_placex_row(row) - log().var_dump('Result', result) - await nres.add_result_details(conn, result, details) - return result - - row = await find_in_osmline(conn, place, details) - if row is not None: - result = nres.create_from_osmline_row(row) - log().var_dump('Result', result) - await nres.add_result_details(conn, result, details) - return result - - row = await find_in_postcode(conn, place, details) - if row is not None: - result = nres.create_from_postcode_row(row) - log().var_dump('Result', result) - await nres.add_result_details(conn, result, details) - return result - - row = await find_in_tiger(conn, place, details) - if row is not None: - result = nres.create_from_tiger_row(row) - log().var_dump('Result', result) - await nres.add_result_details(conn, result, details) - return result - - # Nothing found under this ID. - return None + result = nres.create_from_placex_row(row, nres.DetailedResult) + else: + row = await find_in_osmline(conn, place, details) + log().var_dump('Result (osmline)', row) + if row is not None: + result = nres.create_from_osmline_row(row, nres.DetailedResult) + else: + row = await find_in_postcode(conn, place, details) + log().var_dump('Result (postcode)', row) + if row is not None: + result = nres.create_from_postcode_row(row, nres.DetailedResult) + else: + row = await find_in_tiger(conn, place, details) + log().var_dump('Result (tiger)', row) + if row is not None: + result = nres.create_from_tiger_row(row, nres.DetailedResult) + else: + return None + + # add missing details + assert result is not None + result.parent_place_id = row.parent_place_id + result.linked_place_id = getattr(row, 'linked_place_id', None) + result.admin_level = getattr(row, 'admin_level', 15) + indexed_date = getattr(row, 'indexed_date', None) + if indexed_date is not None: + result.indexed_date = indexed_date.replace(tzinfo=dt.timezone.utc) + + await nres.add_result_details(conn, result, details) + + return result