top of page

Python Online: Projeção de Mercator

Foto do escritor: Adauto CostaAdauto Costa

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º.


Posts recentes

Ver tudo

Comments


Faça parte da nossa lista de emails

Obrigado!

ad33geo canal whatsapp.png
Dê sua opinião sobre algo do site!

Obrigado! Enviaremos um e-mail em breve informando que seu conteúdo foi publicado!

siga-nos!

  • Facebook
  • Instagram
  • YouTube
bottom of page