Dépliant: Coordonnées du conteneur vs coordonnées de la couche?

17

Quelle est la différence entre les coordonnées du conteneur de carte et les coordonnées de couche ?

D'après ce que j'ai rassemblé, les coordonnées du conteneur de carte sont toujours relatives à la fenêtre de carte, et bien que les coordonnées de couche commencent toujours avec les mêmes valeurs que les coordonnées du conteneur , elles changent une fois que la carte est panoramique.

API qui font référence aux coordonnées / point:

Saad Malik
la source

Réponses:

21

Réponse courte

Les méthodes containerPoint datent d' une demande de fonctionnalité en 2012 , et aujourd'hui, elles sont un peu déroutantes.

La meilleure réponse est la description de Vladimir Agafonkin, responsable du dépliant:

"layerPoint est en fait un point par rapport à la couche de la carte (la div qui contient des tuiles et des marqueurs), pas le conteneur de carte externe. Ce dont vous avez besoin est map.layerPointToContainerPoint. Mais je suis d'accord qu'il n'y a pas de méthode pratique pour l'obtenir immédiatement, alors planifiez cette pour la prochaine version. "

Longue réponse

Plus en détail:

Les principales méthodes de conversion publiques de Leaflet, bien que rarement utilisées par les développeurs d'applications, sont L.Map.project(latlng [, zoom])et L.Map.unproject(point [, zoom]).

Les cartes Web sont divisées en une grille de tuiles, chacune avec le même nombre de pixels. À des niveaux de zoom plus élevés, la carte est divisée en un plus grand nombre de tuiles, avec un plus grand nombre de pixels correspondant. Ainsi, la taille en pixels de la carte dépend du niveau de zoom.

Cela signifie que si vous jouez avec une fenêtre de démonstration de Leaflet dans votre navigateur, la sortie de L.Map.project` pour un latlng donné ne changera que si vous zoomez et dézoomez .

Depuis la dernière version de Leaflet (0.7.3), la définition de se L.Map.latLngToLayerPointlit comme suit:

latLngToLayerPoint: function (latlng) {
    var projectedPoint = this.project(L.latLng(latlng))._round();
    return projectedPoint._subtract(this.getPixelOrigin());
}

En revanche, se L.Map.latLngToContainerPointlit comme suit:

latLngToContainerPoint: function (latlng) {
    return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
}

avec L.Map.layerPointToContainerPointdéfini comme:

layerPointToContainerPoint: function (point) { 
    return L.point(point).add(this._getMapPanePos());
}

La méthode de carte privée _getMapPanePos()renvoie le décalage entre la position actuelle de la carte et sa position lors de sa première création. Cela ne change que pendant un panoramique de carte (pas pendant le zoom), donc la différence entre le layerPoint et le containerPoint correspondant à un latlng donné est que le layerPoint est la position du latlng dans le conteneur <div> de la carte avec la carte à sa position initiale , tandis que le containerPoint est la position actuelle du latlng dans le conteneur de carte <div>.

Justin Manley
la source
1
Mec - si je pouvais voter positivement, tu serais voté 100 fois.
Saad Malik
0

EDIT: il s'avère que j'avais tort. Les coordonnées du conteneur semblent être pour le cadre visible tandis que les coordonnées du calque sont pour une zone plus grande que celle visible. Cette question a besoin de quelqu'un de mieux informé que moi pour y répondre.

Alex Leith
la source
1
Alex - Je ne pense pas que ce soit correct. Les coordonnées du conteneur et les coordonnées du calque sont toutes deux spécifiées en pixels à partir de l'origine (en haut à gauche) du conteneur. Cependant, lorsque je commence à déplacer la carte, la coordonnée / le point de calque d'un marqueur reste le même tandis que la coordonnée / le point de la carte pour un marqueur est mis à jour par rapport au point d'origine en haut à gauche.
Saad Malik
Salut @ SimFox3, tu as raison. Et j'aurais dû le tester avant de dire quoi que ce soit! Je pense maintenant que le point de calque est une coordonnée qui est définie par rapport à une sorte de «fenêtre» qui est tenue, qui est plus grande que l'écran. C'est comme une vue en cache qui est plus biogger que l'écran. C'est pourquoi les coordonnées du point de calque changent, mais pas souvent, et uniquement lorsque la «fenêtre» est déplacée. Les coordonnées du point conteneur semblent toujours limitées aux coordonnées relatives à la vue visible. Cela dit, il est clair que je n'en sais pas plus que vous, donc ce serait génial si un développeur de Leaflet. pourrait éclater!
Alex Leith