Wie kann ich eine Polylinie um die Welt wickeln?

14

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).

Bildbeschreibung hier eingeben

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
});
Codecowboy
quelle
2
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 . Können Sie Code wie diesen auf Ihrer Plattform ausführen?
Whuber
Ich stimme whuber zu. Ich musste eine ähnliche Aufgabe mit Polygonen durchführen, die + - 180 kreuzen. Sie müssen jedes Mal, wenn Sie die + -180 kreuzen, in mehrere Polylinien / Polygone aufteilen.
Steve

Antworten:

13

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

(x0, y0, z0) = (cos(lon0)*sin(lat0), sin(lon0)*sin(lat0), cos(lat0))

und einen ähnlichen Ausdruck, der (x1, y1, z1) für Punkt 1 ergibt. Löse die Gleichung

t * y0 + (1-t) * y1 = 0

für t; das ist,

t = y1 / (y1 - y0).

Die Koordinaten der Kreuzung sind daher

(x, y, z) = (t * x0 + (1-t) * x1, 0, t * z0 + (1-t) * z1)

Dieser Punkt (der unter der Erdoberfläche irgendwo unter dem + -180-Meridian liegt) hat einen Breitengrad von

lat2 = ATan(z/x).

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.

whuber
quelle
1
Was whuber sagte, ist OK, aber ich denke, es gibt einen Tippfehler im folgenden Satz:> Wenn Sie ihn nach (lat0, lon0) anhängen, um den ersten Teil der gebrochenen> Polylinie zu beenden, verwenden Sie (lat2, -180), wenn lat0 negativ ist und Andernfalls verwenden Sie (lat2, 180). Ich denke, es muss sein:> Verwenden Sie (lat2, -180), wenn lon0 negativ ist und ansonsten verwenden (lat2, 180)
Georgi
@Georgi Danke, dass du das erwischt hast; Ich denke, Sie haben Recht und ich werde die Änderung vornehmen.
whuber
Ich musste dies in Leaflet.js implementieren, hier ist mein Code: gist.github.com/mikeatlas/0b69b354a8d713989147
Mike Atlas
Vielen Dank, @Mike. Ich liebe die Zick-Zack-Illustration: Genau diese Umstände habe ich mir vorgestellt, als ich diese Antwort schrieb. Wenn Sie einen wirklich strengen Test wünschen, sehen Sie, was mit einer Polylinie geschieht, die entlang des Meridians von + -180 Grad selbst verläuft (und beide Pole kreuzt)!
Whuber
@whuber Möglicherweise muss ich nur versuchen, dass: / Ergebnisse veröffentlichen
Mike Atlas
0

Für eine ähnliche Diskussion ist dieses Ticket vielleicht interessant:

"Vektorprojektion über Umhüllungsgrenze wird geteilt"

https://trac.osgeo.org/grass/ticket/1527

markusN
quelle