Suite

WMSGetFeatureInfo à partir de deux couches WMS avec des paramètres différents

WMSGetFeatureInfo à partir de deux couches WMS avec des paramètres différents


J'ai une carte avec deux couches, qui peuvent (et se chevauchent presque toujours). Ces couches sont des WMS de GeoServer utilisant des vues SQL (POSTGIS). Ils utilisent la même requête mais avec un paramètre différent.

Mon contrôle de survol utilise WMSGetFeatureInfo pour obtenir des informations des deux couches à afficher dans une étiquette. Lorsque je l'ai fait dans le passé à partir de différentes couches avec des noms de paramètres différents, c'est facile. Fournissez tous les paramètres et toutes les couches et cela fonctionne.

Cependant, je ne sais pas comment gérer la situation où j'ai deux couches avec le même nom de paramètre (car elles proviennent de la même vue), mais une valeur différente. Si j'ajoute les deux couches, j'obtiens deux fois la même étiquette. Si j'ajoute le paramètre deux fois, il utilise le second ajouté.

Dans le contrôle de vol stationnaireavant d'obtenir des informations sur la fonctionnalitéécouteur d'événement, j'ai configuré les couches en utilisant :

self.control.layers = self.getLayers(); self.control.vendorParams.VIEWPARAMS = self.getParams();

avec ces méthodes définies comme :

//Cela me donnera l'un des deux résultats //La valeur ne dépend pas du calque utilisé car ils ont tous les deux la même vue //Cela ne semble dépendre que des VIEWPARAMS //Si je fournis les deux calques, j'obtiens le même résultat deux fois self.getLayers = function() { var layer = []; if (map.areaTypeLayer) {layers.push(map.areaTypeLayer); } else if (map.overlayLayer) {layers.push(map.overlayLayer); } couches de retour ; } ; //Seul le deuxième typecode a un effet self.getParams = function () { var params = 'typecode:' + map.areaTypeIdentifier; if (map.overlayTypeIdentifier) ​​params += ';typecode:' + map.overlayTypeIdentifier; paramètres de retour ; } ;

La seule solution de contournement à laquelle je puisse penser nécessite beaucoup de duplication et je préfère l'éviter si possible. Je pourrais dupliquer la couche dans GeoServer et donner à l'un d'eux un nom de paramètre différent. Ensuite, mon code peut créer chaque couche à partir d'une couche GeoServer différente.

Existe-t-il un meilleur moyen? Peut-être un moyen pour le contrôle d'appelerWMSGetFeatureInfodeux fois et fusionner les informations ? Survolez le code de contrôle ci-dessous si nécessaire.

esd.map.controls.hoverOver = function (map) { var self = this; self.control = null; self.init = function () { self.control = new OpenLayers.Control.WMSGetFeatureInfo({ url : esd.pathUtility.geoServerUrl + "/ESD/wms", infoFormat : 'application/json', sortie : 'features', format : new OpenLayers.Format.JSON, survol : true, queryVisible : true, autoActivate : true, vendorParams : { propertyName : 'label', VIEWPARAMS : null }, eventListeners : { getfeatureinfo : function (event) { var details = jQuery.parseJSON (event.text); map.showAreaInfo(self.buildLabel(details)); }, beforegetfeatureinfo: function (event) { map.showAreaInfo(null); self.control.layers = self.getLayers(); self.control. vendorParams.VIEWPARAMS = self.getParams(); } } }); } ; self.getLayers = function() { var couches = []; if (map.areaTypeLayer) {layers.push(map.areaTypeLayer); } else if (map.overlayLayer) {layers.push(map.overlayLayer); } couches de retour ; } ; self.getParams = function () { var params = 'typecode:' + map.areaTypeIdentifier; if (map.overlayTypeIdentifier) ​​params += ';typecode:' + map.overlayTypeIdentifier; paramètres de retour ; } ; self.buildLabel = function(details) { if (!details || !details.features || !details.features.length) return null; var étiquettes = []; for (var i = 0; i < details.features.length; i++) { labels.push({ label: details.features[i].properties.label}); } étiquettes de retour ; } self.init(); retour à la maîtrise de soi ; } ;

Voir la vidéo: GETTING STARTED WITH POSTGIS, GEOSERVER AND OPENLAYERS