Conversión de coordenadas Gauss-Krüger a geográficas usando los elipsoides Hayford o WGS 84: caso Argentina

La proyección UTM está basada en Gauss-Krüger y presenta muy pocas diferencias con respecto a ésta última proyección. Las diferencias que se tienen que tener en cuenta son tres. La primera es el factor de escala (en UTM k=0.9996 y en Gauss-Krüger k=1) el cual debe ser cambiado en tres de las expresiones de Coticchia-Surace. La segunda diferencia es la composición y denominación de los husos UTM que difiere de la forma en que se hace para Gauss-Krüger. En la transformación UTM-geográfica el huso permitía la determinación de la coordenada geográfica del meridiano central. En Gauss-Kruger introducimos directamente el valor del meridiano central el cual nos permitirá seleccionar el factor adecuado de retranqueo para las X que en el caso de UTM era fijo (500.000). Por último, hay que tomar en cuenta una variación en el factor de retranqueo (falso Norte) en las Y, el cual depende del tipo de elipsoide, y que en el el caso de UTM era fijo (10.000.000) para el hemisferio Sur.

Con base en lo anterior, se modificó el programa que aquí se presenta:

Conversión de coordenadas UTM a geográficas usando los elipsoides Hayford o WGS 84

para adaptarlo al caso Argentino de las 7 fajas (meridianos centrales 72, 69, 66, 63, 60, 57, 54 para las fajas 1 a 7; respectivamente). Se probó con el siguiente ejemplo (faja 2, elipsoide WGS 84):

X = 2379996.69 
Y = 6625759.55
meridiano central = -69
origen de latitudes = -90
falso Este = 2.500.000
falso Norte = 0
longitud 70º 15' 0''
latitud 30º 30' 0''

el cual fue verificado con la calculadora geodésica que se encuentra en:

http://www.gabrielortiz.com/conversor_coordenadas2/conversor.asp

La salida del programa aquí propuesto fue la siguiente:

Programa para convertir coordenadas Gauss-Kruger en geograficas

Escoja un numero para seleccionar el elipsoide de referencia

Hayford = 1            WGS 84 = 2

Su eleccion es = ? 2
(WGS 84)

meridiano central = ? 69

Hemisferio Norte o Sur (introduzca una "N" o "S"; pueden ser minusculas)

Hemisferio = ? s

UTM X = ? 2379996.69
UTM Y = ? 6625759.55

long(grados decimales) = -70.249999993; lat(grados decimales) = -30.500000081

