Ich verwende Flugblätter , um eine Darstellung einer weltweiten Herausforderung zu erstellen. Ich möchte eine Polylinie hinzufügen, die östlich von Tokio verläuft und dann westlich von Südamerika auf der Karte angezeigt wird. Stattdessen wird eine Linie angezeigt, die die Karte in der entgegengesetzten Richtung kreuzt (siehe gelbe Linie).
Ich denke, das hängt wahrscheinlich mit Bezugspunkten und / oder Koordinatensystemen zusammen, bin aber etwas skizzenhaft im Detail. Kann mir jemand die Theorie erklären, die dahinter steckt, was ich tun muss, damit das funktioniert? Ich verwende die Bluemarble-Projektion von Nasa:
var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});
coordinate-system
polyline-creation
leaflet
Codecowboy
quelle
quelle
Antworten:
Sie müssen die Polylinie am + -180-Grad-Meridian brechen. Dazu muss der Breitengrad ermittelt werden, bei dem die Polylinie diesen Meridian kreuzt. Ihr GIS verfügt wahrscheinlich über Methoden, um das Brechen durchzuführen. Andernfalls kann eine einfache Lösung aus dem Code abgeleitet werden, der in einem verwandten Thread angezeigt wird . Hier sind einige Details.
Eine Polylinie wird als eine Folge von Eckpunkten dargestellt , die jeweils in (lat, lon) -Form mit -180 <= lon <= 180 angegeben sind. Sie müssen jedes aufeinanderfolgende Paar überprüfen, um festzustellen, ob es den + -180-Meridian überschreitet. Es gibt einen schnellen Test: Wenn der absolute Wert des Längenunterschieds 180 oder mehr beträgt, liegt eine Kreuzung vor.
Innerhalb jedes Segments (lat0, lon0) -> (lat1, lon1), das den Meridian + -180 überschreitet, müssen Sie die Polylinie in zwei Teile aufteilen, in denen sie sich überschneidet.
Der Schlüssel ist das Ermitteln des Breitengrads des Haltepunkts mit angemessener Genauigkeit. Dies ist am einfachsten mit einem sphärischen Erdmodell möglich: Der Fehler (im Vergleich zu einem genaueren Ellipsoidmodell) ist zu gering, um bemerkt zu werden.
Lassen Sie das betreffende Segment von Punkt 0 bei (lat0, lon0) zu Punkt 1 bei (lat1, lon1) gehen. Der Unterbrechungspunkt kann ermittelt werden, indem ein gerades Liniensegment in 3D zwischen den beiden in kartesischen Koordinaten dargestellten Punkten gezogen wird und ermittelt wird, wo die y-Koordinate Null ist. Die kartesischen Koordinaten sind
und einen ähnlichen Ausdruck, der (x1, y1, z1) für Punkt 1 ergibt. Löse die Gleichung
für t; das ist,
Die Koordinaten der Kreuzung sind daher
Dieser Punkt (der unter der Erdoberfläche irgendwo unter dem + -180-Meridian liegt) hat einen Breitengrad von
Der Haltepunkt muss auf zwei Arten dargestellt werden. Wenn Sie es nach (lat0, lon0) anfügen, um den ersten Teil der unterbrochenen Polylinie zu beenden, verwenden Sie (lat2, -180), wenn lon0 negativ ist, und verwenden Sie andernfalls (lat2, 180). Wenn Sie den zweiten Teil der unterbrochenen Polylinie vor (lat1, lon1) anhängen, befolgen Sie eine ähnliche Regel.
In Ausnahmefällen kann sich einer oder beide der Punkte 0 und 1 auf dem Meridian von +180 befinden. Wenn Sie diesem Verfahren folgen, platzieren Sie ein Segment mit der Länge Null auf einem der von Ihnen erstellten Polylinienstücke. Wenn dies zu einem Problem mit dem GIS führen kann, prüfen Sie, ob dieser Zustand vorliegt.
Beachten Sie, dass eine Polylinie diesen Meridian mehr als einmal überschreiten kann. Nachdem Sie den ersten Umbruch gefunden und die Polylinie in zwei Teile geteilt haben, müssen Sie den zweiten Teil auf die gleiche Weise verarbeiten.
quelle
Für eine ähnliche Diskussion ist dieses Ticket vielleicht interessant:
"Vektorprojektion über Umhüllungsgrenze wird geteilt"
https://trac.osgeo.org/grass/ticket/1527
quelle