计算地理点之间的距离

时间:2015-12-28 11:11:50

标签: java gis

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

enter image description here

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

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函数可以获得类似的结果):

  • 第1组和第2组之间的距离:628.37

  • 群集1和3之间的距离:513.73

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

2 个答案:

答案 0 :(得分:3)

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

首先,你已经忘记了一些非常重要的东西 - 地图+/- 180度的“边缘”实际上在物理地球上相遇。也就是说,你需要(至少)把你的照片变成一个圆柱体,就像一些2D视频游戏一样。

其次,你需要记住是什么使得通过纬度/长度计算球体上的距离如此棘手:当你靠近北极/南极时,相同的经度值会靠近在一起,而纬度值将保持相同的距离。

如果你在球体上正确地绘制它们,它应该看起来像这样:
Clusters

(由google earth提供)

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

答案 1 :(得分:1)

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

你真的很接近南极,为什么你在绘制点时会犯很大的错误,比如地球是否平坦。

这是来自谷歌地球的图片,地球是圆的,我们可以看到 1 更接近 3 而不是 2 :< / p>

position of centroids on round earth