计算地理点之间的距离

Calculating distance between geo points

我正在尝试找到最接近给定集群 1 的集群(参见下面的示例)。为了可视化集群,我使用了 QGIS(X 轴是经度,Y 轴是纬度)。

首先我计算了每个集群的质心。因此我得到了以下结果:

Cluster 1:
Lat : -83.5
Lon: -159.3

Cluster 2:
Lat: -80.5
Lon: -123.9

Cluster 3:
Lat: -83.4
Lon: 159.4

我使用 Haversine 公式作为距离度量:

/**
 * Calculates Haversine distance between two points
 * @param lat1
 * @param lon1
 * @param lat2
 * @param lon2
 * @return
 */
private static double haversine(double lat1, double lon1, double lat2, double lon2) {
    double R = 6372.8;
    double dLat = Math.toRadians(lat2 - lat1);
    double dLon = Math.toRadians(lon2 - lon1);
    lat1 = Math.toRadians(lat1);
    lat2 = Math.toRadians(lat2);
 
    double a = Math.pow(Math.sin(dLat / 2),2) + Math.pow(Math.sin(dLon / 2),2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.asin(Math.sqrt(a));
    return R * c;
}

我得到了以下结果(可以通过 运行 haversine 函数得到类似的结果):

因此,虽然从图片中可以清楚地看出集群 2 比集群 3 更接近集群 1,但公式表明集群 3 更近。 对于这种情况,我应该使用哪个公式更好?

你所有的计算都是完全准确的。

你真的离南极很近,所以你在画点时会犯很大的错误,就像地球是平的一样。

这是来自google地球的图片,地球是圆的,我们可以看到1更接近32 :

正如@Azat 所说,你的图片是错误的。实际上有两个原因。

首先,您忘记了一件非常重要的事情 - 地图的 "edges" +/- 180 度实际上在地球上相遇。也就是说,您需要(至少)将图片变成圆柱体,就像一些 2d 视频游戏那样。

其次,您需要记住是什么使得通过 lat/long 计算球体上的距离如此棘手:当您靠近 north/south 极点时,相同的经度值会 靠得更近,而纬度值将保持相同的距离。

如果你把这些正确地绘制在一个球体上,它应该看起来像这样:

(由 google 地球提供)

红线大约是 180 度纬度标记所在的位置(集群 1 和 3 几乎是这条线上的反射)。 现在很明显集群 3 比集群 2 更接近集群 1。