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 Mon 17 November 2014 10:32

Martin Tov
Juste Inscrit !
Lieu: Grenoble
Date d'inscription: 5 Jan 2013
Messages: 6

GeoServer_OpenLayers: fonction Layer Switcher

Bonjour,

Je travaille actuellement sur la version 2.6.0 de GeoServer et cherche à réaliser une application web pour la visualisation des cartes via OpenLayers.
Mais je rencontre un problème pour ajouter un fonctionnalité de layer switcher qui permette de montrer/cacher les couches.
Cette fonctionnalité existe sur OpenLayers et elle se matérialise par un menu checkbox qui s'affiche après avoir cliqué sur une icone "+" en haut à droite du cadre d'affichage.

D'après la documentation que j'ai trouvé il suffit simplement de rajouter la ligne de commande map.addControl(new OpenLayers.Control.LayerSwitcher()); à la suite des autres dans le fichier source de la page web.

J'ai essayé mais le résultat n'est pas au rendez-vous. Non seulement le "+" et son menu checkbox n'apparaissent pas, mais en plus ceci me désactive l'options toolbar qui s'affiche normalement lorsque l'on clique sur l'icone située en haut à gauche du cadre.

La doc que j'ai trouvé date de 2008, peut-être que la configuration à évolué entre temps ou alors il y-a-t'il une subtilité du code que j'ai loupé??


Merci par avance de vos réponses,

Martin

Hors ligne

 

#2 Mon 17 November 2014 13:33

VianneyD
Participant assidu
Date d'inscription: 30 May 2011
Messages: 153

Re: GeoServer_OpenLayers: fonction Layer Switcher

Bonjour,

Il semble que la commande ajoutée ne soit pas correctement interprétée, bloquant les instructions qui suivent et (probablement) cause l'absence de l'option toolbar.
L'objet map est-il correctement défini ?

