#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