long(gºmm'ss.s'') = -70º -14' -59.999974168''; lat(gºmm'ss.s'') = -30º -30' -0.000290795''

El ejecutable para Windows, en formato comprimido, se puede bajar del siguiente enlace:

kruger_geo.zip

Se agradece comentar si se producen resultados no deseados (porque sólo lo probé para la faja 2 y con un sólo elipsoide) o alguna sugerencia.

Nota: La aplicación en el sentido contrario también ha sido resuelta en:

Conversión de coordenadas geográficas a Gauss-Krüger usando los elipsoides Hayford o WGS 84: caso Argentina

Esta entrada fue publicada en Código C++, Transformar Coordenadas y etiquetada , . Guarda el enlace permanente.

23 Respuestas a Conversión de coordenadas Gauss-Krüger a geográficas usando los elipsoides Hayford o WGS 84: caso Argentina

  1. Pingback: Articulo Indexado en la Blogosfera de Sysmaya

  2. Leandro dijo:

    Quría consultarte como se realiza paso de un sistema de coordenadas a otro. Basicamente tengo que hacer lo mismo que hace el programa C++ que publicaste pero en java y no encuentro ningun codigo que me pueda dar una mano por eso acudo a tus conocimientos. Donde trabajo tenemos que pasar unas coordenadas que se encuentran en Gauss-Krüger WGS 84 a geogràficas para poder dibujarlas sobre google maps. Agradecería si me puedes ayudar.
    Leo.

  3. Leandro dijo:

    Este es código en java, siguiendo por la planilla excel que baje del sitio. Algunas cosas a tener en cuenta es que el calculo es para la faja 2 ya que las coordenas Gauss Krugger estan calculadas sobre la Provincia de Mendoza. El elipsoide es WGS84. Lo que necesito saber es que debo modificar para que el pasaje sea de Gauus Krugger y no de UTM. Por lo que lei una de las modificaciones es el factor escala k, el cual debe ser 1.

    public static double [] pasarCoordenadasGaussKruggerAGeodesicas (double puntoX, double puntoY){
    
            double coordenadaGeodesicas [] = new double [2];
            double latitudHexadecimal= 0.0, longitudHexadecimal= 0.0, fiEnRadianes = 0.0;
            double zeta, alSurDelEcuador, fi, ni, a, a1, a2, j2, j4, j6, alfa, beta, gama, bFi, b, xi, eta, senHXi, deltaLambda, tau = 0.0;
            double factorEscalaK = 0.0;
            int meridianoCentral=0, uso = 0;
    
            //El factor escala k para Gauss Krugger es k=1 y
            //para UTM 0.9996. En nuestro caso es 1.
            factorEscalaK = 1;
    
            //Los valores utilizados son para el elipsoide WGS84
            double semiEjeMayor = 6378137.0;
            double semiEjeMenor = 6356752.315;
            double exentricidad = 0.081819191;
            double exentricidadPrima = 0.082094438;
            double exentricidadPrimaALaDos = 0.006739497;
            double radioPolarDeCurvatura = 6399593.626;
    
            //Se utiliza como meridiano centra 69 que es el que corresponde
            //a la faja 2 en Argentina donde esta Mendoza.
            meridianoCentral = 69;
            uso= 42;
            
            //Se utiliza el Hemisferio Sur
            alSurDelEcuador = puntoY - 10000000;
            //System.out.println("alSurDelEcuador: " + alSurDelEcuador);
    
            //Realizamos los calculos correspondientes
            fi = (alSurDelEcuador) / (6366197.724 * factorEscalaK);
            //System.out.println("fi: " + fi);
            ni = (radioPolarDeCurvatura/(1 + exentricidadPrimaALaDos * (Math.pow(Math.pow(Math.cos(fi), 2), (1 / 2))) )) * factorEscalaK;
            //System.out.println("ni: " + ni);
            a  = (puntoX - 500000) / ni;
            //System.out.println("a: " + a);
            a1 = Math.sin(2 * fi);
            //System.out.println("a1: " + a1);
            a2 = a1 * (Math.pow(Math.cos(fi), 2));
            //System.out.println("a2: " + a2);
            j2 = fi + (a1 / 2);
            //System.out.println("j2: " + j2);
            j4 = (3 * j2 + a2) / 4;
            //System.out.println("j4: " + j4);
            j6 = (5* j4 + a2 * Math.pow(Math.cos(fi),2)) /3;
            //System.out.println("j6: " + j6);
            alfa = (3.0/4.0) * exentricidadPrimaALaDos;
            //System.out.println("alfa: " + alfa);
            beta = (5.0/3.0) * Math.pow(alfa,2);
            //System.out.println("beta: " + beta);
            gama = (35.0/27.0) * Math.pow(alfa, 3);
            //System.out.println("gama: " + gama);
            bFi = factorEscalaK * radioPolarDeCurvatura * (fi - (alfa * j2) + (beta * j4) - (gama * j6));
            //System.out.println("bFi: " + bFi);
            b   = (alSurDelEcuador - bFi) / ni;
            //System.out.println("b: " + b);
            zeta =((exentricidadPrimaALaDos * Math.pow(a, 2)) / 2.0) * Math.pow(Math.cos(fi), 2);
            //System.out.println("zeta: " + zeta);
            xi = a * (1.0-(zeta / 3.0));
            //System.out.println("xi: " + xi);
            eta = b * (1.0 - zeta) + fi;
            //System.out.println("eta: " + eta);
            senHXi = (Math.exp(xi)-Math.exp((-1.0 * xi))) / 2.0;
            //System.out.println("senHXi: " + senHXi);
            deltaLambda = Math.atan( senHXi / Math.cos(eta));
            //System.out.println("deltaLambda: " + deltaLambda);
            tau = Math.atan(Math.cos(deltaLambda) * Math.tan(eta));
            //System.out.println("tau: " + tau);
    
            //Calculo fi en radianes para poder obtener la latitud
            //en Hexadecimales.
            fiEnRadianes = fi + (1 + exentricidadPrimaALaDos * Math.pow(Math.cos(fi), 2) - (2/3) * exentricidadPrimaALaDos * Math.sin(fi) * Math.cos(fi) * (a - fi)) * (tau - fi);
            //System.out.println("fiEnRadianes: " + fiEnRadianes);
            latitudHexadecimal = (fiEnRadianes / Math.PI) * 180;
            //System.out.println("latitudHexadecimal: " + latitudHexadecimal);
    
            //Obtengo la longitud
            longitudHexadecimal = (deltaLambda / Math.PI) * 180 + meridianoCentral;
            //System.out.println("longitudHexadecimal: " + longitudHexadecimal);
    
            //Guardamos en el arreglo la latitud y longitud, en Hexadecimal,
            //en la primer posición y segunda posición segun corresponda.
            coordenadaGeodesicas [0] = latitudHexadecimal;
            coordenadaGeodesicas [1] = longitudHexadecimal;
    
            return coordenadaGeodesicas;
        }
    
  4. Leandro dijo:

    Te comento, las modificaciones que realice y me da igual que a vos, las diferencias son mìnimas con respecto al desarrollo en C++ supongo que debe ser por una cuestion de redondeo. Las modificaciones que realice son:
    Factor Escala k = 1
    Meridiano Central = -69
    Falso este = 2500000 (que es en la linea) a = (puntoX – 500000) / ni;
    Lo que si tengo un problema, segun el programa GEOCAL par las coordenadas Gauss Este = 2514100 y Norte = 6361410, debería dar latitud = -32.891831 longitud = -68.850183. (Es la direcciòn de donde trabajo) y me esta dando tanto a vos como a mi latitud = -32.889972 longitud = -68.849202.

    • Con respecto a esto te puedo decir: utiliza la calculadora geodésica que está en el sitio de Gabriel Ortiz y si da lo mismo que lo que nos está dando a nosotros entonces el problema estaría en GEOCAL. Yo revise lo cálculos pormenorizadamente y los mios coinciden con los de Gabriel. El también señala que los cálculos basados en la ecuaciones de Coticchia-Surace no son tan “exactos” como los de otro procedimiento que el refiere pero cuyo nombre no recuerdo. Sin embargo, todo lo que está aquí en este Blog está basado en Coticchia-Surace y las diferencias están, en muchos casos, por debajo del metro. Cuando comparo, en algunos casos, con las transformaciones internas que da mi GPS Colorado 300; este último produce resultados que difieren hasta en 20 metros.

    • José dijo:

      Leandro, viendo el código que pusiste arriba, creo que el Falso Norte que tenés que usar no es 10.000.000 (este valor es válido para UTM) sino 10.001.965,7293148 , y el retranqueo de las X deberia ser 2.500.000 en vez de 500.000; creo que con estas modificaciones te va a dar el resultado esperado.
      Saludos

  5. Leandro dijo:

    Te mando los valores que me dan los calculos del programa para las coordenadas Gauss Este = 2514100 y Norte = 6361410.

    factorEscalaK = 1;
    //Los valores utilizados son para el elipsoide WGS84
    double semiEjeMayor = 6378137.0;
    double semiEjeMenor = 6356752.315;
    double exentricidad = 0.081819191;
    double exentricidadPrima = 0.082094438;
    double exentricidadPrimaALaDos = 0.006739497;
    double radioPolarDeCurvatura = 6399593.626;
    meridianoCentral = -69;

    alSurDelEcuador: -3638590.0
    fi: -0.5715483806421592
    ni: 6356752.312857752
    a: 0.0022196869258945037
    a1: -0.9099223276788169
    a2: -0.6436693571363711
    j2: -1.0265095444815677
    j4: -0.9307994976452686
    j6: -1.7031074438607317
    alfa: 0.0050546227499999995
    beta: 4.258201857469593E-5
    gama: 1.6740580875556268E-7
    bFi: -3624724.1492115925
    b: -0.002181279072390653
    zeta: 1.1744632968819022E-8
    xi: 0.002219686917204701
    eta: -0.5737296596889315
    senHXi: 0.002219688739941772
    deltaLambda: 0.002642850189063538
    tau: -0.5737280676698059
    fiEnRadianes: -0.5737384592151334

    latitudHexadecimal: -32.87279225736586
    longitudHexadecimal: -68.8485758382813

  6. Leandro dijo:

    Lo que te puedo aportar que en GEOCALC se utiliza Gauss Krugger con DATUM = Campo Inchauspe y se debe convertir a geograficas con DATUM = 186 WGS 184. Quizas las diferencias sean por los DATUM. En la pagina que me diste sale un articulo que habla gustamente de esto quizas sea ese el problema.

    Conversión de datum con el modelo de 7 parámetros Bursa-Wolf
    —————————————————————–
    Uno de los temas que más dudas genera es sin duda el proceso de cambio de datum, que por cierto, está muy de actualidad con el uso masivo de los sistemas GPS. Cada vez es más necesario convertir información geográfica a datums locales. En este artículo se detalla en profundidad el proceso de conversión de datum con el modelo de 7 parámetros de Bursa-Wolf. El texto acompaña a los conceptos introducidos con un ejercicio completo y una implementación de las ecuaciones en hoja de cálculo.

    • Ahi están las diferencias. Las transformaciones con cambio de datum son “delicadas” y válidas para las regiones para las cuales fueron desarrolladas. Por eso es que tienes que validar con puntos expresados en ambos datums. Si mal no recuerdo, todo lo que refiero en este Blog con cambio de datum (lamentablemente nada que involucre Gauss-Krüger) concuerda, en su mayoría, con una precisión mejor que el metro. Por otra parte, para que tus resultados concuerden para el cambio de datum tienes que desarrollar también la aplicación en sentido inverso: de geográficas a Gauss-Krüger. Allí he tenido problemas con una de las coordenadas y por eso es que no he desarrollado la aplicación completa para Gauss Krugger con DATUM Campo Inchauspe.

  7. catriel dijo:

    necesito ubicar en un plano de autocad 5 puntos, yo tengo la ubicacion por GPS de los 5 puntos estas ubicaciones son Fe1 34°14’32”/58°45’28” fe2 34°14’47”-58°45’28” fe3 34°14’49” 58°45’31” fe434°14’57”-58°45’38” fe5 34°14’50”-58°46’03”. el tema es que me piden que las pase a Gauss-Krüger Datum´84 en el marco del Posgar 94”.
    la verdad que no puedo encontrar la forma de realizarlo.

    • Si te esperas un momento, veré si te las puedo convertir con ArcGis. Ayudaría si me dices a que país te refieres porque no indicas si la latitud es N, S, etc (aunque imagino que es Argentina). El Posgar 94 usa el elipsoide WGS 84. Sólo me faltaría ver si es lo contrario de la transformación aquí expresada. No haría falta ArcGis sino un conversor (la aplicación en sentido contrario no la he desarrollado por problenas de cálculo en una coordenada).

      Ya con esto:

      http://www.ign.gob.ar/descargas/postgar/red_posgar94.pdf

      puedo verificarlo.

  8. Alex dijo:

    Toma ya!!!, me han encantado estos post… Pa´flipar.
    Siento no poder aportar nada :-)

    Saludos :-)

  9. Jess dijo:

    que genial!! gracias por el programita!! buenisimo!!!

  10. Hernan dijo:

    Estimados,
    alguien realizo la funcion java inversa (PasarCoordenadasGaussKruggerAGeodesicas)??? yo dispongo de las coordenadas geodesicas (originadas por un GPS, y necesito convertirlas a una variante de Gauss Krugger.
    Si alguien reescribio el algoritmo para hacer la operacion inversa se lo agradecere
    Muchas Gracias

  11. Pingback: Conversor de coordenadas (C/C++) |

  12. Andrea dijo:

    Ulilicé las formulas para Santa Fe, faja 5 y dio igual que la transformación que realiza AutoCad.
    Muchas gracias.

    • Gracias por probarlo y verificar que da igual. En el sentido contrario, de geográficas a Gauss-Krüger, me ha dado problemas pero para una sola de las coordenadas. Por eso no lo he publicado. Algún día de estos lo rescato y veo donde está el error. Es fundamental para el cambio de datum (por ejemplo Campo Inchauspe a POSGAR o viceversa). Si encuentro el error no me sería difícil programarlo porque he creado una Clase Coordenadas.

      Saludos

    • Gracias a tu respuesta, revisé el programa y encontré el error. Próximamente lo posteo.

      Saludos

  13. Pingback: Conversión de coordenadas geográficas a Gauss-Krüger usando los elipsoides Hayford o WGS 84: caso Argentina |

  14. Juan Carlos Pucci dijo:

    Tengo un mapa del noroeste argentino con areas de exploracion pero tengo que plotear en un mapa que por ejemplo tiene los valores X (m North) 7469999,7800 y 4567169,2700 y no se como transformar otras areas que tienen los valores X (m North) 7363977,4312 y Y (m East) 3072202,1270 digamos que me desconcierta es Y , que pasa de 4 a 3, el dato es Posgar 94 los otras areas varian el datum.
    Desde ya muy agradecido
    carlos Pucci

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s