Više

Izračunavanje Mercator koordinata iz širine / dužine

Izračunavanje Mercator koordinata iz širine / dužine


Novi sam u GIS-u, ali radim na projektu mapiranja zgrade pomoću tlocrta i JOSM-a.

Korištenjem dodatka PicLayer dodao sam .png "> http://wiki.openstreetmap.org/wiki/Mercator

Python kôd pod eliptičnim Mercatorom ispravno pretvara moju dužinu, ali geografska širina je isključena za oko 0,5% (nekoliko metara).

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 eccent = math.sqrt (1-temp ** 2) phi = math.radians (lat) sinphi = math.sin (phi) con = eccent * sinphi com = eccent / 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

Moji čvorovi i načini bili su ispravno poredani sa slikom s ovom zemljopisnom širinom i dužinom u WGS84, pa mislim da su tačni, a pretvorba nije. Nalazim se na sjevernoj hemisferi i koristim područje blizu 49 N, -122 E.


Pogledajte Proj4 https://github.com/OSGeo/proj.4/wiki python implementacija pyproj https://github.com/jswhit/pyproj

Možete odrediti src i dest projekcije (poputEPSG: 4326iEPSG: 3857) i pretvoriti koordinate između njih. A pyproj će izvršiti sve sirove proračune.


Napomena: ovo rješenje cilja ulaze niza. Inspiriran prihvaćenim rješenjem @ JoshVazqueza.

Akolatilonsu oba niza (ili stupci okvira podataka) ...

Trenutni prihvaćeni odgovor vrlo dobro bi funkcionirao kadalatilonsu skalarni parametri.

Međutim, nedavno sam nabasao na scenarij u kojemlatilonsu numpy nizovi (ili stupci pandas okvira podataka). Da bi ovo uspjelo za stupce / okvire podataka, u osnovi sam izmijenio prethodno rješenje @ JoshVazqueza - u osnovi zamijenivši svematematikafunkcije sanumpyfunkcije.

uvoz numpy kao 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)) * povratak skale (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]

Pretvorba geografske dužine iz eliptičnog Mercatora (ista formula u oba sistema ?:

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

Mercator X sada poznat. Podijelite ovo sa zemljopisnom dužinom da biste dobili vrijednost skale.

Latitude konverzija iz sfernog Mercatora:

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

Pomnožite rezultat s vrijednošću skale da biste dobili Mercator Y vrijednost.

U jednoj funkciji:

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)) * povratak skale (x, y)

Pogledajte video: KAKO UVEK DOBITI 5