Python Online: Projeção de Mercator
Atualizado: 30 de jul. de 2023
Acesse o https://colab.research.google.com/, crie um novo "notebook" e teste o código abaixo. Para detalhes históricos sobre esta projeção, consulte https://geozyx.com/blog/f/projeção-de-mercator?blogcategory=Projeção+Cilíndrica.
import math
class Elipsoide:
def __init__(self, nome, a, f):
fi = 1 / f
self.SemiEixoMaior = a
self.Excentricidade = math.sqrt(2 * fi - fi ** 2)
self.Nome = nome
class Mercator:
def __init__(self, el, lat, lon, l0=0):
self.Elip = el
self.m = l0
self.x = self.Calcular_X(lon * math.pi / 180)
self.y = self.Calcular_Y(lat * math.pi / 180)
self.k = self.Calcular_K(lat * math.pi / 180)
@property
def c(self):
return 0 # convergência meridiana é sempre zero. variável somente leitura.
def Calcular_X(self,longitude):
return self.Elip.SemiEixoMaior * (longitude - self.m * math.pi / 180)
def Calcular_Y(self,latitude):
termo1 = math.tan(math.pi / 4 + latitude / 2)
termo2 = (1 - self.Elip.Excentricidade * math.sin(latitude)) / (1 + self.Elip.Excentricidade * math.sin(latitude))
termo3 = math.pow(termo2, self.Elip.Excentricidade / 2)
return self.Elip.SemiEixoMaior * math.log(termo1 * termo3)
def Calcular_K(self,latitude):
N = self.Elip.SemiEixoMaior / math.sqrt(1 - math.pow(self.Elip.Excentricidade, 2) * math.pow(math.sin(latitude), 2))
return self.Elip.SemiEixoMaior / (N * math.cos(latitude))
def ProblemaInverso(el, x, y, m):
e = el.Excentricidade
a = el.SemiEixoMaior
l = (x / a + m * math.pi / 180)
t = math.exp(-y / a)
o0 = math.pi / 2 - 2 * math.atan(t)
o = [o0] * 50
for i in range(1, len(o)):
o[i] = math.pi / 2 - 2 * math.atan(t * (((1 - e * math.sin(o[i-1])) / (1 + e * math.sin(o[i-1]))) ** (e / 2)))
if abs(o[i-1] - o[i]) <= 0.00000001:
break
return [o[i] * 180 / math.pi, l * 180 / math.pi]
lat = -8.75 #Latitude em graus decimais
lon = -32.25 #Longitude em graus decimais
m = -33 #Meridiano Central
el = Elipsoide("GRS80", 6378137, 298.257222101)
mer = Mercator(el, lat, lon, m) #PROBLEMA DIRETO
mer_inv1 = Mercator.ProblemaInverso(el, mer.x, mer.y, m) #PROBLEMA INVERSO
str = f"Coord. de Entrada (lat, lon, merid central):\n({lat},{lon},{m})"
print(str)
print("Problema Direto:")
str = f"(x, y, fator escala):\n({round(mer.x,3)},{round(mer.y,3)},{round(mer.k,8)})"
print(str)
print("Problema Inverso:")
str = f"(lat, lon):\n({round(mer_inv1[0],4)},{round(mer_inv1[1],4)})"
print(str)
Para acessar o formulário matemático da Projeção de Mercator clique aqui.
No código acima, altere as coordenadas de entrada e insira as suas. Neste exemplo as coordenadas de entrada foram latitude -8.75°, longitude -32.25° e Meridiano Central -33º.
Comments