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

Annonce

Rencontres QGIS 2025

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

#1 Thu 16 July 2009 10:10

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

[OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour à tous,

J'aurais voulu savoir comment on peut récupérer l'attribut que renvoie la méthode GetFeatureInfo sous OL. En fait, j'ai crée une fonction qui récupère le nom d'une commune lorsque je clique dessus grâce à GetFeatureInfo.
Cependant, je voudrais récupérer ce nom en tant que variable pour pouvoir m'en servir avec du PHP et afficher d'autres données. Mais la fonction construit une URL et donc je ne vois pas comment je pourrais stocker mon nom de commune dans une variable.

Fonction :

Code:

        function infos_att() {
            map.events.register('click', map, function (e) {
                OpenLayers.Util.getElement('north').innerHTML = "Loading... please wait...";
                var url =  wms1.getFullRequestString({
                                        REQUEST: "GetFeatureInfo",
                                        EXCEPTIONS: "application/vnd.ogc.se_xml",
                                        BBOX: map.getExtent().toBBOX(),
                                        X: e.xy.x,
                                        Y: e.xy.y,
                                        INFO_FORMAT: 'text/plain',
                                        QUERY_LAYERS: wms1.params.LAYERS,
                                        WIDTH: map.size.w,
                                        HEIGHT: map.size.h});
                OpenLayers.loadURL(url, '', this, setHTML);
                OpenLayers.Util.getElement('north').innerHTML = url;
                //open(url);
            });
                      
            function setHTML(response) {
                OpenLayers.Util.getElement('north').innerHTML = response.responseText;
            }

Comment puis-je faire ?

Hors ligne

 

#2 Fri 17 July 2009 10:08

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Je me permets de relancer le sujet car j'aurai voulu savoir aussi quelles étaient les possibilités offertes par le nouveau contrôle GetFeatureInfo d'OL de la dernière version (2.8) ?

Comment fonctionne ce nouveau contrôle exactement ? Peut-on interroger plusieurs couches ?

Hors ligne

 

#3 Fri 17 July 2009 10:28

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

bonjour,

Toutes les informations sont sur le site d'OpenLayers :
* La doc : http://dev.openlayers.org/releases/Open … fo-js.html
* un premier exemple : http://www.openlayers.org/dev/examples/ … ntrol.html
* un deuxième exemple : http://www.openlayers.org/dev/examples/ … popup.html

Code:

 info = new OpenLayers.Control.WMSGetFeatureInfo({
            url: 'http://demo.opengeo.org/geoserver/wms', 
            title: 'Identify features by clicking',
            queryVisible: true,
            eventListeners: {
                getfeatureinfo: function(event) {
                    map.addPopup(new OpenLayers.Popup.FramedCloud(
                        "chicken", 
                        map.getLonLatFromPixel(event.xy),
                        null,
                        event.text,
                        null,
                        true
                    ));
                }
            }
        });
        map.addControl(info);
        info.activate();

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#4 Fri 17 July 2009 14:36

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour,

J'ai testé le code du deuxième exemple dans mon interface (en localhost) et j'ai un problème au niveau du proxy.
En fait quand je clique sur un objet, j'ai une popup qui s'ouvre et qui affiche carrément le code du fichier proxy.cgi.

J'ai utilisé le proxy.cgi qui se trouve dans le dossier examples de OpenLayers-2.8. Est-ce qu'il faut bien utiliser celui-là ? Ou faut-il le déplacer et ou le modifier ?

Hors ligne

 

#5 Fri 17 July 2009 14:44

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour,

Je pense qu'il faut le déplacer dans le répertoire cgi-bin/ du serveur (si tu utilises Apache).

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#6 Fri 17 July 2009 15:00

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

J'ai déplacé proxy.cgi dans le repertoire cgi-bin et j'ai mis ça dans mon fichier html :

Code:

OpenLayers.ProxyHost = "http://localhost/cgi-bin/proxy.cgi?url=";

Mais j'ai une erreur Internal Server Error dans ma popup maintenant.

Hors ligne

 

#7 Fri 17 July 2009 15:11

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Vérifiez que l'alias cgi-bin est correctement configuré dans le fichier de configuration d'apache (vhost en particulier) ?

Sinon je ne vois pas trop, une erreur de ce type peut être tout et n'importe quoi hmm

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#8 Fri 17 July 2009 16:07

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Euh ben j'ai vérifié la config d'Apache et il n'y a rien qui m'ait choqué.

J'ai aussi testé de lancer l'adresse : "http://localhost/cgi-bin/proxy.cgi" dans le navigateur mais j'ia toujours l'erreur Internal Server Error.

Hors ligne

 

#9 Fri 17 July 2009 16:38

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Alors je continue d'avancer là dessus et donc j'ai mis OpenLayers.ProxyHost=""; (comme je sui sen localhost) et je l'ai intégré dans ma fonction load().

Ce qui donne :

Code:

<html>
  <head>
    <title>GetFeatureInfo Popup</title>
    <script src="OpenLayers-2.8/lib/OpenLayers.js"></script>
    <link rel="stylesheet" href="OpenLayers-2.8/theme/default/style.css" type="text/css" />
    
    <script type="text/javascript">
    
    var map, info;
    
    function load() {
    
        OpenLayers.ProxyHost = "";
        
        map= new OpenLayers.Map('map', {maxExtent:new OpenLayers.Bounds(10000, 1600000, 1200000, 2700000),
                                                maxResolution: 1571.4285714285713,
                                                units:'m',
                                                projection:'EPSG:27572',
                                                numZoomLevels: 12});
        
        map.addControl (new OpenLayers.Control.PanZoomBar());
    
        var communes = new OpenLayers.Layer.WMS("communes_nat", 
                   "http://localhost/tilecache/tilecache.py?", {layers: "communes_nat", transparent:true, format: "image/png"});
        map.addLayer(communes);

        var scan25 = new OpenLayers.Layer.WMS("scan25", 
                   "http://localhost/tilecache/tilecache.py?", {layers: "scan25", format: "image/png"});
        map.addLayer(scan25);

        info = new OpenLayers.Control.WMSGetFeatureInfo({
            url: 'http://localhost/tilecache/tilecache.py?', 
            title: 'Identify features by clicking',
            queryVisible: true,
            eventListeners: {
                getfeatureinfo: function(event) {
                    map.addPopup(new OpenLayers.Popup.FramedCloud(
                        "chicken", 
                        map.getLonLatFromPixel(event.xy),
                        null,
                        event.text,
                        null,
                        true
                    ));
                }
            }
        });
        map.addControl(info);
        info.activate();

        map.addControl(new OpenLayers.Control.LayerSwitcher());
        map.zoomToMaxExtent();
    }

  </script>

  </head>

  <body onload="load()">

      <div id="map" class="smallmap"></div>

  </body>
</html>

Et donc lorsque je clique sur une commune, j'ai ma popup qui apparaît avec ceci :

Code:

An error occurred: can't find resolution index for 10214.285714. Available resolutions are: [1571.4285714285713, 785.71428571428567, 392.85714285714283, 196.42857142857142, 98.214285714285708, 49.107142857142854, 24.553571428571427, 12.276785714285714, 6.1383928571428568, 3.0691964285714284, 1.5345982142857142, 0.7672991071428571]

Je sais que cela vient de tilecache mais comment pallier à cela ?

J'ai également essayé de mettre comme url : "http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/Apache/htdocs/projet_test/natura.map&", mais dans ce cas là, la popup ne s'affiche pas.

Que faire ?

Hors ligne

 

#10 Fri 17 July 2009 16:50

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour,

Pour le problème lié à TC, il faut rajouter l'index manquant dans le tableau resolution dans la config de TC.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#11 Fri 17 July 2009 16:59

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Mais normalement, ma résolution max est censée être 1571.4285714285713 puisque c'est ce que je trouve quand je fais un map.getResolution sur la max extent.

Et la, il me demande l'index 10214.285714.

C'est normal ?

Hors ligne

 

#12 Tue 21 July 2009 09:56

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour,

Je progresse toujours sur ce sujet la, et j'ai une question plus générale que technique.

Après plusieurs tests, j'arrive bien à récupérer les infos sur les différentes couches que j'affiche.
Cependant, c'est juste une url qui s'affiche dans une pop-up et qui me renvoie les attributs demandés (du style : "GetFeatureInfo results: Layer 'communes_nat' Feature 22: nom_com = 'USSAT'").
Ce que je voudrais arriver à faire, c'est pouvoir :
     - remodéliser ce texte (donc améliorer l'affichage)
     - récupérer l'attribut affiché dans une variable (ici le nom de la commune) afin de proposer à l'utilisateur une "fiche détaillée" de l'objet cliqué (en récupérant dans ma base, les données rattachées à ce nom de commune)

J'espère que j'ai été assez clair. J'ai vu pas mal de sites carto développés en MapServer et OL et qui permettent ce genre de choses.

Quelles techniques seraient les plus efficaces ?

Hors ligne

 

#13 Tue 21 July 2009 10:17

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour,

Lire la doc pour configurer correctement MapServer pour qu'il renvoie ce que tu veux :

Configuring for GetFeatureInfo Requests:

You must set the layer TEMPLATE parameter for the layer to be queryable by GetFeatureInfo requests. For requests of type “text/html” you should also set the layer HEADER and FOOTER parameters.

For GetFeatureInfo requests of GML you must set the layer to DUMP TRUE in the mapfile. As of MapServer 4.6 you must also set the gml_* metadata for the layer attributes to be served (see the Layer Object metadata in the Reference Section later in this document).

Here are working examples of GetFeatureInfo requests: text/plain / text/html / gml (for gml, your browser might ask you to save the file, if so save it locally as a .gml file and view it in a text editor)


En bas de la section : http://mapserver.org/ogc/wms_server.htm … r-your-wms

Autrement dit, je pense qu'il faut que tu choisisses le format GML et que tu créés un template.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#14 Tue 21 July 2009 10:23

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour Yves, merci pour ta réponse rapide.

Ok je vais regarder la config de MapServer. Donc le format GML me permettrait de récupérer l'attribut (ou les attributs) affiché en tant que variable, par exemple ? Ou le format GML permet uniquement de "remodéliser" l'affichage ?

Hors ligne

 

#15 Tue 21 July 2009 10:26

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Maxime31 a écrit:

Bonjour Yves, merci pour ta réponse rapide.

Ok je vais regarder la config de MapServer. Donc le format GML me permettrait de récupérer l'attribut (ou les attributs) affiché en tant que variable, par exemple ? Ou le format GML permet uniquement de "remodéliser" l'affichage ?


Le GML est un dérivé du XML donc tu auras du code facilement parsable par du JavaScript. Après tu en fais ce que tu veux. Si tu veux afficher directement du code HTML, tu utilises le format HTML et dans ton template tu écris ton code HTML que tu veux afficher. Tout dépend de tes besoins wink

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#16 Tue 21 July 2009 10:33

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Ok merci je vais creuser tout ça

Hors ligne

 

#17 Tue 21 July 2009 13:01

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

J'arrive maintenant à afficher mes attributs en GML donc ca c'est bon. Je vois aussi comment parser un XML avec le Javascript.
Mais je ne vois pas comment récupérer le document XML crée par le contrôle WMSGetFeatureInfo.

Voila mon code :

Code:

info = new OpenLayers.Control.WMSGetFeatureInfo({
            url: 'http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/Apache/htdocs/projet_test/natura.map', 
            title: 'Identify features by clicking',
            queryVisible: true,
            eventListeners: {
                getfeatureinfo: function(event) {
                    map.addPopup(new OpenLayers.Popup.FramedCloud(
                        "chicken", 
                        map.getLonLatFromPixel(event.xy),
                        null,
                        event.text,
                        null,
                        true
                    ));
                }
            }
        });
        map.addControl(info);
        info.activate();

Et quand je clique sur un objet sur ma carte et qu'ensuite j'affiche le code source, j'ai bien le XML qui est crée.

Mais comment le récupérer dans mon code pour le parser ?

----------
----------

C'est bon, j'ai trouvé ! Le XML correspond à event.text dans mon code. Y'a plus qu'à le récupérer dans une variable et on en fait ce qu'on en veut !

Dernière modification par Maxime31 (Tue 21 July 2009 15:00)

Hors ligne

 

#18 Tue 21 July 2009 16:08

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Donc j'ai fait comme ceci pour afficher le nom de ma commune :

Code:

        info = new OpenLayers.Control.WMSGetFeatureInfo({
            url: 'http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/Apache/htdocs/projet_test/natura.map', 
            title: 'Identify features by clicking',
            queryVisible: true,
            eventListeners: {
                getfeatureinfo: function(event) {
                    map.addPopup(new OpenLayers.Popup.FramedCloud(
                        "chicken", 
                        map.getLonLatFromPixel(event.xy),
                        null,
                        event.text,
                        null,
                        true
                    ));
                    
                    var xml=event.text;
                    var nom = xml.getElementsByTagName('nom_com')[0].firstChild.nodeValue;
                    alert(nom);
                    
                }
            }
        });

Mais cela ne marche pas...

J'ai ma popup qui s'affiche mais après rien, j'ai juste le sablier comme curseur et il ne se passe rien d'autre.

Est-ce une erreur dans la syntaxe JS ou est-ce qu'il ne considère pas event.text comme un fichier XML ?

Hors ligne

 

#19 Wed 22 July 2009 09:28

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Voila le fichier XML que me renvoie le paramètre "event.text" :

Code:

<?xml version="1.0" encoding="ISO-8859-1"?>

<msGMLOutput 
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <communes_nat_layer>
        <communes_nat_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:27572">
                    <gml:coordinates>520277.000003,1837131.000015 533555.000002,1852396.000014</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <nom_com>TOULOUSE</nom_com>
        </communes_nat_feature>
    </communes_nat_layer>
</msGMLOutput>

Mais comme je le dis dans le post précédent, je n'arrive pas à récupérer le texte contenu dans la balise <nom_com>.

Avec JS, j'ai fait comme ceci :

Code:

var nom = xml.getElementsByTagName('nom_com')[0].firstChild.nodeValue;

Mais cela ne marche pas. Est-ce normal ?

Hors ligne

 

#20 Thu 23 July 2009 09:50

Maxime31
Participant assidu
Date d'inscription: 3 Sep 2008
Messages: 175

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Bonjour,

Est-ce que je pourrais utiliser le XML Parser d'OL ? Parce que, si "event.text" est considéré comme une chaîne de caractères, ne serais-je pas confronté au même problème ?

Hors ligne

 

#21 Tue 25 August 2009 10:16

Remi01
Participant actif
Date d'inscription: 18 Jan 2007
Messages: 75

Re: [OpenLayers] Récupérer attribut GetFeatureInfo

Début de réponse en ce qui concerne le parsing d'un GML ...

Voila le GML reçu :

Code:

<msGMLOutput 
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <communes_layer>
        <communes_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:2154">
                    <gml:coordinates>359984.100000,6292980.000000 367016.600000,6301882.000000</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <nom_commune>RIVIERE-SAAS-ET-GOURBY</nom_commune>
        </communes_feature>
    </communes_layer>
    <cdc_layer>
        <cdc_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:2154">
                    <gml:coordinates>359984.100000,6288550.700000 383175.200000,6313139.800000</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <nom_cdc>CC du Grand Dax</nom_cdc>
        </cdc_feature>
    </cdc_layer>
</msGMLOutput>

Et pour récupérer les attributs, je fais par exemple :

Code:

commune = evt.features[0].attributes;
                        
var html = "<BR><BR><b>Commune</b> :  " + commune["nom_commune"];

nom_commune étant le nom du champ de ma table PostGis, diffusé en WMS dans le mapfile

Par contre si connaitre le nombre de couches cliquées est possible (evt.features.length), je n'ai pas trouvé la syntaxe pour connaitre le nom du layer qui correspond à chaque feature, pour par exemple connaitre la couche qui correspond à evt.features[0].

Si quelqu'un à une idée ?

Rémi

Dernière modification par Remi01 (Tue 25 August 2009 10:20)

Hors ligne

 

Pied de page des forums

Powered by FluxBB