Quand j'étais en école professionnelle, je traitais parfois des cartes, et je pensais profiter de cette opportunité pour conserver les fonctions que je faisais à l'époque.
J'ai utilisé la formule Hubeni expliquée dans Mountain full. la cérémonie
\sqrt{(d_yM)^2+(d_zN \cos µ_y)^2}
est.
Si vous le traduisez en mots d'une manière facile à comprendre
\sqrt{(Différence de latitude x rayon de la courbe méridienne)^2 + (Différence de longitude x rayon de courbure de la ligne 酉 酉 x cos valeur moyenne de la latitude)^2}
Je me suis demandé ce que je faisais. Si vous regardez de près
\sqrt{(c−a)^2+(d−b)^2}
C'est une formule pour trouver la distance entre deux points. Il semble que la formule corrige l'erreur en supposant que la terre est une ellipse.
HubenyDistance.java
public class HubenyDistance {
//Système d'observation du monde
public static final double GRS80_A = 6378137.000;//Long rayon a(m)
public static final double GRS80_E2 = 0.00669438002301188;//Première centrifugeuse e au carré
public static double deg2rad(double deg){
return deg * Math.PI / 180.0;
}
public static double calcDistance(double lat1, double lng1, double lat2, double lng2){
double my = deg2rad((lat1 + lat2) / 2.0); //Latitude moyenne
double dy = deg2rad(lat1 - lat2); //Différence de latitude
double dx = deg2rad(lng1 - lng2); //Différence de longitude
//Trouvez le rayon de courbure de la ligne Uro(Rayon de la ligne reliant l'est et l'ouest)
double sinMy = Math.sin(my);
double w = Math.sqrt(1.0 - GRS80_E2 * sinMy * sinMy);
double n = GRS80_A / w;
//Trouvez le rayon de la courbe méridienne(Rayon de la ligne reliant le nord et le sud)
double mnum = GRS80_A * (1 - GRS80_E2);
double m = mnum / (w * w * w);
//Officiel de Hubeni
double dym = dy * m;
double dxncos = dx * n * Math.cos(my);
return Math.sqrt(dym * dym + dxncos * dxncos);
}
}
Recommended Posts