Java, 経度緯度から2点間の距離と方角(方向・方位)を求める

2点間の距離を求める関数

引数 precision で精度(小数点以下の桁数)を指定する。

public static float getDistance(double lat1, double lng1, double lat2, double lng2, int precision) {
    int R = 6371; // km
    double lat = Math.toRadians(lat2 - lat1);
    double lng = Math.toRadians(lng2 - lng1);
    double A = Math.sin(lat / 2) * Math.sin(lat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(lng / 2) * Math.sin(lng / 2);
    double C = 2 * Math.atan2(Math.sqrt(A), Math.sqrt(1 - A));
    double decimalNo = Math.pow(10, precision);
    double distance = R * C;
    distance = Math.round(decimalNo * distance / 1) / decimalNo;
    return (float) distance;
}

2点間を結ぶ方角を求める関数

北を 0 として 360 までで、方角を表わす。

public static int getDirection(double latitude1, double longitude1, double latitude2, double longitude2) {
    double lat1 = Math.toRadians(latitude1);
    double lat2 = Math.toRadians(latitude2);
    double lng1 = Math.toRadians(longitude1);
    double lng2 = Math.toRadians(longitude2);
    double Y = Math.sin(lng2 - lng1) * Math.cos(lat2);
    double X = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lng2 - lng1);
    double deg = Math.toDegrees(Math.atan2(Y, X));
    double angle = (deg + 360) % 360;
    return (int) (Math.abs(angle) + (1 / 7200));
}

参考:地図から距離、方角方位、面積を得る – Google Maps
   Haversine formula – Wikipedia, the free encyclopedia
   Calculate distance and bearing between two Latitude/Longitude points using Haversine formula in JavaScript

«
»