Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=PLACES&amp;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&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=ms:PLACES&amp;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

 

Pied de page des forums

Powered by FluxBB