Requêtes WFS complexes

J'ai cherché un exemple de requête WFS complexe sur le Web sans vraiment de success.. J'ai donc construit et testé quelques exemples que je partage ici ... :-) NOTE: Pour tester rapidement la requête WFS, on peut simplement utiliser curl en ligne de commande: curl --output test-wfs.gml -H "Content-type: text/xml" -d "[MON_XML_WFS_QUERY]" http://test.domaine.ca/cgi-bin/wfs_extract_service? On peut aussi sauvegarder en format Shapefiles zipés avec Mapserver 6.0. On ajoute simplement dans le URL un outputformat et ça fonctionne: curl --output test-wfs.zip -H "Content-type: text/xml" -d "[MON_XML_WFS_QUERY]" http://test.domaine.ca/cgi-bin/wfs_extract_service?outputformat=SHAPEZIP Ce premier exemple va extraire des données sur trois classes d'entités simultanément. J'ai ajouté un filtre spatial sur la troisième classe et des filtres descriptifs sur les deux premières: <wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs"           service="WFS"           version="1.0.0"           outputFormat="text/xml; subtype=gml/3.1.1"           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <wfs:Query typeName="QASW_V_SDO">      <Filter>           <AND>                <PropertyIsEqualTo>                     <PropertyName>NO_NUM</PropertyName>                     <Literal>1234</Literal>                </PropertyIsEqualTo>                <PropertyIsEqualTo>                     <PropertyName>PDG</PropertyName>                     <Literal>3</Literal>                </PropertyIsEqualTo>                <PropertyIsEqualTo>                      <PropertyName>ANNEE</PropertyName>                      <Literal>2011</Literal>                </PropertyIsEqualTo>                <OR>                     <PropertyIsEqualTo>                          <PropertyName>STATUT</PropertyName>                          <Literal>ACT</Literal>                     </PropertyIsEqualTo>                     <PropertyIsEqualTo>                          <PropertyName>STATUT</PropertyName>                          <Literal>TER</Literal>                     </PropertyIsEqualTo>                </OR>           </AND>      </Filter> </wfs:Query> <wfs:Query typeName="CQWW_V_SDO">      <Filter>           <AND>                <PropertyIsEqualTo>                     <PropertyName>PDG</PropertyName>                     <Literal>12345</Literal>                </PropertyIsEqualTo>                <PropertyIsEqualTo>                     <PropertyName>NPD</PropertyName>                     <Literal>3</Literal>                </PropertyIsEqualTo>                <PropertyIsEqualTo>                      <PropertyName>ANNEE</PropertyName>                      <Literal>2011</Literal>                </PropertyIsEqualTo>                <OR>                     <PropertyIsEqualTo>                          <PropertyName>STATUT</PropertyName>                          <Literal>ACT</Literal>                     </PropertyIsEqualTo>                     <PropertyIsEqualTo>                          <PropertyName>STATUT</PropertyName>                          <Literal>TER</Literal>                     </PropertyIsEqualTo>                </OR>           </AND>      </Filter> </wfs:Query> <wfs:Query typeName="NTCQ_P_SDO">      <Filter>           <BBOX>                <PropertyName>GEOM</PropertyName>                     <BOX srsName="EPSG:4326">                          <coordinates>-68.5329,45.6624 -65.3673,46.1815</coordinates>                     </BOX>           </BBOX>      </Filter> </wfs:Query> </wfs:GetFeature> Bien que largement documenté, une requête WFS-T qui ajoute une géométrie et quelques attributs dans une classe d'entités: <wfs:Transaction 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:Insert>      <feature:WFST_TBL_S xmlns:feature="http://test.domaine.ca/wfs">           <feature:GEOM>                <gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">                     <gml:polygonMember>                          <gml:Polygon>                               <gml:outerBoundaryIs>                                    <gml:LinearRing>                                         <gml:coordinates decimal="." cs="," ts=" ">-72.271939548267,46.396721175948 -72.257519992603,46.402877012708 -72.240010532154,46.396484399126 -72.23795059563,46.388196563093 -72.248250278248,46.383696925045 -72.259236606373,46.384170588622 -72.266789706959,46.388196563093 -72.271939548267,46.396721175948                                         </gml:coordinates>                                    </gml:LinearRing>                               </gml:outerBoundaryIs>                          </gml:Polygon>                     </gml:polygonMember>                </gml:MultiPolygon>           </feature:GEOM>           <feature:TEXT>Ceci est un test</feature:TEXT>           <feature:TYPE>12</feature:TYPE>      </feature:WFST_TBL_S> </wfs:Insert> </wfs:Transaction>

Nouveaux OUTPUTFORMAT de Mapserver 6.0

