From 926c4a7d0444321b713e52deadfb0c9ab2b4f91d Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Tue, 8 Aug 2023 19:42:55 +0200 Subject: [PATCH] fix lookup polygon output Fixes #3147. --- nominatim/api/lookup.py | 10 +++--- test/python/api/test_api_lookup.py | 51 ++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/nominatim/api/lookup.py b/nominatim/api/lookup.py index 0e1fd9ce..a46cdb69 100644 --- a/nominatim/api/lookup.py +++ b/nominatim/api/lookup.py @@ -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).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).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).label('geometry_svg')) return sql.add_columns(*out) diff --git a/test/python/api/test_api_lookup.py b/test/python/api/test_api_lookup.py index 619bc747..8f5dd17c 100644 --- a/test/python/api/test_api_lookup.py +++ b/test/python/api/test_api_lookup.py @@ -100,3 +100,54 @@ def test_lookup_multiple_places(apiobj): assert len(result) == 2 assert set(r.place_id for r in result) == {332, 4924} + + +@pytest.mark.parametrize('gtype', list(napi.GeometryFormat)) +def test_simple_place_with_geometry(apiobj, gtype): + apiobj.add_placex(place_id=332, osm_type='W', osm_id=4, + class_='highway', type='residential', + name={'name': 'Road'}, address={'city': 'Barrow'}, + extratags={'surface': 'paved'}, + parent_place_id=34, linked_place_id=55, + admin_level=15, country_code='gb', + housenumber='4', + postcode='34425', wikipedia='en:Faa', + rank_search=27, rank_address=26, + importance=0.01, + centroid=(23, 34), + geometry='POLYGON((23 34, 23.1 34, 23.1 34.1, 23 34))') + + result = apiobj.api.lookup([napi.OsmID('W', 4)], + geometry_output=gtype) + + assert len(result) == 1 + assert result[0].place_id == 332 + + if gtype == napi.GeometryFormat.NONE: + assert list(result[0].geometry.keys()) == [] + else: + assert list(result[0].geometry.keys()) == [gtype.name.lower()] + + +def test_simple_place_with_geometry_simplified(apiobj): + apiobj.add_placex(place_id=332, osm_type='W', osm_id=4, + class_='highway', type='residential', + name={'name': 'Road'}, address={'city': 'Barrow'}, + extratags={'surface': 'paved'}, + parent_place_id=34, linked_place_id=55, + admin_level=15, country_code='gb', + housenumber='4', + postcode='34425', wikipedia='en:Faa', + rank_search=27, rank_address=26, + importance=0.01, + centroid=(23, 34), + geometry='POLYGON((23 34, 22.999 34, 23.1 34, 23.1 34.1, 23 34))') + + result = apiobj.api.lookup([napi.OsmID('W', 4)], + geometry_output=napi.GeometryFormat.TEXT, + geometry_simplification=0.1) + + assert len(result) == 1 + assert result[0].place_id == 332 + assert result[0].geometry == {'text': 'POLYGON((23 34,23.1 34,23.1 34.1,23 34))'} +