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