Mais

Calculando as coordenadas de Mercator de lat / lon


Eu sou novo em GIS, mas estou trabalhando em um projeto de mapeamento de um edifício usando plantas baixas e JOSM.

Usando o plugin PicLayer, adicionei o .png "> http://wiki.openstreetmap.org/wiki/Mercator

O código Python em Elliptical Mercator converte corretamente minha longitude, mas a latitude está errada em cerca de 0,5% (alguns metros).

importar matemática def merc_x (lon): r_major = 6378137.000 retornar r_major * math.radians (lon) def merc_y (lat): se lat> 89,5: lat = 89,5 se 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

Meus nós e caminhos foram alinhados corretamente com a imagem com esta latitude e longitude no WGS84, então acho que eles estão corretos e a conversão não. Estou no hemisfério norte e usando uma área próxima a 49 N, -122 E.


Dê uma olhada em Proj4 https://github.com/OSGeo/proj.4/wiki python's implementação pyproj https://github.com/jswhit/pyproj

Você pode especificar as projeções src e dest (comoEPSG: 4326eEPSG: 3857) e converter as coordenadas entre eles. E o pyproj fará todos os cálculos brutos.


Nota: esta solução tem como objetivo entradas de array. Inspirado na solução aceita de @JoshVazquez.

Selatelonsão matrizes (ou colunas de dataframe) ...

A resposta atualmente aceita funcionaria muito bem quandolatelonsão parâmetros escalares.

No entanto, recentemente me deparei com um cenário ondelatelonsão matrizes numpy (ou colunas de dataframe do pandas). Para fazer isso funcionar para colunas de arrays / dataframe, eu essencialmente modifiquei a solução de @JoshVazquez acima - essencialmente substituindo todos osmatemáticafunções comentorpecidofunções.

importar numpy como 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)) * retorno de escala (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]

Conversão de longitude de Mercator elíptico (mesma fórmula em ambos os sistemas ?:

importar math def merc_x (lon): r_major = 6378137.000 retornar r_major * math.radians (lon)

Mercator X agora conhecido. Divida isso pela longitude para obter o valor da escala.

Conversão de latitude do Mercator esférico:

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

Multiplique o resultado pelo valor da escala para obter o valor Y de Mercator.

Em uma função:

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)) * retorno de escala (x, y)


Assista o vídeo: VIII одделение - Физика - Силите можат да го променат обликот на предметот (Outubro 2021).