Bonjour,
je dois réaliser une interface simple permettant d’ajouter à une carte différentes couches externes (WMS, WFS, WMTS) en remplissant des champs de formulaire. Le browser utilisé pour afficher la carte est (malheureusement :/ ) une webview incluse dans une application winforms, qui possède les caractéristiques d’un internet explorer 8. J’emploie la version 2.0.3 de l’api geoportal, en mode extended, que je récupère à cette adresse : api.ign.fr/geoportail/api/js/2.0.3/GeoportalExtended.js
Étant novice en matière de cartographie et ne connaissant pas bien les protocoles utilisés, je me suis basé sur les exemples disponibles dans la documentation de l’IGN pour construire les appels à partir des données collectées.
Malheureusement, je rencontre quelques soucis bloquants, et j'ai du mal à faire la part des choses entre ce qui est normal, ce qui relève de choses mal faites de mon côté (là est la plus grosse probabilité) ou ce qui pourrait relever de bugs dans l'api. (on ne sait jamais)
Ci-après un descriptif des question que je me pose (un peu longuet, désolé, j'essaie de contextualiser au maximum), merci d'avance à toute personne qui voudra bien le lire et tenter de répondre à mes questions.
Pour le WFS, j'utilises cette forme d'appel a minima :
(ils peuvent éventuellement être étendu avec les crédits et une stylemap)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 var layer = { type: "WFS", name: userDefinedWFSLayer.LayerObjectName, url: userDefinedWFSLayer.LayerObjectUrl, serviceParams: { typename: userDefinedWFSLayer.LayerObjectLayersFeature[0] }, layerParams: { projection: userDefinedWFSLayer.LayerObjectProjection, visibility: userDefinedWFSLayer.LayerObjectVisible } };
Et ils sont ajoutés à la carte ainsi :
Ceci respecte la signature de la méthode addLayer telle que définie dans la documentation de l’api.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UCFFapp.mainMap.setProxyUrl(Router.action('Proxy', 'Http', { url: "" })); UCFFapp.mainMap.addLayer(layer.type, layer.name, layer.url, layer.serviceParams, layer.layerParams);
Lorsque ce code est exécuté, en monitorant les requêtes http, je peux voir partir trois requêtes vers l’url cible (passant bien à travers le proxy pour éviter les problèmes de cross-domain) pour chaque couche :
- Une http GET pour GetCapabilities, qui répond convenablement
- Une http GET pour DescribeFeatureType, qui répond convenablement
- Une http POST qui envoie au serveur du xml correspondant au protocole WFS
C’est à ce moment que les choses se gâtent, pour deux raisons :
- Sur internet explorer, tous les cas mène à une type error : object doesn’t support method ‘getAttributeNS’.
Il semble que cette méthode soit employée au parsing de la réponse du POST sur des nœuds xml, or l’api dom d’IE avant IE 9 ne comprend pas getAttributeNS, et l’api dom pour IE9 et supérieur la comprend mais uniquement pour les documents html, pas pour les documents xml. Je ne sais pas si les appels sont faits au niveau de geoportal ou en-dessous dans l’openlayers qui la sous-tend. Pour moi, c’est malheureusement un point bloquant car je n'ai pas le choix du browser. Existe-t-il une façon alternative d’appeler ces couches qui soit compatible IE ?
- En laissant de côté IE pour tester plus avant, il s’avère que certains serveurs WFS répondent au POST de l’api geoportal par des erreurs 500 (malheureusement ces serveurs ne renvoient pas d’erreur détaillée). J’ai intercepté les paquets postés vers mon proxy pour les envoyer directement sur l’url cible avec un outil, au cas où j’aurais commis une erreur altérant les requêtes en codant le proxy, mais les erreurs persistent de la même façon.
Je suppose que les données postées ne correspondent pas à ce qui est attendu par le serveur dans le cadre du protocole, mais je ne connais pas suffisamment le protocole pour identifier le problème. Je ne dispose pas d’une grosse batterie de serveurs de tests, mes observations concernent donc un échantillon non-significatif, toutefois jusque ici les serveurs pour lesquels l’échange s’effectue convenablement tournent avec la version 1.1.0 du protocole WFS, tandis que les erreurs 500 se produisent sur les serveurs employant la version 1.0.0.
Ci-dessous les données relatives à un serveur pour lequel l’échange est fonctionnel et un qui ne l’est pas :
Fonctionnel :
url : http://carto.geonormandie.fr/cgi-bin/mapservwfs?
featureType : Reserves_Naturelles_Regionales_Basse-Normandie
projection : EPSG:2154
enveloppe wfs envoyée au serveur en POST par l’api geoportal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <wfs:Query typeName="ms:Reserves_Naturelles_Regionales_Basse-Normandie" srsName="EPSG:2154" xmlns:ms="http://mapserver.gis.umn.edu/mapserver"> <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"> <ogc:BBOX> <ogc:PropertyName>msGeometry</ogc:PropertyName> <gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:2154"> <gml:lowerCorner>461738.55916977255 6729375.396523453</gml:lowerCorner> <gml:upperCorner>861592.5205242218 7024447.305438523</gml:upperCorner> </gml:Envelope> </ogc:BBOX> </ogc:Filter> </wfs:Query> </wfs:GetFeature>
Non-fonctionnel :
url : http://ws.carmencarto.fr/WFS/38/cerf_elaphe?
featureType : Limite_departementale
projection : EPSG:2154
enveloppe wfs envoyée au serveur en POST par l’api geoportal :
Voyez-vous une raison à cet état de fait ? Est-ce quelque chose que j’oublie ou que je fais mal sans m’en rendre compte ? Ou est-ce qu’en fait ces échecs sont « normaux » ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <wfs:Query typeName="ms:Parcelles_Forestieres" xmlns:ms="http://mapserver.gis.umn.edu/mapserver"> <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"> <ogc:BBOX> <ogc:PropertyName>msGeometry</ogc:PropertyName> <gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:2154"> <gml:coordinates decimal="." cs="," ts=" ">-1405796.5345500913,5481106.281480494 1999846.5771337412,7874892.169162757</gml:coordinates> </gml:Box> </ogc:BBOX> </ogc:Filter> </wfs:Query> </wfs:GetFeature>
J’ai une autre série de questions, plus générale, concernant l’appel de couche via WMTS via geoportal. J’ai regardé les exemples fournis sur le site de l’IGN, qui me présentent des appels sous cette forme :
Je dois admettre que je ne comprends pas ces appels.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 var matrixIds = []; for (var i = 0; i < 22; i++) { matrixIds[i] = { identifier: "EPSG:900913:" + i, topLeftCorner: new OpenLayers.LonLat(-20037508, 20037508) }; } var wmts_layer = new Geoportal.Layer.WMTS({ name: 'Vues satellite et aériennes', url: 'http://tile.geobretagne.fr/gwc02/service/wmts', layer: 'satellite', style: '_null', matrixSet: 'EPSG:900913', matrixIds: matrixIds, tileOrigin: new OpenLayers.LonLat(-20037508, 20037508), format: "image/jpeg", projection: new OpenLayers.Projection('EPSG:900913'), opacity: 0.5, originators: [{ pictureUrl: 'http://geobretagne.fr/accueil/static/logos/logo_geobretagne.png', url: 'http://geobretagne.fr/', attribution: 'GéoBretagne' }] } ); primaryMap.addLayer(wmts_layer);
À quoi correspondent les matrix ids et matrix sets ? Y a-t-il toujours 22 matrix ids ? Quels éléments devrais-je collecter dans une interface pour construire un appel a minima ? Je suppose url, layer, matrixSet, tileOrigin, format, nombre de matrixIds s’il est variable, et projection si elle peut différer du matrixSet (le peut-elle ?), mais je passe peut-être à côté de quelque chose. Dans quel système de coordonnées et dans quel unité doit être exprimée la tile origin ? Est-ce que le protocole WMTS expose des données qui me permettraient de vérifier que les éléments saisis dans l’interface sont valides pour l’url donnée ? Et enfin, existe-t-il une liste de serveurs WMTS publics sur lesquels il me serait possible de valider mon implémentation ?
Merci d'avoir pris le temps de lire, toute aide serait grandement appréciée.
Partager