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?

Était-ce utile?

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:

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top