Mehr

Berechnung der Mercator-Koordinaten aus lat/lon


Ich bin neu bei GIS, arbeite aber an einem Projekt, das ein Gebäude mit Grundrissen und JOSM kartiert.

Mit dem PicLayer-Plugin habe ich die .png">http://wiki.openstreetmap.org/wiki/Mercator . hinzugefügt

Der Python-Code unter Elliptical Mercator konvertiert meinen Längengrad korrekt, aber der Breitengrad liegt um etwa 0,5% (einige Meter) daneben.

import math def merc_x(lon): r_major=6378137.000 return r_major*math.radians(lon) def merc_y(lat): if lat>89.5:lat=89.5 if lat<-89.5:lat=-89.5 r_major=6378137.000 r_minor=6356752.3142 temp=r_minor/r_major excent=math.sqrt(1-temp**2) phi=math.radians(lat) sinphi=math.sin(phi) con=excent*sinphi com=excent/2 con=((1.0- con)/(1.0+con))**com ts=math.tan((math.pi/2-phi)/2)/con y=0-r_major*math.log(ts) return y

Meine Knoten und Wege wurden in WGS84 mit diesem Breiten- und Längengrad korrekt mit dem Bild ausgerichtet, daher denke ich, dass sie korrekt sind und die Konvertierung nicht. Ich bin auf der Nordhalbkugel und nutze ein Gebiet in der Nähe von 49 N, -122 E.


Werfen Sie einen Blick auf Proj4 https://github.com/OSGeo/proj.4/wiki Pythons Implementierung pyproj https://github.com/jswhit/pyproj

Sie können src- und dest-Projektionen angeben (wieEPSG:4326undEPSG:3857) und konvertieren Sie die Koordinaten zwischen ihnen. Und pyproj wird alle Rohberechnungen durchführen.


Hinweis: Diese Lösung zielt auf Array-Eingänge ab. Inspiriert von der akzeptierten Lösung von @JoshVazquez.

Wennlatundlonsind beide Arrays (oder Datenrahmenspalten)…

Die aktuell akzeptierte Antwort würde sehr gut funktionieren, wennlatundlonsind skalare Parameter.

Ich bin jedoch kürzlich auf ein Szenario gestoßen, in demlatundlonsind numpy Arrays (oder Pandas-Datenrahmenspalten). Damit dies für Arrays / Datenrahmenspalten funktioniert, habe ich die obige Lösung von @JoshVazquez im Wesentlichen geändert - im Wesentlichen alle ersetztMathematikFunktionen mitnumpyFunktionen.

import numpy as np def merc_from_arrays(lats, lons): r_major = 6378137.000 x = r_major * np.radians(lons) scale = x/lons y = 180.0/np.pi * np.log(np.tan(np.pi/ 4.0 + Lats * (np.pi/180.0)/2.0)) * Skalenerträge (x, y) Lats = np.asarray([54.984105, 56]) lons = np.asarray([-3.193693, -2.2]) xs , ys = merc_from_arrays(lats, lons) print('xs: {}'.format(xs)) # => [-355520.27851004 -244902.8797452 ] print('ys: {}'.format(ys)) # => [ 7358781.82857011 7558415.65608178]

Längengradumrechnung vom elliptischen Mercator (gleiche Formel in beiden Systemen?:

import math def merc_x(lon): r_major=6378137.000 return r_major*math.radians(lon)

Mercator X ist jetzt bekannt. Teilen Sie dies durch den Längengrad, um den Skalenwert zu erhalten.

Breitengradumrechnung von sphärischem Mercator:

import math def lat2y(a): return 180.0/math.pi*math.log(math.tan(math.pi/4.0+a*(math.pi/180.0)/2.0))

Multiplizieren Sie das Ergebnis mit dem Skalenwert, um den Mercator-Y-Wert zu erhalten.

In einer Funktion:

import math def merc(lat, lon): r_major = 6378137.000 x = r_major * math.radians(lon) scale = x/lon y = 180.0/math.pi * math.log(math.tan(math.pi/4.0 + lat * (math.pi/180.0)/2.0)) * Skalenerträge (x, y)


Schau das Video: Finding Latitude and Longitude of Points on a Map Using ArcMap (Oktober 2021).