【问题标题】:Calculating distance between geo points计算地理点之间的距离
【发布时间】:2015-12-28 11:11:50
【问题描述】:

我正在尝试找到与给定集群 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 函数得到类似的结果):

  • 集群 1 和 2 之间的距离:628.37

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

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

【问题讨论】:

  • 公式是对的,但你的图片不对
  • @Azat Nugusbayev:为什么可视化有问题?我用的是 QGIS(X 轴是经度,Y 轴是纬度)。

标签: java gis


【解决方案1】:

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

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

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

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

(由谷歌地球提供)

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

【讨论】:

    【解决方案2】:

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

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

    这是一张来自谷歌地球的图片,地球是圆的,我们可以看到 12 更接近 3

    【讨论】:

    • 好吧,如果我运行 hasrsine(lat1,lon1,lat2,lon2) 和 hasrsine(lat1,lon1,lat3,lon3),我得到 628.37 和 513.73,尽管视觉上的质心 3 比centroid 2. 你能详细说明你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多