9/25/2012

Convertir Coordenadas GTM a Geodésicas (Geográficas)

Les dejo el código de cómo convertir coordenadas GTM (Guatemala Transverse Mercator) a coordenadas Geográficas y Viceversa.

Me basé en la información de la pagina siguiente convertir-coordenadas-utm-geodesicas


    Const SeMayor = 6378137             'Semi major axis (a) (m)
    Const FaloEste = 500000             'Falso Este (m)/Falso Norte Es "0"
    Const CSF = 0.9998                  'Escala de Factor Central (CSF)
    Const ZD = 6                        'Zona ancho (en grados)
    Const LCMZ = -90.5                  'Longitud del meridiano central en zona 1(grados)
    Const iflat = 298.257223563         'achatamiento invereso (1/f)

    '''
    ''' Convierte Coordenadas GTM a Geodésicas (Geográficas)
    '''

    ''' Coordenada X
    ''' Coordenada Y
    ''' Zona
    ''' Vector con Coordenadas X,Y  (1)(2)

    '''
    Public Shared Function aGeodesicas(ByVal CoorX As Double, ByVal CoorY As Double, ByVal Zona As Integer) As Double()

        '******************************************
        'Variables de Generales para el Calculo
        '******************************************

        'Achatamiento (f)
        Dim flat As Double = 1 / iflat
        'Excentricidad (e2)
        Dim Ex As Double = (2 * flat) - (flat * flat)
        'Semi-minor axis
        Dim SeMenor As Double = SeMayor * (1 - flat)

        Dim n As Double = (SeMayor - SeMenor) / (SeMayor + SeMenor)
        Dim n2 As Double = n ^ 2
        Dim n3 As Double = n ^ 3
        Dim n4 As Double = n ^ 4
        Dim G As Double = SeMayor * (1 - n) * (1 - n2) * (1 + (9 * n2) / 4 + (255 * n4) / 64) * PI / 180

        'Parte Norte
        Dim m As Double = CoorY / CSF
        Dim Sigma As Double = (m * PI) / (G * 180)
        Dim Sigma2 As Double = Sigma * 2
        Dim Sigma4 As Double = Sigma * 4
        Dim Sigma6 As Double = Sigma * 6
        Dim Sigma8 As Double = Sigma * 8

        'Parte Este
        Dim Este As Double = CoorX - FaloEste

        'Foot Point latitude
        Dim Term1 As Double = Sigma
        Dim Term2 As Double = ((3 * n / 2) - (27 * n3 / 32)) * Sin(Sigma2)
        Dim Term3 As Double = ((21 * n2 / 16) - (55 * n4 / 32)) * Sin(Sigma4)
        Dim Term4 As Double = (151 * n3) * Sin(Sigma6) / 96
        Dim Term5 As Double = 1097 * n4 * Sin(Sigma8) / 512

        Dim Lat As Double = Term1 + Term2 + Term3 + Term4 + Term5
        Dim SinLat As Double = Sin(Lat)
        Dim SecLat As Double = 1 / Cos(Lat)

        'Radios de curvatura
        Dim Rho As Double = SeMayor * (1 - Ex) / (1 - Ex * SinLat * SinLat) ^ 1.5
        Dim Nu As Double = SeMayor / (1 - Ex * SinLat * SinLat) ^ 0.5

        'x = E'/(k0n')
        Dim x As Double = (Este / CSF) / Nu
        'Dim x2 As Double = x ^ 2
        Dim x3 As Double = x ^ 3
        'Dim x4 As Double = x ^ 4
        Dim x5 As Double = x ^ 5
        'Dim x6 As Double = x ^ 6
        Dim x7 As Double = x ^ 7

        't'=tanj'
        Dim t As Double = Tan(Lat)
        Dim t2 As Double = t ^ 2
        'Dim t3 As Double = t ^ 3
        Dim t4 As Double = t ^ 4
        'Dim t5 As Double = t ^ 5
        Dim t6 As Double = t ^ 6

        'y'=n'/r'
        Dim y As Double = Nu / Rho
        Dim y2 As Double = y ^ 2
        Dim y3 As Double = y ^ 3
        Dim y4 As Double = y ^ 4


        'Latitud
        Dim Tm1 As Double = -((t / (CSF * Rho)) * x * Este / 2)
        Dim Tm2 As Double = (t / (CSF * Rho)) * ((x3) * Este / 24) * (-4 * y2 + 9 * y * (1 - t2) + 12 * t2)
        Dim Tm3 As Double = -(t / (CSF * Rho)) * ((x5) * Este / 720) * (8 * y4 * (11 - 24 * t2) - 12 * y3 * (21 - 71 * t2) + 15 * y2 * (15 - 98 * t2 + 15 * t4) + 180 * y * (5 * t2 - 3 * t4) + 360 * t4)
        Dim Tm4 As Double = (t / (CSF * Rho)) * ((x7) * Este / 40320) * (1385 + 3633 * t2 + 4095 * t4 + 1575 * t6)
        Dim SumTm As Double = Lat + Tm1 + Tm2 + Tm3 + Tm4

        'Latitud geodesica
        Dim Latitud As Double = (SumTm / PI) * 180

        'Meridiano Central
        Dim CMDeg As Double = (Zona * ZD) + LCMZ - ZD
        Dim CMRad As Double = (CMDeg / 180) * PI

        Dim lon1 As Double = SecLat * x
        Dim lon2 As Double = -SecLat * ((x3) / 6) * (y + 2 * t2)
        Dim lon3 As Double = SecLat * ((x5) / 120) * (-4 * y3 * (1 - 6 * t2) + y2 * (9 - 68 * t2) + 72 * y * t2 + 24 * t4)
        Dim lon4 As Double = -SecLat * ((x7) / 5040) * (61 + 662 * t2 + 1320 * t4 + 720 * t6)

        Dim SumLon As Double = CMRad + lon1 + lon2 + lon3 + lon4

        Dim Longitud As Double = (SumLon / PI) * 180

        Dim Coordenadas(2) As Double
        Coordenadas(1) = Latitud
        Coordenadas(2) = Longitud

        Return Coordenadas

    End Function

Este es el código que convierte Coordenadas Geográficas a GTM

    '''
    ''' Convierte Coordenadas Geodésicas a GTM
    '''
    ''' GTM X
    ''' GTM Y
    ''' Zona
    ''' Vector Con Coordenadas Geodésicas
    '''
    Public Shared Function aGTM(ByVal CoorX As Double, ByVal CoorY As Double, ByVal Zona As Integer) As Double()

        '******************************************
        'Variables de Generales para el Calculo
        '******************************************

        'Achatamiento (f)
        Dim flat As Double = 1 / iflat
        'Excentricidad (e2)
        Dim Ex As Double = (2 * flat) - (flat * flat)
        'Semi-minor axis (b) (m)
        'Dim SeMenor As Double = SeMayor * (1 - flat)

        'Radianes Este
        Dim Re1 As Double = CoorX / 180 * PI
        Dim Re2 As Double = LCMZ / 180 * PI

        'Radianes Norte
        Dim Rn1 As Double = CoorY / 180 * PI
        Dim Rn2 As Double = (CoorY - LCMZ) / 180 * PI

        'Seno Latitud
        Dim SinLat As Double = Sin(Re1)
        Dim SinLat2 As Double = Sin(2 * Re1)
        Dim SinLat4 As Double = Sin(4 * Re1)
        Dim SinLat6 As Double = Sin(6 * Re1)

        'Excentricidad
        Dim Ex2 As Double = Ex
        Dim Ex4 As Double = Ex ^ 2
        Dim Ex6 As Double = Ex ^ 3

        'Las As
        Dim A0 As Double = 1 - (Ex2 / 4) - ((3 * Ex4 / 64) - ((5 * Ex6) / 256))
        Dim A2 As Double = (3 / 8) * (Ex2 + (Ex4 / 4) + ((15 * Ex6) / 128))
        Dim A4 As Double = (15 / 256) * (Ex4 + ((3 * Ex6) / 4))
        Dim A6 As Double = (35 * Ex6) / 3072

        'Distancia del Meridano
        Dim Term1 As Double = SeMayor * A0 * Re1
        Dim Term2 As Double = -SeMayor * A2 * SinLat2
        Dim Term3 As Double = SeMayor * A4 * SinLat4
        Dim Term4 As Double = SeMayor * A6 * SinLat6
        Dim Md As Double = Term1 + Term2 + Term3 + Term4

        'Radio de Curvatura
        Dim Rho As Double = SeMayor * (1 - Ex2) / (1 - (Ex2 * SinLat * SinLat)) ^ 1.5
        Dim Nu As Double = SeMayor / (1 - (Ex2 * SinLat * SinLat)) ^ 0.5

        'Powers
        Dim Pow1 As Double = Cos(Re1)
        Dim Pow2 As Double = Pow1 ^ 2
        Dim Pow3 As Double = Pow1 ^ 3
        Dim Pow4 As Double = Pow1 ^ 4
        Dim Pow5 As Double = Pow1 ^ 5
        Dim Pow6 As Double = Pow1 ^ 6
        Dim Pow7 As Double = Pow1 ^ 7

        'Diferencia de Longitud
        Dim Dlong1 As Double = Rn2
        Dim Dlong2 As Double = Dlong1 ^ 2
        Dim Dlong3 As Double = Dlong1 ^ 3
        Dim Dlong4 As Double = Dlong1 ^ 4
        Dim Dlong5 As Double = Dlong1 ^ 5
        Dim Dlong6 As Double = Dlong1 ^ 6
        Dim Dlong7 As Double = Dlong1 ^ 7
        Dim Dlong8 As Double = Dlong1 ^ 8

        'Tangente de Latitud
        Dim Tan1 As Double = Tan(Re1)
        Dim Tan2 As Double = Tan1 ^ 2
        Dim Tan4 As Double = Tan1 ^ 4
        Dim Tan6 As Double = Tan1 ^ 6

        'Psi Nu/Rho
        Dim Psi1 As Double = Nu / Rho
        Dim Psi2 As Double = Psi1 ^ 2
        Dim Psi3 As Double = Psi1 ^ 3
        Dim Psi4 As Double = Psi1 ^ 4

        'Este
        Dim E1 As Double = Nu * Dlong1 * Pow1
        Dim E2 As Double = Nu * Dlong3 * Pow3 * (Psi1 - Tan2) / 6
        Dim E3 As Double = Nu * Dlong5 * Pow5 * (4 * Psi3 * (1 - 6 * Tan2) + Psi2 * (1 + 8 * Tan2) - Psi1 * (2 * Tan2) + Tan4) / 120
        Dim E4 As Double = Nu * Dlong7 * Pow7 * (61 - 479 * Tan2 + 179 * Tan4 - Tan6) / 5040

        Dim Sume As Double = E1 + E2 + E3 + E4
        Dim Sume2 As Double = CSF * Sume

        Dim Est = Sume2 + FaloEste

        'Norte
        Dim N1 As Double = Nu * SinLat * Dlong2 * Pow1 / 2
        Dim N2 As Double = Nu * SinLat * Dlong4 * (4 * Psi2 + Psi1 - Tan2) / 24
        Dim N3 As Double = Nu * SinLat * Dlong6 * (8 * Psi4 * (11 - 24 * Tan2) - 28 * Psi3 * (1 - 6 * Tan2) + Psi2 * (1 - 32 * Tan2) - Psi1 * (2 * Tan2) + Tan4) / 720
        Dim N4 As Double = Nu * SinLat * Dlong8 * Pow7 * (1385 - 3111 * Tan2 + 543 * Tan4 - Tan6) / 40320
        Dim SumN As Double = Md + N1 + N2 + N3 + N4

        Dim sumN1 As Double = CSF * SumN
        Dim Norte As Double = sumN1

        Dim Coordenadas(2) As Double
        Coordenadas(1) = Est
        Coordenadas(2) = Norte

        Return Coordenadas

    End Function



Cualquier duda o sugerencia, sea bienvenida

4 comentarios:

guichogp dijo...

amigo este codigo es en java o visual basic o en que programa

CHIVOPOETA dijo...

y no tendrán una aplicación ejecutable para eso?

Anónimo dijo...

porque no vas y chiflas a tu mauser

Alejandro García dijo...

el código es Visual Basic

Publicar un comentario en la entrada

toda duda o sugerencia sea bienvenida...