Javaで2つの緯度経度の距離を取得する方法


  1. Haversine formulaを使用する方法: Haversine formulaは、球面上の2つのポイント間の距離を求めるために使用されます。以下は、Haversine formulaを使用した距離計算の例です。
public class DistanceCalculator {
    private static final double EARTH_RADIUS = 6371; // 地球の半径(キロメートル)
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                   Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                   Math.sin(dLon / 2) * Math.sin(dLon / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS * c;
        return distance;
    }
    public static void main(String[] args) {
        double lat1 = 35.6895; // 緯度1
        double lon1 = 139.6917; // 経度1
        double lat2 = 34.6937; // 緯度2
        double lon2 = 135.5023; // 経度2
        double distance = calculateDistance(lat1, lon1, lat2, lon2);
        System.out.println("距離: " + distance + " km");
    }
}

このコードは、2つの緯度経度の距離をキロメートル単位で計算します。

  1. Vincenty's formulaeを使用する方法: Vincenty's formulaeは、より正確な距離計算を提供するために開発されたアルゴリズムです。以下は、Vincenty's formulaeを使用した距離計算の例です。
import java.util.function.Function;
public class DistanceCalculator {
    private static final double EARTH_RADIUS = 6371; // 地球の半径(キロメートル)
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        Function<Double, Double> toRadians = Math::toRadians;
        Function<Double, Double> toDegrees = Math::toDegrees;
        double phi1 = toRadians.apply(lat1);
        double phi2 = toRadians.apply(lat2);
        double deltaPhi = toRadians.apply(lat2 - lat1);
        double deltaLambda = toRadians.apply(lon2 - lon1);
        double a = Math.sin(deltaPhi / 2) * Math.sin(deltaPhi / 2) +
                   Math.cos(phi1) * Math.cos(phi2) *
                   Math.sin(deltaLambda / 2) * Math.sin(deltaLambda / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS * c;
        return distance;
    }
    public static void main(String[] args) {
        double lat1 = 35.6895; // 緯度1
        double lon1 = 139.6917; // 経度1
        double lat2 = 34.6937; // 緯度2
        double lon2 = 135.5023; // 経度2
        double distance = calculateDistance(lat1, lon1, lat2, lon2);
        System.out.println("距離: " + distance + " km");
    }
}

このコードは、Vincenty's formulaeを使用して2つの緯度経度の距離を計算します。

上記の例では、2つの緯度経度を直接指定していますが、実際の使用時には動的に値を取得する必要があるかもしれません。また、距離の単位も必要に応じて変更することができます。