Je te conseille (si ce n'est pas déjà le cas) d'utiliser l'outil d'aide au développement de ton navigateur (touche F12) et raffraichir ta page pour faire apparaitre les messages d'erreurs renvoyés sur ta page.

Un extrait de ton code nous serait également utile pour t'aider.


Vianney Dugrain

Hors ligne

 

#3 Mon 17 November 2014 15:47

Martin Tov
Juste Inscrit !
Lieu: Grenoble
Date d'inscription: 5 Jan 2013
Messages: 6

Re: GeoServer_OpenLayers: fonction Layer Switcher

Merci pour ce retour!

Et effectivement après analyse avec l'outil de développement il y a un bel et bien un problème d'interprétation. Le code est le suivant et il m'est notifié qu'il y a une erreur pour la ligne de commande map.addControl(new OpenLayers.Control.LayerSwitcher());. Le commentaire retourné est "Uncaught TypeError: undefined is not a function". C'est un problème de syntaxe ou de définition de variable?

Code:

<script>
            var map;
            var untiled;
            var tiled;
            var pureCoverage = false;
            // pink tile avoidance
            OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
            // make OL compute scale according to WMS spec
            OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
        
            function init(){
                // if this is just a coverage or a group of them, disable a few items,
                // and default to jpeg format
                format = 'image/png';
                if(pureCoverage) {
                    document.getElementById('filterType').disabled = true;
                    document.getElementById('filter').disabled = true;
                    document.getElementById('antialiasSelector').disabled = true;
                    document.getElementById('updateFilterButton').disabled = true;
                    document.getElementById('resetFilterButton').disabled = true;
                    document.getElementById('jpeg').selected = true;
                    format = "image/jpeg";
                }
            
                var bounds = new OpenLayers.Bounds(
                    -74.047185, 40.679648,
                    -73.90782, 40.882078
                );
                var options = {
                    controls: [],
                    maxExtent: bounds,
                    maxResolution: 0.0007907421875,
                    projection: "EPSG:4326",
                    units: 'degrees'
                };
                map = new OpenLayers.Map('map', options);
            
                // setup tiled layer
                tiled = new OpenLayers.Layer.WMS(
                    "tiger:poly_landmarks - Tiled", "http://localhost:8001/geoserver/tiger/wms",
                    {
                        "STYLES": '',
                        "LAYERS": 'tiger:poly_landmarks',
                        format: format
                    },
                    {
                        buffer: 0,
                        displayOutsideMaxExtent: true,
                        isBaseLayer: true,
                        yx : {'EPSG:4326' : true}
                    } 
                );
            
                // setup single tiled layer
                untiled = new OpenLayers.Layer.WMS(
                    "tiger:poly_landmarks - Untiled", "http://localhost:8001/geoserver/tiger/wms",
                    {
                        "STYLES": '',
                        "LAYERS": 'tiger:poly_landmarks',
                        format: format
                    },
                    {
                       singleTile: true, 
                       ratio: 1, 
                       isBaseLayer: true,
                       yx : {'EPSG:4326' : true}
                    } 
                );
        
                map.addLayers([untiled, tiled]);

                // build up all controls
                
                map.addControl(new OpenLayers.Control.PanZoomBar({
                    position: new OpenLayers.Pixel(2, 15)
                }));
                map.addControl(new OpenLayers.Control.Navigation());
                map.addControl(new OpenLayers.Control.Scale($('scale')));
                map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
                map.zoomToExtent(bounds);
        map.addControl(new OpenLayers.Control.LayerSwitcher());
                
                
                
                // wire up the option button
                var options = document.getElementById("options");
                options.onclick = toggleControlPanel;
                
                // support GetFeatureInfo
                map.events.register('click', map, function (e) {
                    document.getElementById('nodelist').innerHTML = "Loading... please wait...";
                    var params = {
                        REQUEST: "GetFeatureInfo",
                        EXCEPTIONS: "application/vnd.ogc.se_xml",
                        BBOX: map.getExtent().toBBOX(),
                        SERVICE: "WMS",
                        INFO_FORMAT: 'text/html',
                        QUERY_LAYERS: map.layers[0].params.LAYERS,
                        FEATURE_COUNT: 50,
                        "Layers": 'tiger:poly_landmarks',
                        WIDTH: map.size.w,
                        HEIGHT: map.size.h,
                        format: format,
                        styles: map.layers[0].params.STYLES,
                        srs: map.layers[0].params.SRS};
                    
                    // handle the wms 1.3 vs wms 1.1 madness
                    if(map.layers[0].params.VERSION == "1.3.0") {
                        params.version = "1.3.0";
                        params.j = parseInt(e.xy.x);
                        params.i = parseInt(e.xy.y);
                    } else {
                        params.version = "1.1.1";
                        params.x = parseInt(e.xy.x);
                        params.y = parseInt(e.xy.y);
                    }
                        
                    // merge filters
                    if(map.layers[0].params.CQL_FILTER != null) {
                        params.cql_filter = map.layers[0].params.CQL_FILTER;
                    } 
                    if(map.layers[0].params.FILTER != null) {
                        params.filter = map.layers[0].params.FILTER;
                    }
                    if(map.layers[0].params.FEATUREID) {
                        params.featureid = map.layers[0].params.FEATUREID;
                    }
                    OpenLayers.loadURL("http://localhost:8001/geoserver/tiger/wms", params, this, setHTML, setHTML);
                    OpenLayers.Event.stop(e);
                });
            }
            
            // sets the HTML provided into the nodelist element
            function setHTML(response){
                document.getElementById('nodelist').innerHTML = response.responseText;
            };
            
            // shows/hide the control panel
            function toggleControlPanel(event){
                var toolbar = document.getElementById("toolbar");
                if (toolbar.style.display == "none") {
                    toolbar.style.display = "block";
                }
                else {
                    toolbar.style.display = "none";
                }
                event.stopPropagation();
                map.updateSize()
            }
            
            // Tiling mode, can be 'tiled' or 'untiled'
            function setTileMode(tilingMode){
                if (tilingMode == 'tiled') {
                    untiled.setVisibility(false);
                    tiled.setVisibility(true);
                    map.setBaseLayer(tiled);
                }
                else {
                    untiled.setVisibility(true);
                    tiled.setVisibility(false);
                    map.setBaseLayer(untiled);
                }
            }
            
            // Transition effect, can be null or 'resize'
            function setTransitionMode(transitionEffect){
                if (transitionEffect === 'resize') {
                    tiled.transitionEffect = transitionEffect;
                    untiled.transitionEffect = transitionEffect;
                }
                else {
                    tiled.transitionEffect = null;
                    untiled.transitionEffect = null;
                }
            }
            
            // changes the current tile format
            function setImageFormat(mime){
                // we may be switching format on setup
                if(tiled == null)
                  return;
                  
                tiled.mergeNewParams({
                    format: mime
                });
                untiled.mergeNewParams({
                    format: mime
                });
                /*
                var paletteSelector = document.getElementById('paletteSelector')
                if (mime == 'image/jpeg') {
                    paletteSelector.selectedIndex = 0;
                    setPalette('');
                    paletteSelector.disabled = true;
                }
                else {
                    paletteSelector.disabled = false;
                }
                */
            }
            
            // sets the chosen style
            function setStyle(style){
                // we may be switching style on setup
                if(tiled == null)
                  return;
                  
                tiled.mergeNewParams({
                    styles: style
                });
                untiled.mergeNewParams({
                    styles: style
                });
            }
            
            // sets the chosen WMS version
            function setWMSVersion(wmsVersion){
                // we may be switching style on setup
                if(wmsVersion == null)
                  return;
                  
                if(wmsVersion == "1.3.0") {
                   origin = map.maxExtent.bottom + ',' + map.maxExtent.left;
                } else {
                   origin = map.maxExtent.left + ',' + map.maxExtent.bottom;
                }
                  
                tiled.mergeNewParams({
                    version: wmsVersion,
                    tilesOrigin : origin
                });
                untiled.mergeNewParams({
                    version: wmsVersion
                });
            }
            
            function setAntialiasMode(mode){
                tiled.mergeNewParams({
                    format_options: 'antialias:' + mode
                });
                untiled.mergeNewParams({
                    format_options: 'antialias:' + mode
                });
            }
            
            function setPalette(mode){
                if (mode == '') {
                    tiled.mergeNewParams({
                        palette: null
                    });
                    untiled.mergeNewParams({
                        palette: null
                    });
                }
                else {
                    tiled.mergeNewParams({
                        palette: mode
                    });
                    untiled.mergeNewParams({
                        palette: mode
                    });
                }
            }
            
            function setWidth(size){
                var mapDiv = document.getElementById('map');
                var wrapper = document.getElementById('wrapper');
                
                if (size == "auto") {
                    // reset back to the default value
                    mapDiv.style.width = null;
                    wrapper.style.width = null;
                }
                else {
                    mapDiv.style.width = size + "px";
                    wrapper.style.width = size + "px";
                }
                // notify OL that we changed the size of the map div
                map.updateSize();
            }
            
            function setHeight(size){
                var mapDiv = document.getElementById('map');
                
                if (size == "auto") {
                    // reset back to the default value
                    mapDiv.style.height = null;
                }
                else {
                    mapDiv.style.height = size + "px";
                }
                // notify OL that we changed the size of the map div
                map.updateSize();
            }
            
            function updateFilter(){
                if(pureCoverage)
                  return;
            
                var filterType = document.getElementById('filterType').value;
                var filter = document.getElementById('filter').value;
                
                // by default, reset all filters
                var filterParams = {
                    filter: null,
                    cql_filter: null,
                    featureId: null
                };
                if (OpenLayers.String.trim(filter) != "") {
                    if (filterType == "cql") 
                        filterParams["cql_filter"] = filter;
                    if (filterType == "ogc") 
                        filterParams["filter"] = filter;
                    if (filterType == "fid") 
                        filterParams["featureId"] = filter;
                }
                // merge the new filter definitions
                mergeNewParams(filterParams);
            }
            
            function resetFilter() {
                if(pureCoverage)
                  return;
            
                document.getElementById('filter').value = "";
                updateFilter();
            }
            
            function mergeNewParams(params){
                tiled.mergeNewParams(params);
                untiled.mergeNewParams(params);
            }
        </script>

Hors ligne

 

#4 Thu 04 December 2014 17:10

Martin Tov
Juste Inscrit !
Lieu: Grenoble
Date d'inscription: 5 Jan 2013
Messages: 6

Re: GeoServer_OpenLayers: fonction Layer Switcher

Merci Alexandre!

Le problème vient en fait de la version de la librairie OpenLayers qu'utilise GeoServer.
Visiblement elle ne supporte pas la fonction Layer Switcher. Dans le code source de votre page web il faut remplacer le chemin d'import de la librairie qui est initialement sous la forme:

<script src="http://localhost:8001/geoserver/openlayers/OpenLayers.js" type="text/javascript"></script>

par le chemin pointant directement vers la librairie en ligne d'OpenLayers :

<script src="http://dev.openlayers.org/OpenLayers.js" type="text/javascript"></script>

Hors ligne

 

#5 Fri 05 December 2014 14:03

VianneyD
Participant assidu
Date d'inscription: 30 May 2011
Messages: 153

Re: GeoServer_OpenLayers: fonction Layer Switcher

Bien vu !
Merci pour le suivi.


Vianney Dugrain

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo