Holen Kartenposition, wenn WGS-84 lat / lon wenn oberen linken und unteren rechten Ecken lat / lon gegeben sind

StackOverflow https://stackoverflow.com/questions/1415375

  •  06-07-2019
  •  | 
  •  

Frage

Angenommen, ich eine Karte, zum Beispiel von openstreetmaps.org. Ich kenne das WGS-84 lat / lon der oberen linken und untere rechte Ecke der Karte. Wie finde ich andere Positionen auf der Karte aus gegebenen WGS-84 lat / lon Koordinaten?

War es hilfreich?

Lösung

Wenn die Karte ungefähr Straße / Stadtebene, verwendet eine Mercator-Projektion (wie < a href = "http://www.openstreetmap.org" rel = "nofollow noreferrer"> openstreetmap.org scheint), und ist mit den Polen kann präzise lineare Interpolation genug sein, um nicht zu nahe. Unter der Annahme der folgenden:

  • TL = lat / lon der linken oberen Ecke
  • BR = lat / lon der rechten unteren Ecke
  • P = lat / lon des Punktes, den Sie auf der Karte lokalisieren mögen
  • (w, h) = Breite und Höhe der Karte, die Sie haben (Pixel?)
  • der Ursprung des Kartenbildes, (0,0), ist an seiner oberen linken Ecke

, könnten wir die (x, y) entsprechende Position P als interpolierten

x = w * (P.lon - TL.lon) / (BR.lon - TL.lon)
y = h * (P.lat - TL.lat) / (BR.lat - TL.lat)

Gemeinsamer Gotcha ist:

  • Die lat / lon notation convention listet der Breite erste und die zweite Länge, das heißt "vertikal" vor "horizontal". Dies ist gegenüber dem gemeinsamen x, y Notation von Bildkoordinaten.

  • Latitude Werte erhöhen, wenn in einer nordwärts Richtung ( "up"), während der y-Koordinaten in der Karte Bild gehen kann zu erhöhen, wenn dabei nach unten.

  • Wenn die Karte eine größere Fläche abdeckt, wird eine lineare Interpolation nicht so genau für Breiten sein. Für eine Karte, die einen Grad der Breite überspannt und in der bewohnbaren Zonen der Erde (zB der Bucht-Bereich), wird das Zentrum Breite um 0,2% ab oder so, die um weniger als ein Pixel hoch sein kann (je nach Größe)

Wenn das präzise genug für Ihre Bedürfnisse, können Sie hier aufhören!

Je genaue Mathematik für von P Breite auf ein Pixel y-Position erhalten würde mit der mercator Mathe starten. Wir wissen, dass für eine Breite P.lat, die Y-Position auf einem Vorsprung am Äquator beginnen würde wie folgt aussehen (ich eine Kapital Y wie im Gegensatz zu den y-Wert verwenden, werden wir suchen, beginnt Y am Äquator und erhöht in Richtung Norden):

Y = k * ln((1 + sin(P.lat)) / (1 - sin(P.lat)))

Die Konstante k ist abhängig von der vertikalen Skalierung der Karte, die wir vielleicht nicht wissen. Zum Glück kann man ableiten, dass y Beobachtung (TL) - y (BR) = h. Das bringt uns:

k = h / (ln((1 + sin(TL.lat)) / (1 - sin(TL.lat))) - ln((1 + sin(BR.lat)) / (1 - sin(BR.lat))))

(Huch! Das sind vier Ebenen der Klammern!) Mit k bekannt ist, haben wir nun die Formel, um die Y-Position von jedem Breitengrad zu erfahren. Wir müssen nur korrigieren: (1) unser y-Wert bei TL.lat beginnt, nicht Äquator, und (2) y wächst in Richtung Süden statt nach Norden. Dies bringt uns:

Y(TL.lat) = k * ln((1 + sin(TL.lat)) / (1 - sin(TL.lat)))
Y(P.lat)  = k * ln((1 + sin(P.lat )) / (1 - sin(P.lat )))
y(P.lat)  = -(Y(P.lat) - Y(TL.lat))

Also das bekommt man:

x = w * (P.lon - TL.lon) / (BR.lon - TL.lon) // like before
y = -(Y(P.lat) - Y(TL.lat))                  // where Y(anything) depends just on h, TL.lat and BR.lat 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top