Pages: 1
- Sujet précédent - [OpenLayers + MapServer] Problème de récupération d'un WFS via Vector - Sujet suivant
#1 Wed 15 February 2012 17:50
- Chapuis.P
- Juste Inscrit !
- Lieu: Saint-Herblain
- Date d'inscription: 12 Nov 2006
- Messages: 6
[OpenLayers + MapServer] Problème de récupération d'un WFS via Vector
Bonjour
J'ai un soucis lors de la récupération du flux WFS issue de MapServer lors de l'utilisation de méthode Vector. Je n'arrive pas à obtenir ma couche via Vector. J'ai vu plusieurs sujets mais aucun ne m'a apporté la solution miracle. A noter que ça marche très bien via la méthode WFS mais qui est à exclure (je dois faire des filtres, etc... et la méthode WFS est condamné à plus ou moins brève échéance).
La grosse différence que j'observe est dans la réponse de MapServer où les geométries sont absentes dans le cas du Vector
Voici le code simplifié :
Code:
var selStyle = new OpenLayers.Style({ strokeColor: "#00ccff", strokeWidth: 4 }); var defStyle = new OpenLayers.Style({ strokeWidth: 1, strokeColor: "#333333", fillColor: "#ff0000", pointRadius: 5 , graphicName: "square" }); var styles = new OpenLayers.StyleMap({ "default": defStyle, "select" : selStyle }); var wfsLayerVector = new OpenLayers.Layer.Vector( "OSM Places (Vector)", { strategies: [new OpenLayers.Strategy.BBOX()], protocol: new OpenLayers.Protocol.WFS({ url: "http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map&", featureType: 'PLACES', srsName: "EPSG:4326" }), styleMap: styles }); var wfsLayer = new OpenLayers.Layer.WFS( "OSM Places (WFS)", "http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map&", {typename: 'PLACES'}, {extractAttributes: true, styleMap: styles} ); map.addLayers([wmsLayer,wfsLayer, wfsLayerVector]);
Et le mapfile :
Code:
# Map file created from QGIS project file C:/Users/GAV/Downloads/coucheudirunion/qgis.qgs # Edit this file to customize for your map interface # (Created with PyQgis MapServer Export plugin) MAP NAME "OSM_WFS" # Map image size SIZE 100 100 UNITS meters EXTENT -61.25 14.35 -60.8 14.9 PROJECTION 'init=epsg:4326' END # Background color for the map canvas -- change as desired IMAGECOLOR 255 255 255 IMAGEQUALITY 95 IMAGETYPE agg OUTPUTFORMAT NAME agg DRIVER AGG/PNG IMAGEMODE RGB END # Web interface definition. Only the template parameter # is required to display a map. See MapServer documentation WEB # Set IMAGEPATH to the path where MapServer should # write its output. IMAGEPATH '/tmp/' # Set IMAGEURL to the url that points to IMAGEPATH # as defined in your web server configuration IMAGEURL '/tmp/' # WMS server settings METADATA 'wfs_title' 'OSM_WFS' 'wfs_onlineresource' 'http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map' 'wfs_srs' 'EPSG:4326' 'wfs_enable_request' '*' # necessary 'wfs_include_items' 'all' END #Scale range at which web interface will operate # Template and header/footer settings # Only the template parameter is required to display a map. See MapServer documentation TEMPLATE "fooOnlyForWMSGetFeatureInfo" END LAYER NAME 'PLACES' TYPE POINT DUMP true DATA '/var/www/OpenLayers/client/mapserver/shp/osm/places.shp' METADATA 'wfs_title' 'PLACES' ##REQUIRED 'wfs_srs' 'EPSG:4326' ## REQUIRED 'wfs_enable_request' '*' 'wfs_include_items' 'all' 'gml_featureid' 'osm_id' ## REQUIRED 'gml_include_items' 'all' ## Optional (serves all attributes for layer) END STATUS ON PROJECTION 'init=epsg:4326' END END END
Voici le xml reçu via la méthode WFS:
Code:
<?xml version='1.0' encoding="ISO-8859-1" ?> <wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd http://mapserver.gis.umn.edu/mapserver http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map&SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=PLACES&OUTPUTFORMAT=XMLSCHEMA"> <gml:boundedBy> <gml:Box srsName="EPSG:4326"> <gml:coordinates>-61.227884,14.390533 -60.826937,14.878733</gml:coordinates> </gml:Box> </gml:boundedBy> <gml:featureMember> <ms:PLACES fid="PLACES.246835820"> <gml:boundedBy> <gml:Box srsName="EPSG:4326"> <gml:coordinates>-61.075759,14.603547 -61.075759,14.603547</gml:coordinates> </gml:Box> </gml:boundedBy> <ms:msGeometry> <gml:Point srsName="EPSG:4326"> <gml:coordinates>-61.075759,14.603547</gml:coordinates> </gml:Point> </ms:msGeometry> <ms:osm_id>246835820</ms:osm_id> <ms:name>Fort-de-France</ms:name> <ms:type>city</ms:type> <ms:population>89000</ms:population> </ms:PLACES> </gml:featureMember> </wfs:FeatureCollection>
Et via la méthode Vector (quels que soient les paramètres que je mette) :
Code:
<?xml version='1.0' encoding="ISO-8859-1" ?> <wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd http://mapserver.gis.umn.edu/mapserver http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map&SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=ms:PLACES&OUTPUTFORMAT=XMLSCHEMA"> <gml:boundedBy> <gml:Box srsName="EPSG:4326"> <gml:coordinates>-61.075759,14.603547 -61.075759,14.603547</gml:coordinates> </gml:Box> </gml:boundedBy> <gml:featureMember> <ms:PLACES fid="PLACES.246835820"> <ms:osm_id>246835820</ms:osm_id> <ms:name>Fort-de-France</ms:name> <ms:type>city</ms:type> <ms:population>89000</ms:population> </ms:PLACES> </gml:featureMember> </wfs:FeatureCollection>
Notez la disparition des balises <gml:boundedBy> et <ms:msGeometry> dans <gml:featureMember>.
Je me demande si ça ne vient pas de Mapserver. Si quelqu'un a une idée, ça m'intéresse car je suis complétement bloqué.
Par avance merci.
Dernière modification par Chapuis.P (Thu 16 February 2012 10:44)
Patrick Chapuis
Hors ligne
#2 Thu 16 February 2012 10:04
- Daemons
- Participant occasionnel
- Lieu: Nice
- Date d'inscription: 15 Dec 2011
- Messages: 23
Re: [OpenLayers + MapServer] Problème de récupération d'un WFS via Vector
Bonjour,
Avez-vous essayé avec un Protocol.HTTP plutôt que Protocol.WFS dans le code OpenLayers ? Pour vous, ca donnerait :
Code:
var wfsLayerVector = new OpenLayers.Layer.Vector( "OSM Places (Vector)", { styleMap: styles, strategies: [new OpenLayers.Strategy.BBOX()], protocol: new OpenLayers.Protocol.HTTP({ url: "http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map&", params: { typename: "PLACES", service: "WFS", format: "WFS", version: "1.0.0", request: "GetFeature", srs: "EPSG:4326" }, format: new OpenLayers.Format.GML() }), {extractAttributes: true} });
Dernière modification par Daemons (Thu 16 February 2012 10:07)
Hors ligne
#3 Thu 16 February 2012 10:43
- Chapuis.P
- Juste Inscrit !
- Lieu: Saint-Herblain
- Date d'inscription: 12 Nov 2006
- Messages: 6
Re: [OpenLayers + MapServer] Problème de récupération d'un WFS via Vector
Bonjour,
Merci beaucoup, mais ça ne résout pas mon problème initial (que je n'ai pas posté ici) :
<<
Je voulais, avec OpenLayers, attaquer un WFS Mapserver en lui passant un paramètre pour filtrer les résultats en amont.
Je m'explique : j'ai un SHP qui contient potentiellement plusieurs milliers d'éléments et j'utilise OpenLayers en tant que visualiseur carto d'une application métier dans laquelle OL est incapsulée. Cette appli métier m'envoie, pour la localisation, qu'un jeu des identifiants à afficher et j'aimerais épargner le poste client et son débit (c'est en Martinique pour un serveur qui sera en métropole) en ne demandant à MapServer que ce qui m'intéresse.
Les Rules ne sont a priori pas la solution car elles ne s'exécutent que côté client.
>>
En effet, même si je peux appliquer mon filtre tout de même de cette manière (pour ceux que ça intéresse) :
Code:
var wfsLayerVector = new OpenLayers.Layer.Vector( "OSM Places (Vector)", { styleMap: styles, strategies: [new OpenLayers.Strategy.Fixed()], protocol: new OpenLayers.Protocol.HTTP({ url: "http://192.168.80.129/cgi-bin/mapserv?map=/var/www/OpenLayers/client/mapserver/map/osm_wfs.map&", params: { typename: "PLACES", service: "WFS", format: "WFS", version: "1.0.0", request: "GetFeature", srs: "EPSG:4326", filter: "<Filter><PropertyIsEqualTo><PropertyName>type</PropertyName><Literal>city</Literal></PropertyIsEqualTo></Filter>" }, format: new OpenLayers.Format.GML() }), extractAttributes: true });
Le problème est que je ne localise pas 1 ou quelques éléments mais potentiellement plusieurs centaines. Or, la méthode WFS ou la protocole énoncé ci dessus passe par la méthode GET et Vector + WFS par POST. GET est à exclure vu la longueur potentielle de mon url (GET est plus limité que POST en taille).
J'ai tout de même tenté de mettre un paramètre readWithPOST: true dans la définition de mon protocole mais MapServer me retourne une erreur
Code:
msReturnPage(): Web application error. Malformed template name (fooOnlyForWMSGetFeatureInfo).
concernant ma balise TEMPLATE dans la balise WEB de mon mapfile (généré par QGIS). Je n'ai pas réussi à me débarrasser de cette erreur.
Patrick Chapuis
Hors ligne
#4 Mon 13 August 2012 12:08
- tchule
- Juste Inscrit !
- Date d'inscription: 27 Jun 2006
- Messages: 2
Re: [OpenLayers + MapServer] Problème de récupération d'un WFS via Vector
Bonjour,
Est-ce que vous avez réussi à trouver une solution à ce problème ? Je crois que j'ai exactement le même souci.
J'ai tenté d'installer OpenLayers 2.12 pour corriger un problème dans mon appli et j'ai du remplacer OpenLayers.Layer.WFS qui est déprécié par OpenLayers.Layer.Vector, ça fonctionne pas trop mal pour le reste mais Mapserver ne me renvoi plus les géométries du WFS.
Code:
this.wfsLayer = new OpenLayers.Layer.Vector("WFS Layer", { strategies:[new OpenLayers.Strategy.BBOX()], protocol: new OpenLayers.Protocol.WFS({ url: this.urlWFS, featureType: monType, featureNS: "http://mapserver.gis.umn.edu/mapserver", geometryName: 'msGeometry', //propertyName: 'geometry', featurePrefix: "ms", version: "1.0.0" }) });
Cordialement,
Hors ligne
Pages: 1
- Sujet précédent - [OpenLayers + MapServer] Problème de récupération d'un WFS via Vector - Sujet suivant