Suite

Obtenir/Définir l'étendue de ol.source.tile xyz


J'ai une série de sources de tuiles correspondant à différents fournisseurs de cartes à des résolutions spécifiques et je voudrais définir une étendue de sorte que lorsque la couche appropriée est sélectionnée, la carte se déplace et zoome sur l'étendue des tuiles.

En suivant cet exemple, j'ai défini l'étendue de chaque source. Je suis également en mesure d'obtenir l'étendue de la couche sélectionnée en utilisant ce code dans mon contrôle Layerswitcher :

curExtent = map.getView().calculateExtent(map.getSize()); if (extent != null) { extent = layer[s].getExtent(); } else { extent = map.getView().calculateExtent(map.getSize()); } layerZoom = layer[s].getProperties().minZoom; map.getView().fit(extent, map.getSize()); couches[s].setVisible(true);

Je suis en mesure d'obtenir la résolution/zoom à ce stade, mais je ne sais pas comment définir la vue sur la propriété minResolution/zoom de chaque source. quelqu'un peut-il aider s'il vous plait?

Suite à cela, je peux maintenant faire en sorte que la carte effectue un panoramique et un zoom, mais les tuiles de couche n'apparaissent pas. Je pensais que c'était un problème de projection mais je suis au bon endroit et zoome. Dois-je retarder le chargement des tuiles peut-être ?

Voici le code modifié :

var curExtent = map.getView().calculateExtent(map.getSize()); if (title == selectedValue) { if (extent != []) { extent = layer[s].getExtent(); } else { extent = curExtent; } console.log(étendue); layerZoom = calques[s].getProperties().minZoom; var sourceCentre = ol.extent.getCenter(extent); console.log(sourceCentre); console.log(layerZoom); console.log(curExtent); console.log(étendue); map.getView().setCenter(sourceCentre); map.getView().setZoom(layerZoom); couches[s].setVisible(true); } else { layer[s].setVisible(false); }

J'ai mis en place un simple violon qui semble maintenant fonctionner bien que j'aie du mal à obtenir l'étendue des autres couches de carte standard et que la fonctionnalité semble se briser après l'action initiale réussie.


Donc, la solution que j'ai trouvée était d'ajouter une vérification pour une autre valeur sur le calque. Dans ce cas, la valeur de 'sub'. Cela m'a permis de vérifier si la source de la couche avait une étendue définie. Si l'étendue a été trouvée, j'ai recherché la valeur minZoom, obtenu la coordonnée centrale de l'étendue, puis défini la vue sur celle-ci.

La fonctionnalité semblait se briser si je vérifiais la propriété d'étendue sur une source non définie, donc la vérification de la propriété 'sub' annulait cela. Cela a été un long chemin pour localiser une fonction quadkey, trouver comment l'appliquer à une URL xyz personnalisée, découvrir comment transformer la projection de l'étendue, puis rechercher le zoom et définir une nouvelle vue ; sans parler de la création d'un menu de sélection à partir des calques, mais l'effort en valait vraiment la peine.

Je suis sûr que mon code semble un peu compliqué pour la plupart des gens et j'aurai l'occasion de le peaufiner plus tard, mais merci à tous ceux qui m'ont aidé en cours de route. @AlvinLindstam, @JonatasWalker et @Pavlos m'ont tous aidé à mieux comprendre comment tout cela s'emboîte. Pour le bénéfice de tous ceux qui cherchent à faire quelque chose de similaire, je posterai le code ci-dessous et voici un lien vers le violon.

var sub = couches[s].get('sub'); // où layer[s] est le résultat d'une recherche de couche var extend; if (title == selectedValue) { if (sub == undefined) { layer[s].setVisible(true); } if (sub == 'premium') { var durée = 2000; var début = +nouvelle date(); var vue = map.getView(); var pan = ol.animation.pan({ duration : duration, //easing : eval(ol.easing.inAndOut), source : (view.getCenter()), start : start }); var bounce = ol.animation.bounce({ duration : duration, resolution : 4 * view.getResolution(), start : start }); // Ajout d'une animation au pipeline de rendu map.beforeRender(pan, bounce); étendue = couches[s].getExtent(); console.log(étendue); layerZoom = calques[s].getProperties().minZoom; var sourceCentre = ol.extent.getCenter(extent); view.setCenter(sourceCentre); view.setZoom(layerZoom); couches[s].setVisible(true); }

Vous pouvez vérifier cette question, cela vous aidera à résoudre le problème GetExtent, et vérifier cette question vous aidera à la fois dans les problèmes de conversion d'étendue de couche et de projection de coordonnées.