viernes, 2 de septiembre de 2011

Convertir Coordenadas UTM a Geodésicas

Si bien existen por Internet varios lugares donde se pueden conseguir convertidores de coordenadas, siempre puede ser útil el tener tu propia rutina de conversión, sobre todo cuando te propones mostrar ubicaciones por medio de Google Maps en tus aplicaciones, y viendo que no hay mucha información al respecto, les comparto una función para este objetivo.

Para poder utilizar esta funcion es necesario importar la clase Math:

Imports System.Math
se declaran las siguientes constantes: y ahora si, les dejo la función:


Const SeMa = 6378206.4                'Semi major axis (a) (m)
Const pi As Double = 3.14159265358979 'Pi
Const FE = 500000                     'False easting (m)
Const CSF = 0.9996                    'Central Scale factor (K0)
Const ZD = 6                          'Zone width (degrees)
Const LCMZ = -177                     'Longitude of the central meridian of zone 1(degrees)
Const iflat = 294.9786982138          'Inverse flattening (1/f)
y ahora si, les dejo la función:



Public Function Geodesicas(ByVal UTMX As Double, ByVal UTMY 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 SeMb As Double = SeMa * (1 - flat)

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

        Dim m As Double = UTMY / 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

        'Easting
        Dim E As Double = UTMX - FE

        '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 = SeMa * (1 - Ex) / (1 - Ex * SinLat * SinLat) ^ 1.5
        Dim Nu As Double = SeMa / (1 - Ex * SinLat * SinLat) ^ 0.5

        'x = E'/(k0n')
        Dim x As Double = (E / CSF) / Nu

        't'=tanj'
        Dim t As Double = Tan(Lat)
        Dim t2 As Double = t ^ 2
        Dim t4 As Double = t ^ 4
        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

        'Pie punto de latitud
        Dim Tm1 As Double = -((t / (CSF * Rho)) * x * E / 2)
        Dim Tm2 As Double = (t / (CSF * Rho)) * ((x ^ 3) * E / 24) * (-4 * y2 + 9 * y * (1 - t2) + 12 * t2)
        Dim Tm3 As Double = -(t / (CSF * Rho)) * ((x ^ 5) * E / 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)) * ((x ^ 7) * E / 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 * ((x ^ 3) / 6) * (y + 2 * t2)
        Dim lon3 As Double = SecLat * ((x ^ 5) / 120) * (-4 * y3 * (1 - 6 * t2) + y2 * (9 - 68 * t2) + 72 * y * t2 + 24 * t4)
        Dim lon4 As Double = -SecLat * ((x ^ 7) / 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 CLL(2) As Double
        CLL(1) = Latitud
        CLL(2) = Longitud

        Return CLL

End Function

Esta función nos devuelve las coordenadas Latitud y Longitud en un arreglo numérico, y así, ya podremos utilizarla en nuestras aplicaciones


Cabe mencionar que esta función no es totalmente de mi autoria, sino que esta basada en el trabajo de Gabriel Ortiz en cuanto a la conversion de coordenadas UTM Nad27 a Geodésicas WGS84.




1 comentario:

Alejandro García dijo...

esto me servira para convertir GTM a coordenadas geográficas?