X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/6ef4d04b46c4461db9a571f5c8b0c72d34cd9335..474d4230b88033c48ff284d58223cbc632213b85:/nominatim/api/lookup.py diff --git a/nominatim/api/lookup.py b/nominatim/api/lookup.py index 82352702..402b8531 100644 --- a/nominatim/api/lookup.py +++ b/nominatim/api/lookup.py @@ -38,6 +38,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, + t.c.geometry.ST_Expand(0).label('bbox'), t.c.centroid) if isinstance(place, ntyp.PlaceID): @@ -76,8 +77,8 @@ async def find_in_osmline(conn: SearchConnection, place: ntyp.PlaceRef, sql = sql.where(t.c.osm_id == place.osm_id).limit(1) if place.osm_class and place.osm_class.isdigit(): sql = sql.order_by(sa.func.greatest(0, - sa.func.least(int(place.osm_class) - t.c.endnumber), - t.c.startnumber - int(place.osm_class))) + int(place.osm_class) - t.c.endnumber, + t.c.startnumber - int(place.osm_class))) else: return None @@ -162,11 +163,10 @@ async def get_detailed_place(conn: SearchConnection, place: ntyp.PlaceRef, if details.geometry_output & ntyp.GeometryFormat.GEOJSON: def _add_geometry(sql: SaSelect, column: SaColumn) -> SaSelect: - return sql.add_columns(sa.literal_column(f""" - ST_AsGeoJSON(CASE WHEN ST_NPoints({column.name}) > 5000 - THEN ST_SimplifyPreserveTopology({column.name}, 0.0001) - ELSE {column.name} END) - """).label('geometry_geojson')) + return sql.add_columns(sa.func.ST_AsGeoJSON( + sa.case((sa.func.ST_NPoints(column) > 5000, + sa.func.ST_SimplifyPreserveTopology(column, 0.0001)), + else_=column), 7).label('geometry_geojson')) else: def _add_geometry(sql: SaSelect, column: SaColumn) -> SaSelect: return sql.add_columns(sa.func.ST_GeometryType(column).label('geometry_type')) @@ -182,20 +182,20 @@ async def get_detailed_place(conn: SearchConnection, place: ntyp.PlaceRef, # 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) + if 'type' in result.geometry: + result.geometry['type'] = GEOMETRY_TYPE_MAP.get(result.geometry['type'], + result.geometry['type']) 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) + await nres.add_result_details(conn, [result], details) return result async def get_simple_place(conn: SearchConnection, place: ntyp.PlaceRef, - details: ntyp.LookupDetails) -> Optional[nres.SearchResult]: + details: ntyp.LookupDetails) -> Optional[nres.SearchResult]: """ Retrieve a place as a simple search result from the database. """ log().function('get_simple_place', place=place, details=details) @@ -207,16 +207,16 @@ async def get_simple_place(conn: SearchConnection, place: ntyp.PlaceRef, out = [] if details.geometry_simplification > 0.0: - col = col.ST_SimplifyPreserveTopology(details.geometry_simplification) + col = sa.func.ST_SimplifyPreserveTopology(col, details.geometry_simplification) if details.geometry_output & ntyp.GeometryFormat.GEOJSON: - out.append(col.ST_AsGeoJSON().label('geometry_geojson')) + out.append(sa.func.ST_AsGeoJSON(col, 7).label('geometry_geojson')) if details.geometry_output & ntyp.GeometryFormat.TEXT: - out.append(col.ST_AsText().label('geometry_text')) + out.append(sa.func.ST_AsText(col).label('geometry_text')) if details.geometry_output & ntyp.GeometryFormat.KML: - out.append(col.ST_AsKML().label('geometry_kml')) + out.append(sa.func.ST_AsKML(col, 7).label('geometry_kml')) if details.geometry_output & ntyp.GeometryFormat.SVG: - out.append(col.ST_AsSVG().label('geometry_svg')) + out.append(sa.func.ST_AsSVG(col, 0, 7).label('geometry_svg')) return sql.add_columns(*out) @@ -232,8 +232,20 @@ async def get_simple_place(conn: SearchConnection, place: ntyp.PlaceRef, # add missing details assert result is not None - result.bbox = getattr(row, 'bbox', None) + if hasattr(row, 'bbox'): + result.bbox = ntyp.Bbox.from_wkb(row.bbox) - await nres.add_result_details(conn, result, details) + await nres.add_result_details(conn, [result], details) return result + + +GEOMETRY_TYPE_MAP = { + 'POINT': 'ST_Point', + 'MULTIPOINT': 'ST_MultiPoint', + 'LINESTRING': 'ST_LineString', + 'MULTILINESTRING': 'ST_MultiLineString', + 'POLYGON': 'ST_Polygon', + 'MULTIPOLYGON': 'ST_MultiPolygon', + 'GEOMETRYCOLLECTION': 'ST_GeometryCollection' +}