package osm.surveyor.util;
/**
* The MIT License (MIT)
* Copyright(C) 2007-2012 やまだらけ
* http://yamadarake.jp/trdi/report000001.html
* 「Cords.java」を改変
* 2016-10-03
*
* @author やまだらけ yama_darake@yahoo.co.jp
*
*/
public class GeoDistance {
public static final double GRS80_A = 6378137.000; // 赤道半径(m)
public static final double GRS80_E2 = 0.00669438002301188;
public static final double GRS80_MNUM = 6335439.32708317; //
public static final double WGS84_A = 6378137.000;
public static final double WGS84_E2 = 0.00669437999019758;
public static final double WGS84_MNUM = 6335439.32729246;
/**
* 角度(180度)をラジアン(2π)に変換する
* @param deg
* @return
*/
public static double deg2rad(double deg){
return deg * Math.PI / 180.0;
}
/**
* 距離(m)を返す
* @param lat1
* @param lng1
* @param lat2
* @param lng2
* @return
*/
public static double calcDistHubeny(double lat1, double lng1,
double lat2, double lng2){
double my = deg2rad((lat1 + lat2) / 2.0); // 平均緯度
double dy = deg2rad(lat1 - lat2); // 2点間の緯度
double dx = deg2rad(lng1 - lng2); // 2点間の経度
double sin = Math.sin(my);
double w = Math.sqrt(1.0 - GRS80_E2 * sin * sin);
double m = GRS80_MNUM / (w * w * w);
double n = GRS80_A / w;
double dym = dy * m;
double dxncos = dx * n * Math.cos(my);
return Math.sqrt(dym * dym + dxncos * dxncos);
}
public static void main(String[] args){
System.out.println("Coords Test Program");
double lat1, lng1, lat2, lng2;
lat1 = Double.parseDouble(args[0]);
lng1 = Double.parseDouble(args[1]);
lat2 = Double.parseDouble(args[2]);
lng2 = Double.parseDouble(args[3]);
double d = calcDistHubeny(lat1, lng1, lat2, lng2);
System.out.println("Distance = " + d + " m");
}
}