sábado, 13 de julio de 2013

Cálculo de distancia entre dos coordenadas decimales y conversión de coordenada decimal a UTM

image

 

 

 

 

 

 

La clase calculoUTM tiene los métodos UtmX y UtmY para convertir coordenadas geográficas a UTM, se usa los semiejes del elipsoide Hayford y las ecuaciones de Coticchia-Surace. Por otro lado, la clase calculoDistancia tiene el método Distancia para calcular la distancia entre dos coordenadas decimales, en este caso se usa la ecuación de Harvesine.


 

 

principalUTM.java

 

public class principalUtm {

public static void main(String[] args) {

            //Coordenda decimal, casa Santa Apolonia

            double La1 = -12.003093;

            double Lo1 = -77.094313;

           

            // Coordenada decimal, punto final

            double La2 = -11.99096965;

            double Lo2 = -77.06366275;

            calculoUtm oCalculo = new calculoUtm();

            System.out.println("UtmX: "+oCalculo.UtmX(Lo1, La1));

            System.out.println("UtmY: "+oCalculo.UtmY(Lo1, La1));

            System.out.println("Distancia: "+calculoDistancia.Distancia(La1, Lo1, La2, Lo2));

      }

}

 

calculoUTM.java

 

public class calculoUtm {

 

      // Semiejes del elipsoide de Hayford

      double A = 6378388;

      double B = 6356911.946130;

 

      double E = Math.sqrt(Math.pow(A, 2) - Math.pow(B, 2)) / A;

      double E1 = Math.sqrt(Math.pow(A, 2) - Math.pow(B, 2)) / B;

      double E2 = Math.pow(E1, 2);

      double C = Math.pow(A, 2) / B;

 

      public double UtmX(double Lo1, double La1) {

            // COnversiones

            double Lat = La1 * Math.PI / 180;

            double Lon = Lo1 * Math.PI / 180;

            double Huso = Math.floor((Lo1 / 6) + 31);

            double Lamda = (Huso * 6 - 183) * Math.PI / 180;

            double dLamda = Lon - Lamda;

 

            // Calculo de parametros

            double AA = Math.cos(Lat) * Math.sin(dLamda);

            double EE = 0.5 * Math.log((1 + AA) / (1 - AA));

 

            double feUTM=0.996;

            double VV = Math.pow(Math.cos(Lat), 2);

            VV = Math.sqrt(1 + E2 * VV);

            VV = (C / VV) * feUTM; // 0.9996 factor de escala de la proyeccion UTM

            double CC = (E2 / 2) * Math.pow(EE, 2) * Math.pow(Math.cos(Lat), 2);

            //Cálculo de X

            double X = EE * VV * (1 + CC / 3) + 500000;

            return X;

 

      }

      public double UtmY(double Lo1, double La1) {

            // COnversiones

            double Lat = La1 * Math.PI / 180;

            double Lon = Lo1 * Math.PI / 180;

            double Huso = Math.floor((Lo1 / 6) + 31);

            double Lamda = (Huso * 6 - 183) * Math.PI / 180;

            double dLamda = Lon - Lamda;

 

            // Calculo de parámetros

            double AA = Math.cos(Lat) * Math.sin(dLamda);

            double EE = 0.5 * Math.log((1 + AA) / (1 - AA));

            double NN = Math.atan(Math.tan(Lat) / Math.cos(dLamda));

            NN = NN - Lat;

            double VV = Math.pow(Math.cos(Lat), 2);

            VV = Math.sqrt(1 + E2 * VV);

            double feUTM=0.996;

            VV = (C / VV) * feUTM; // 0.9996 factor de escala de la proyeccion UTM

            double CC = (E2 / 2) * Math.pow(EE, 2) * Math.pow(Math.cos(Lat), 2);

            double A1 = Math.sin(2 * Lat);

            double A2 = A1 * Math.pow(Math.cos(Lat), 2);

 

            // Otros cálculos

            double J2 = Lat + A1 / 2;

            double J4 = (3 * J2 + A2) / 4;

            double J6 = (5 * J4 + A2 * Math.pow(Math.cos(Lat), 2)) / 3;

            double alfa = ((double) 3 / 4) * E2;

            double beta = ((double) 5 / 3) * Math.pow(alfa, 2);

            double ganma = ((double) 35 / 27) * Math.pow(alfa, 3);

            double Bo = 0.9996 * C * (Lat - alfa * J2 + beta * J4 - ganma * J6);

 

            // Cálculo final de coordenadas UTM

            double Y = NN * VV * (1 + CC) + Bo;

            if (La1 < 0) {

                  Y = Y + 10000000;

            }

            return Y;

      }

}

 

 

calculoDistancia.java

public class calculoDistancia {

      public static double Distancia(double La1, double Lo1, double La2, double Lo2) {

            double Distancia = 0, Distancia1 = 0;

            double r = 6378;

 

            //Punto inicial

            La1 = La1* Math.PI / 180;

            Lo1 = Lo1 * Math.PI / 180;

 

            // Punto final

            La2 = La2 * Math.PI / 180;

            Lo2 = Lo2 * Math.PI / 180;        

            //Distancia = 6378*Math.acos(Math.sin(La1)*Math.sin(La2)+ Math.cos(La1)* Math.cos(La2)*Math.cos(Lo1 - Lo2));

            Distancia1 = Math.pow(Math.sin((Lo2 - Lo1) / 2), 2);

            Distancia1 = Math.cos(La1) * Math.cos(La2) * Distancia1;

            Distancia1 = Math.pow(Math.sin((La2 - La1) / 2), 2) + Distancia1;

            Distancia1 = Math.sqrt(Distancia1);

            Distancia1 = 2 * r * Math.asin(Distancia1);

            return Distancia1;

      }

}

No hay comentarios:

Publicar un comentario