Je suis nouveau dans OpenLayers, et j'essaie de comprendre comment restreindre la quantité qu'un utilisateur peut faire un panoramique et zoomer vers l'extérieur. Pour cette application, l'utilisateur choisit une zone locale de la carte et clique sur un bouton lui demandant d'utiliser cette zone, et nous voulons qu'il ne puisse pas effectuer de panoramique ou de zoom avant au-delà de cette étendue. Lorsque l'utilisateur clique sur le bouton, je fixe les paramètres maxRestrictedExtent et maxExtent à l'étendue actuelle en utilisant map.GetExtent(). Je fixe également la maxResolution à la résolution actuelle en appelant map.getResolution(). Les panoramiques fonctionnent parfaitement, mais pas les zooms. L'utilisateur est toujours en mesure d'effectuer un zoom arrière au-delà de la résolution donnée.
J'ai ajouté un code qui, chaque fois que l'étendue change, imprime l'étendue et la résolution actuelles. Au sixième changement d'étendue, je définis les trois propriétés cartographiques énumérées ci-dessus et j'imprime les paramètres. Cela me permet de faire un zoom avant à partir de la vue globale du monde jusqu'à une zone suffisamment localisée pour les tests. Au sixième changement d'étendue, je fais un zoom arrière avec la molette de la souris et je vois l'étendue et la résolution qui ont été choisies. En faisant un zoom arrière avec un clic de la molette de ma souris, l'impression suivante montre clairement que la résolution est effectivement plus grande que le paramètre map.maxResolution, et je peux voir que la zone visible est plus grande que celle choisie. J'ai essayé un certain nombre de choses, y compris le réglage de maxExtent, mais rien ne semble entraîner la restriction de l'étendue maximale zoomable. Je peux à nouveau zoomer jusqu'à la vue du monde entier si je le souhaite.
Vous pouvez voir ci-dessous le code de test que j'ai écrit et qui instancie une carte avec un contrôle de navigation et une couche OSM, puis s'enregistre pour l'événement moveend de la carte, en créant une fonction de rappel qui fait ce que j'ai décrit, et enfin zoome au maximum.
Quelqu'un a-t-il une idée de ce que je devrais faire différemment afin de limiter la possibilité de faire un zoom arrière à l'étendue maximale choisie ? J'espère que je n'aurai pas à réajuster manuellement l'étendue pour la ramener dans la limite de l'étendue maximale, mais si c'est le cas, le fait de le savoir m'aiderait au moins.
P.S. - Malheureusement, tout le html ne s'affiche pas, puisque de à juste avant le style, et de à après le final sont traités comme du html. La seule chose qui manque vraiment est que j'appelle init() dans l'événement onload du corps.
<style type="text/css">
html, body {
width: 100%;
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 100%;
margin: 0;
}
</style>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
var map;
var num;
function init(){
map = new OpenLayers.Map('map', { controls: [] });
map.addControl(new OpenLayers.Control.Navigation());
map.addLayer(new OpenLayers.Layer.OSM());
map.events.register("moveend", this, function (e) {
if (num == 5)
{
map.maxExtent = map.getExtent();
map.restrictedExtent = map.maxExtent;
map.maxResolution = map.getResolution();
console.log(num++ + ": Setting maxExtent/restrictedExtent: " + map.maxExtent + "; resolution: " + map.maxResolution);
}
else
{
console.log(num++ + ": Changed to extent: " + map.getExtent() + "; resolution: " + map.getResolution());
}
});
num = 0;
map.zoomToMaxExtent();
}
</script>