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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 26 April 2013 16:25

pargass31
Participant occasionnel
Date d'inscription: 26 Apr 2013
Messages: 12

Geoext: LegendPanel et WMS (paramètre LAYER au lieu de LAYERS)

Bonjour,

Les forums de georezo m’ont souvent permis d’avancer sans avoir besoin de poser une question donc merci à tous les contributeurs.

J’ai réalisé une interface GeoExt (1.1)+Extjs (3.4.0)+Openlayers (2.12) et je rencontre des difficultés avec les légendes des flux wms.

Pour afficher le panneau de légendes j’utilise :
var legendPanel = new GeoExt.LegendPanel({
            title : "Légende",
            defaults: {
                  labelCls: 'mylabel',
                  style: 'padding:5px',
                baseParams: {
                 FORMAT: 'image/png',
                  LEGEND_OPTIONS: 'forceLabels:on'
                    }      
                    },
                    bodyStyle: 'padding:5px',
                    width: 350,
                    autoScroll: true,
                    region: 'west'
                });

Le panneau s’affiche bien correctement, et la légende est bien chargée pour mes layers qui contiennent les données vecteurs (issues de ma base Postgis).
Par contre pour flux wms, je vois juste le nom du layer mais la légende ne s’affiche pas. Firebug m’indique que la requête envoyée est :
http://monserveur/cgi-bin/qgis_mapserv.fcgi?map=monprojet.qgs&TRANSPARENT=FALSE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&EXCEPTIONS=application%2Fvnd.ogc.se_xml&LAYER=monlayer&FORMAT=image/gif&SCALE=600000000000&FORMAT=image%2Fpng&LEGEND_OPTIONS=forceLabels%3Aon

Après quelque recherche je me suis rendu compte que pour les GetMap, le paramètre LAYERS était utilisé et non le paramètre LAYER (qui concernaient à priori les anciennes versions).
Si j’enlève le S à LAYERS dans mon url, cela fonctionne et le problème vient donc bien de là.

Comment se fait-il que par défaut le LegendPanel envoi le paramètre LAYER ? Comment le forcer à utiliser LAYERS ? J’imagine que je devrais juste rajouter une ligne LAYERS : ** dans mes paramètres mais  je ne vois pas quelle variable mettre pour récupérer tous les layers issus des flux wms.

Y’a surement une solution simple mais je sèche…

Merci d’avance,

Romain

Hors ligne

 

#2 Sat 27 April 2013 16:36

Tony VINCENT
Participant actif
Lieu: Poitiers
Date d'inscription: 13 Jan 2010
Messages: 86

Re: Geoext: LegendPanel et WMS (paramètre LAYER au lieu de LAYERS)

Bonjour,

J'utilise aussi GeoExt.LegendPanel pour générer la légende mais associé à Mapserver.
Et cela fonctionne correctement avec les flux WMS.

Voici, la requête envoyé :

Code:

http://monserveur?TRANSPARENT=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&EXCEPTIONS=application%2Fvnd.ogc.se_xml&LAYER=l_????_pc&FORMAT=image%2Fgif&SCALE=1733371.6628663363

C'est bien le paramètre LAYER qui est utilisé.

- Pour mapserver
http://mapserver.org/ogc/wms_server.html
- Pour Geoserver
http://docs.geoserver.org/latest/en/use … aphic.html

Et le paramètre LAYERS
- Pour QGis server
http://linfiniti.com/2010/08/qgis-mapse … he-masses/

Maintenant reste à trouver comment le modifier.


Je ne t'apport pas beaucoup de solution, mais je viens d'apprendre que la requête n'est pas la même  entre Mapserver, Geoserver et QGIS Server.



Tony

Hors ligne

 

#3 Sat 27 April 2013 16:46

Tony VINCENT
Participant actif
Lieu: Poitiers
Date d'inscription: 13 Jan 2010
Messages: 86

Re: Geoext: LegendPanel et WMS (paramètre LAYER au lieu de LAYERS)

Ah, peut être que la réponse à ton problème se trouve dans le code de la librairie de GeoExt.

Regarde dans ce fichier : WMSLegend.js (je n'ai pas le chemin)

Et dans cette partie :

Code:

...
/** private: method[getLegendUrl]
99         *  :param layerName: ``String`` A sublayer.
100         *  :param layerNames: ``Array(String)`` The array of sublayers,
101         *      read from this.layerRecord if not provided.
102         *  :return: ``String`` The legend URL.
103         *
104         *  Get the legend URL of a sublayer.
105         */
106        getLegendUrl: function(layerName, layerNames) {
107            var rec = this.layerRecord;
108            var url;
109            var styles = rec && rec.get("styles");
110            var layer = rec.getLayer();
111            layerNames = layerNames || [layer.params.LAYERS].join(",").split(",");
112    
113            var styleNames = layer.params.STYLES &&
114                                 [layer.params.STYLES].join(",").split(",");
115            var idx = layerNames.indexOf(layerName);
116            var styleName = styleNames && styleNames[idx];
117            // check if we have a legend URL in the record's
118            // "styles" data field
119            if(styles && styles.length > 0) {
120                if(styleName) {
121                    Ext.each(styles, function(s) {
122                        url = (s.name == styleName && s.legend) && s.legend.href;
123                        return !url;
124                    });
125                } else if(this.defaultStyleIsFirst === true && !styleNames &&
126                          !layer.params.SLD && !layer.params.SLD_BODY) {
127                    url = styles[0].legend && styles[0].legend.href;
128                }
129            }
130            if(!url) {
131                url = layer.getFullRequestString({
132                    REQUEST: "GetLegendGraphic",
133                    WIDTH: null,
134                    HEIGHT: null,
135                    EXCEPTIONS: "application/vnd.ogc.se_xml",
136                    LAYER: layerName,
137                    LAYERS: null,
138                    STYLE: (styleName !== '') ? styleName: null,
139                    STYLES: null,
140                    SRS: null,
141                    FORMAT: null
142                });
143            }
...

Tu as :

Code:

...
136                    LAYER: layerName,
137                    LAYERS: null,
...

essai de modifier comme ceci :

Code:

LAYER: null,
LAYERS: layerName,

Tony

Hors ligne

 

#4 Mon 29 April 2013 14:50

pargass31
Participant occasionnel
Date d'inscription: 26 Apr 2013
Messages: 12

Re: Geoext: LegendPanel et WMS (paramètre LAYER au lieu de LAYERS)

Bonjour Tony,

merci pour tes réponses, je n'avais pas pensé à modifier le code de la librairie!

J'ai fais la modification dans le fichier WMSLegend.js comme indiqué mais cela n'avait aucun effet.

Par contre dans le fichier GeoExt.js (présent dans le dossier GeoExt/script) j'ai modifié la ligne 140:

Code:

if(!url){url=layer.getFullRequestString({REQUEST:"GetLegendGraphic",WIDTH:null,HEIGHT:null,EXCEPTIONS:"application/vnd.ogc.se_xml",LAYERS:null,LAYER:layerName,STYLE:(styleName!=='')?styleName:null,STYLES:null,SRS:null,FORMAT:null,TIME:null});}

par

Code:

if(!url){url=layer.getFullRequestString({REQUEST:"GetLegendGraphic",WIDTH:null,HEIGHT:null,EXCEPTIONS:"application/vnd.ogc.se_xml",LAYERS:layerName,LAYER:null,STYLE:(styleName!=='')?styleName:null,STYLES:null,SRS:null,FORMAT:null,TIME:null});}

et cela fonctionne!

merci beaucoup.

Romain

Hors ligne

 

Pied de page des forums

Powered by FluxBB