Min / max livello di zoom in OpenLayers
-
27-09-2019 - |
Domanda
sto usando OpenLayers per visualizzare una mappa in una pagina web. Sto usando tessere dal CloudMade, ma gli stessi problemi si verificano con le piastrelle Mapnik da OpenStreetMap.
Sto cercando di limitare la mappa in modo che l'utente non può ingrandire tutta la via d'uscita per visione del mondo -. Voglio loro di rimanere più o meno uno zoom livello di città al minimo
Ho provato con le proprietà minZoomLevel
/ maxZoomLevel
/ numZoomLevels
; solo le proprietà maxZoomLevel
e numZoomLevels
sembra funzionare, mentre la proprietà minZoomLevel
sembra essere completamente ignorato.
C'è un altro modo per raggiungere questo obiettivo?
Soluzione
minZoomLevel non è supportato per strati XYZ, di cui OSM è una sottoclasse.
Si vedano le seguenti biglietti per soluzioni alternative:
- http://trac.osgeo.org/openlayers/ticket/2909 ( applica Offset uno zoom)
- http://trac.osgeo.org/openlayers/ticket/2189 ( aggiungi Patch minZoomLevel)
Altri suggerimenti
Si potrebbe ignorare la funzione isValidZoomLevel
. Qualcosa di simile a questo (non testato):
OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
return ( (zoomLevel != null) &&
(zoomLevel >= 2) && // set min level here, could read from property
(zoomLevel < this.getNumZoomLevels()) );
}
Modifica
In alternativa si avrebbe bisogno di ignorare le risoluzioni disponibili, vedere l'esempio qui: http: // dev.openlayers.org/examples/zoomLevels.html
Ho trovato il modo più semplice per limitare i livelli maxZoom per uno strato di XYZ è stato quello di sovrascrivere il metodo getNumZoomLevels:
map.getNumZoomLevels = function(){
return 10;
};
Questa pevents zoom oltre il livello 10 e anche disegna il controllo zoomBar correttamente. Questa e una combinazione dell'opzione zoomOffset
dovrebbe consentire di controllare facilmente min zoom / max, senza dover pasticciare con risoluzioni o sottoclassi.
Altre risposte qui si riferiscono alle versioni OpenLayers precedenti alla versione 3.
Con OpenLayers 3, è possibile utilizzare l'opzione maxZoom
mappa durante l'inizializzazione della mappa, come segue:
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
})
});
Maggiori informazioni possono essere trovate in OpenLayers documentazione: http: // OpenLayers .org / it / v3.0.0 / doc / tutorial / concepts.html
Ora io uso questo in "Vista":
view: new ol.View({
center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
zoom: 15,
maxZoom: 17,
minZoom: 6
}),
E funziona benissimo
La definizione di risoluzioni non risolve il problema (anche in v2.1) - non ho trovato alcuna correzione pernament per questo, così ho fatto la mia zoombar in JS - questo è quello che mi sento di raccomandare a tutti coloro che incontra problemi con zoombar con piastrelle personalizzate.
Ho finito con questa soluzione come io non riuscivo a capire come utilizzare zoomOffset nella mia messa a punto.
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;
}
ho provato qualcosa di simile e funziona per me:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
La risposta migliore che ho trovato (tra cui un esempio) era a OpenLayers - limitare il numero di livelli di zoom . Non mi incollo qui, si prega di vedere le istruzioni laggiù.