Leaflet: Containerkoordinaten vs Layerkoordinaten?

17

Was ist der Unterschied zwischen Karte Container Koordinaten und Schicht Koordinaten ?

Die Koordinaten der Kartencontainer sind immer relativ zum Kartenansichtsfenster, und während die Ebenenkoordinaten immer mit denselben Werten wie die Containerkoordinaten beginnen , ändern sie sich, sobald die Karte verschoben wird.

APIs, die sich auf Koordinaten / Punkte beziehen:

Saad Malik
quelle

Antworten:

21

Kurze Antwort

Die containerPoint-Methoden stammen aus einer Feature-Anfrage aus dem Jahr 2012 und sind heute etwas verwirrend.

Die beste Antwort ist die Beschreibung von Flugblattbetreuer Vladimir Agafonkin:

"layerPoint ist eigentlich ein Punkt relativ zum Kartenlayer (der Teil, der Kacheln und Markierungen enthält), nicht der äußere Kartencontainer. Was Sie brauchen, ist map.layerPointToContainerPoint. Aber ich bin damit einverstanden, dass es keine bequeme Methode gibt, um es sofort abzurufen. Planen Sie dies für die nächste Version. "

Lange Antwort

Genauer gesagt:

Die wichtigsten öffentlichen Konvertierungsmethoden in Leaflet sind L.Map.project(latlng [, zoom])und , obwohl sie von Anwendungsentwicklern selten verwendet werden L.Map.unproject(point [, zoom]).

Webkarten sind in ein Raster aus Kacheln mit jeweils der gleichen Pixelanzahl aufgeteilt. Bei höheren Zoomstufen wird die Karte in eine größere Anzahl von Kacheln mit einer entsprechend größeren Anzahl von Pixeln unterteilt. Somit ist die Pixelgröße der Karte von der Zoomstufe abhängig.

Dies bedeutet, dass sich die Ausgabe von L.Map.project` für eine bestimmte Sprache nur ändert, wenn Sie mit einem Leaflet-Demofenster in Ihrem Browser herumspielen und die Ansicht vergrößern oder verkleinern .

Ab der neuesten Version von Leaflet (0.7.3) L.Map.latLngToLayerPointlautet die Definition von :

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

Im Gegensatz dazu L.Map.latLngToContainerPointlautet:

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

mit L.Map.layerPointToContainerPointdefiniert als:

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

Die private Kartenmethode _getMapPanePos()gibt den Versatz zwischen der aktuellen Kartenposition und ihrer Position bei der ersten Erstellung zurück. Dies ändert sich nur während eines Kartenschwenks (nicht während des Zoomens). Der Unterschied zwischen dem LayerPoint und dem ContainerPoint, der einem bestimmten LatLng entspricht, besteht darin, dass der LayerPoint die Position des LatLng im Kartencontainer ist , während sich die <div> Karte an ihrer Anfangsposition befindet containerPoint ist die aktuelle Position des Latls im Kartencontainer <div>.

Justin Manley
quelle
1
Mann - wenn ich dich unterstützen könnte, würdest du 100 Mal unterstützt.
Saad Malik
0

EDIT: stellt sich heraus, dass ich falsch lag. Containerkoordinaten scheinen für den sichtbaren Rahmen zu gelten, während Ebenenkoordinaten für einen größeren Bereich als den sichtbaren gelten. Diese Frage muss von jemandem beantwortet werden, der über mehr Kenntnisse verfügt als ich.

Alex Leith
quelle
1
Alex - Ich glaube nicht, dass das richtig ist. Die Containerkoordinaten und Layerkoordinaten werden beide in Pixel vom Ursprung des Containers (oben links) angegeben. Wenn ich jedoch mit dem Schwenken der Karte beginne, bleiben die Layerkoordinaten / -punkte einer Markierung unverändert, während die Kartenkoordinaten / -punkte für eine Markierung entsprechend dem Ursprungspunkt oben links aktualisiert werden.
Saad Malik
Hi @ SimFox3, du hast recht. Und ich hätte es testen sollen, bevor ich etwas sagte! Ich meine, der Ebenenpunkt ist eine Koordinate, die relativ zu einer Art 'Fenster' definiert ist, das festgehalten wird und das größer als der Bildschirm ist. Es ist wie eine zwischengespeicherte Ansicht, die nicht nur auf dem Bildschirm angezeigt wird. Das ist der Grund, warum sich die Koordinaten der Ebenenpunkte ändern, aber nicht oft und nur, wenn das 'Fenster' verschoben wird. Die Koordinaten der Containerpunkte scheinen immer auf Koordinaten relativ zur sichtbaren Ansicht beschränkt zu sein. Trotzdem ist klar, dass ich nicht mehr weiß als Sie. Es wäre also großartig, wenn ein Leaflet-Entwickler wäre. könnte einschneiden!
Alex Leith