Min / max niveau de zoom dans OpenLayers
-
27-09-2019 - |
Question
J'utilise OpenLayers pour afficher une carte dans une page Web. J'utilise des tuiles de CloudMade, mais les mêmes problèmes se produisent avec les tuiles Mapnik de OpenStreetMap.
Je suis en train de restreindre la carte afin que l'utilisateur ne peut pas zoomer tout le chemin à la vue du monde -. Je veux qu'ils restent à peu près un zoom niveau de la ville au minimum
Je l'ai essayé d'utiliser les propriétés minZoomLevel
/ maxZoomLevel
/ numZoomLevels
; seules les propriétés de maxZoomLevel
et numZoomLevels
semblent fonctionner, alors que la propriété minZoomLevel
semble être complètement ignoré.
Y at-il une autre façon d'y parvenir?
La solution
minZoomLevel est pas prise en charge pour les couches XYZ, dont OSM est une sous-classe.
Voir les billets suivants pour des solutions de contournement:
- http://trac.osgeo.org/openlayers/ticket/2909 ( appliquer un zoom offset)
- http://trac.osgeo.org/openlayers/ticket/2189 ( ajouter Patch minZoomLevel)
Autres conseils
Vous pourriez passer outre la fonction isValidZoomLevel
. Quelque chose comme ça (non testé):
OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
return ( (zoomLevel != null) &&
(zoomLevel >= 2) && // set min level here, could read from property
(zoomLevel < this.getNumZoomLevels()) );
}
EDIT
Ou vous devez remplacer les résolutions disponibles, voir l'exemple ici: http: // dev.openlayers.org/examples/zoomLevels.html
I trouvé le moyen le plus simple de limiter les niveaux de maxZoom pour une couche de XYZ est de substituer la méthode getNumZoomLevels:
map.getNumZoomLevels = function(){
return 10;
};
Ce pevents zoom au-delà du niveau 10 et tire également le contrôle zoomBar correctement. Ceci et une combinaison de l'option zoomOffset
devrait vous permettre de contrôler facilement min / max zoom sans avoir à déranger avec des résolutions ou des sous-classes.
D'autres réponses ici font référence aux versions OpenLayers avant la version 3.
Avec OpenLayers 3, vous pouvez utiliser l'option carte maxZoom
lors de l'initialisation de la carte, comme suit:
var map = new ol.Map({
target: 'mapcontainer-001',
layers: layers, // Layers need to be initialized previously
view: new ol.View({
center: ol.proj.transform([-5.12345, 42.12345], 'EPSG:4326', 'EPSG:3857'),
zoom: 12,
maxZoom: 19
})
});
Plus d'informations peuvent être trouvées dans la documentation OpenLayers: http: // OpenLayers .org / fr / v3.0.0 / doc / tutorials / concepts.html
Maintenant, j'utiliser dans la "vue":
view: new ol.View({
center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
zoom: 15,
maxZoom: 17,
minZoom: 6
}),
Et cela fonctionne très bien
Définition de résolutions ne résout pas le problème (même en v2.1) - Je ne trouve pas de solution pernament pour cela, donc je fait mon zoombar dans JS - c'est ce que je recommande à tous ceux qui rencontre des problèmes avec zoombar en utilisant des tuiles personnalisées.
J'ai fini avec cette solution que je ne pouvais pas comprendre comment utiliser zoomOffset dans ma configuration.
map.getNumZoomLevels = function(){
return (options.maxzoom-options.minzoom+1);
};
map.isValidZoomLevel = function(zoomLevel) {
var valid = ( (zoomLevel != null) &&
(zoomLevel >= options.minzoom) &&
(zoomLevel <= options.maxzoom) );
if(!valid && map.getZoom() == 0){
map.zoomTo(options.maxzoom - (options.maxzoom - options.minzoom)/2);
}
return valid;
}
J'ai essayé quelque chose comme ça et ça marche pour moi:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
La meilleure réponse que je trouve (y compris un exemple) était OpenLayers - limiter le nombre de niveaux de zoom . Je ne suis pas le coller ici, s'il vous plaît voir les instructions là-bas.