Une des nouveautés de Mapserver 6.0 est l’ajout de nouveaux formats de sortie liés aux requêtes GetFeature via WFS. Attention par contre, on doit obligatoirement installer GDAL/OGR 1.8. Dans mon cas test sur mon serveur Debian, je devais utiliser une connexion Oracle. J'ai donc compilé GDAL/OGR avec le support Oracle et compilé Mapserver pour lire ce format via GDAL/OGR. J'ai aussi préparé un fichier regroupant les formats de sortie suivant: OUTPUTFORMAT   NAME "SHAPEZIP"   DRIVER "OGR/ESRI Shapefile"   MIMETYPE "application/shapefile"   FORMATOPTION "STORAGE=filesystem"   FORMATOPTION "FORM=zip"   FORMATOPTION "FILENAME=result.zip" END OUTPUTFORMAT   NAME "MIDMIF"   DRIVER "OGR/MapInfo File"   FORMATOPTION "STORAGE=filesystem"   FORMATOPTION "FORM=multipart"   FORMATOPTION "DSCO:FORMAT=MIF"   FORMATOPTION "FILENAME=result.mif" END OUTPUTFORMAT   NAME "MultiMIDMIF"   DRIVER "OGR/MapInfo File"   FORMATOPTION "STORAGE=filesystem"   FORMATOPTION "FORM=multipart"   FORMATOPTION "DSCO:FORMAT=MIF"   FORMATOPTION "FILENAME=result" END OUTPUTFORMAT   NAME "CSV"   DRIVER "OGR/CSV"   MIMETYPE "text/csv"   FORMATOPTION "LCO:GEOMETRY=AS_WKT"   FORMATOPTION "STORAGE=filesystem"   FORMATOPTION "FORM=simple"   FORMATOPTION "FILENAME=result.csv" END OUTPUTFORMAT   NAME "CSVSTREAM"   DRIVER "OGR/CSV"   MIMETYPE "text/csv; streamed"   FORMATOPTION "LCO:GEOMETRY=AS_WKT"   FORMATOPTION "STORAGE=stream"   FORMATOPTION "FORM=simple"   FORMATOPTION "FILENAME=result.csv" #-- If “stream” then the datasource will be created with a name “/vsistdout” as an attempt to write directly to stdout. Only a few OGR drivers will work properly in this mode (ie. CSV, perhaps kml, gml) END OUTPUTFORMAT   NAME "OGRGML"   DRIVER "OGR/GML"   MIMETYPE "text/xml; subtype=gml/2.1.2; driver=ogr"   FORMATOPTION "STORAGE=memory"   FORMATOPTION "FORM=multipart"   FORMATOPTION "FILENAME=result.gml" END OUTPUTFORMAT   NAME kml   DRIVER "KML"   MIMETYPE "application/vnd.google-earth.kml+xml"   IMAGEMODE RGB   EXTENSION "kml"   FORMATOPTION 'ATTACHMENT=result.kml'   FORMATOPTION "maxfeaturestodraw=100" END OUTPUTFORMAT   NAME kmz   DRIVER "KMZ"   MIMETYPE "application/vnd.google-earth.kmz"   IMAGEMODE RGB   EXTENSION "kmz"   FORMATOPTION 'ATTACHMENT=result.kmz' END OUTPUTFORMAT   NAME "geojson"   DRIVER "TEMPLATE"   MIMETYPE "application/json; subtype=geojson"   FORMATOPTION "FILE=../template/geojson.txml" END OUTPUTFORMAT   NAME "customxml"   DRIVER "TEMPLATE"   FORMATOPTION "FILE=mon_template.xml" END J'ai testé avec ce Mapfile WFS plusieurs de ces formats. Pour le type “SHAPEZIP” par exemple, on fait simplement cette requête URL: http://sigtest.gouc.qc/cgi-bin/extract?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&typename=SMDTS_TERR&OUTPUTFORMAT=SHAPEZIP NOTE 1: Je n'ai pas ajouter de clause FILTER pour mon test mais c'est possible. Voir ici pour plus d'explications NOTE 2: J'ai n'ai pas fait d'essais avec le format de sortie TEMPLATE qui nous permet de personnaliser un format de sortie texte comme geojson par exemple. Cette option est très puissante et mérite d'être mieux connue. Imaginer utiliser Mapserver pour générer du code javascript pour jQuery par exemple...! NOTE 3: Par comparaison, avec Geoserver qui support déjà ce type de format de sortie (SHAPEFILES) depuis plus longtemps: http://sigtest.gouv.qc:8180/geoserver/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&typename=SMDTS_TERR&OUTPUTFORMAT=SHAPE-ZIP