3 votes

La carte OpenLayer limite les panoramiques et les zooms.

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>

0voto

Andrew Fielden Points 1554

Je viens de faire exactement ce que tu veux faire, et ça marche pour moi.

Lorsque je crée la carte, je spécifie les résolutions minimale et maximale.

  map = new OpenLayers.Map('map_element', {
    minResolution: 0.02197265625,
    maxResolution: 0.00274658203125
});

Lorsque j'ajoute une couche, je spécifie également une liste de serverResolutions.

    var tilecache_disk_layer = new OpenLayers.Layer.TileCache("TileCache Layer",
        ["http://" + tilecache_host + "/tilecache/"],
        "basic",
        {
         serverResolutions: [0.703125, 0.3515625, 0.17578125, 0.087890625, 
                        0.0439453125, 0.02197265625, 0.010986328125, 
                        0.0054931640625, 0.00274658203125, 0.001373291015625, 
                        0.0006866455078125, 0.00034332275390625, 0.000171661376953125, 
                        0.0000858306884765625, 0.00004291534423828125, 0.000021457672119140625]
        },
        {wrapDateLine: 'true'},
        {isBaseLayer: true}
    );

Le javascript suivant envoie une requête à mon serveur pour obtenir les paramètres de la carte.

  if (site_coords == undefined) {
    coordinates = sendHttpRequest("http://" + tile_host + "/ManagerApp/mapView?position=true");
    mapParameters = coordinates.split(",");       
    map.setCenter(new OpenLayers.LonLat(mapParameters[0], mapParameters[1]));
    map.minResolution = mapParameters[2];
    map.maxResolution = mapParameters[3];
    zoom_level = mapParameters[4];
    map.restrictedExtent = new OpenLayers.Bounds(mapParameters[5], mapParameters[6], mapParameters[7], mapParameters[8])
}

0voto

bmahf Points 935

Voici donc ma réponse. Après avoir beaucoup cherché, posté et envoyé des courriels, j'ai trouvé quelqu'un qui m'a donné une réponse simple. Je m'enregistrais déjà pour l'événement "moveend", capturant tous les mouvements d'étendue, afin de pouvoir jeter un coup d'oeil à ce qui se passait. La réponse a été de déclarer une variable privée int (maxZoomLevel) sur la classe, qui a une valeur de zéro lorsque la carte est dessinée pour la première fois, puisque je dessine la vue du monde pour commencer, et qui est ensuite fixée au niveau de zoom actuel avec getZoom() au moment où l'utilisateur clique sur le bouton, choisissant la zone actuelle pour travailler. Ainsi, l'enregistrement de l'événement "moveend" ressemble à ceci :

    map.events.register("moveend", this, function (e) {
        if (map.getZoom() < maxZoomLevel)
        {
            map.zoomTo(maxZoomLevel);
        }
    });

Puisque la vue du monde est 0 et que la vue du sol est 19, si la vue actuelle est inférieure au maximum (le niveau de zoom choisi), nous zoomons simplement au maximum.

Cela fonctionne très bien. Il y a un léger scintillement lorsque je fais défiler la souris pour dépasser le niveau de zoom maximal choisi, mais le zoom ne le dépasse plus. En outre, cette méthode ne m'a pas obligé à ajouter un tableau de résolution à ma couche de carte, ni à définir une résolution maximale/minimale sur la carte. (J'aimerais pouvoir me débarrasser de ce scintillement... Hmmm !)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X