opengis: add support for wfs:FeatureCollection responses (#84053)
gitea/passerelle/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2023-11-29 10:30:59 +01:00
parent b9939892b8
commit f513f2451d
2 changed files with 69 additions and 0 deletions

View File

@ -314,6 +314,9 @@ class OpenGIS(BaseResource):
}
response = self.requests.get(self.wms_service_url, params=params)
element = ET.fromstring(response.content)
if element.tag == '{http://www.opengis.net/wfs}FeatureCollection':
features = element.findall('{http://www.opengis.net/gml}featureMembers/*')
return {'err': 0, 'data': build_dict_from_xml(features[0]) if features else []}
return {'err': 0, 'data': build_dict_from_xml(element)}
# https://carton.entrouvert.org/hydda-tiles/16/33650/23378.pn

View File

@ -39,6 +39,56 @@ FAKE_FEATURE_INFO = '''<?xml version="1.0" encoding="UTF-8"?>
</cad_cadastre.cadparcelle_layer>
</msGMLOutput>'''
FAKE_FEATURE_INFO_FEATURE_COLLECTION = '''<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:gml="http://www.opengis.net/gml"
xmlns:metropole-de-lyon="http://metropole-de-lyon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="..."
>
<gml:boundedBy>
<gml:Envelope srsDimension="2" srsName="urn:x-ogc:def:crs:EPSG:3857">
<gml:lowerCorner>531238.20604672 5735107.61605308</gml:lowerCorner>
<gml:upperCorner>546464.26335844 5751147.23178471</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:featureMembers>
<metropole-de-lyon:eco_ecologie.zfe gml:id="eco_ecologie.zfe.200046977-ZFE-001">
<gml:boundedBy>
<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:3857" srsDimension="2">
<gml:lowerCorner>531238.20604672 5735107.61605308</gml:lowerCorner>
<gml:upperCorner>546464.26335844 5751147.23178471</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<metropole-de-lyon:gid>200046977-ZFE-001</metropole-de-lyon:gid>
<metropole-de-lyon:date_debut>2020-01-01</metropole-de-lyon:date_debut>
<metropole-de-lyon:vp_critair>V5</metropole-de-lyon:vp_critair>
<metropole-de-lyon:vp_horaires>24/7</metropole-de-lyon:vp_horaires>
<metropole-de-lyon:vul_critair>V3</metropole-de-lyon:vul_critair>
<metropole-de-lyon:vul_horaires>24/7</metropole-de-lyon:vul_horaires>
<metropole-de-lyon:pl_critair>V3</metropole-de-lyon:pl_critair>
<metropole-de-lyon:pl_horaires>24/7</metropole-de-lyon:pl_horaires>
<metropole-de-lyon:autobus_autocars_critair>V5</metropole-de-lyon:autobus_autocars_critair>
<metropole-de-lyon:autobus_autocars_horaires>24/7</metropole-de-lyon:autobus_autocars_horaires>
<metropole-de-lyon:deux_rm_critair>V5</metropole-de-lyon:deux_rm_critair>
<metropole-de-lyon:deux_rm_horaires>24/7</metropole-de-lyon:deux_rm_horaires>
<metropole-de-lyon:url_arrete>https://agora.grandlyon.com/webdelib/files/unzip//seance_264250/23_d1647427974276.pdf</metropole-de-lyon:url_arrete>
<metropole-de-lyon:url_site_information>https://www.grandlyon.com/actions/zfe.html#c20726</metropole-de-lyon:url_site_information>
<metropole-de-lyon:the_geom>
<gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:3857" srsDimension="2">
<gml:exterior>
<gml:LinearRing>
<gml:posList>...</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</metropole-de-lyon:the_geom>
<metropole-de-lyon:id>200046977-ZFE-001</metropole-de-lyon:id>
</metropole-de-lyon:eco_ecologie.zfe>
</gml:featureMembers>
</wfs:FeatureCollection>'''
FAKE_SERVICE_CAPABILITIES = '''<?xml version="1.0" encoding="UTF-8"?>
<wfs:WFS_Capabilities version="2.0.0"
xmlns:wfs="http://www.opengis.net/wfs/2.0"
@ -448,6 +498,22 @@ def test_feature_info(mocked_get, app, connector):
assert mocked_get.call_args[1]['params']['crs'] == 'EPSG:4326'
@mock.patch('passerelle.utils.Request.get')
def test_feature_info_feature_collection(mocked_get, app, connector):
endpoint = tests.utils.generic_endpoint_url('opengis', 'feature_info', slug=connector.slug)
assert endpoint == '/opengis/test/feature_info'
mocked_get.return_value = tests.utils.FakedResponse(
content=FAKE_FEATURE_INFO_FEATURE_COLLECTION, status_code=200
)
resp = app.get(endpoint, params={'lat': '45.796890', 'lon': '4.784140'})
assert (
mocked_get.call_args[1]['params']['bbox']
== '532556.896735,5747844.261214,532579.160633,5747876.194333'
)
assert mocked_get.call_args[1]['params']['crs'] == 'EPSG:3857'
assert resp.json['data']['autobus_autocars_critair'] == 'V5'
@mock.patch('passerelle.utils.Request.get')
@pytest.mark.parametrize(
'lat,lon',