计算地理点之间的距离
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
函数得到类似的结果):
簇 1 和 2 之间的距离:628.37
集群 1 和集群 3 之间的距离:513.73
因此,虽然从图片中可以清楚地看出集群 2 比集群 3 更接近集群 1,但公式表明集群 3 更近。
对于这种情况,我应该使用哪个公式更好?
你所有的计算都是完全准确的。
你真的离南极很近,所以你在画点时会犯很大的错误,就像地球是平的一样。
这是来自google地球的图片,地球是圆的,我们可以看到1更接近3比 2 :
正如@Azat 所说,你的图片是错误的。实际上有两个原因。
首先,您忘记了一件非常重要的事情 - 地图的 "edges" +/- 180 度实际上在地球上相遇。也就是说,您需要(至少)将图片变成圆柱体,就像一些 2d 视频游戏那样。
其次,您需要记住是什么使得通过 lat/long 计算球体上的距离如此棘手:当您靠近 north/south 极点时,相同的经度值会 靠得更近,而纬度值将保持相同的距离。
如果你把这些正确地绘制在一个球体上,它应该看起来像这样:
(由 google 地球提供)
红线大约是 180 度纬度标记所在的位置(集群 1 和 3 几乎是这条线上的反射)。 现在很明显集群 3 比集群 2 更接近集群 1。
我正在尝试找到最接近给定集群 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 更近。 对于这种情况,我应该使用哪个公式更好?
你所有的计算都是完全准确的。
你真的离南极很近,所以你在画点时会犯很大的错误,就像地球是平的一样。
这是来自google地球的图片,地球是圆的,我们可以看到1更接近3比 2 :
正如@Azat 所说,你的图片是错误的。实际上有两个原因。
首先,您忘记了一件非常重要的事情 - 地图的 "edges" +/- 180 度实际上在地球上相遇。也就是说,您需要(至少)将图片变成圆柱体,就像一些 2d 视频游戏那样。
其次,您需要记住是什么使得通过 lat/long 计算球体上的距离如此棘手:当您靠近 north/south 极点时,相同的经度值会 靠得更近,而纬度值将保持相同的距离。
如果你把这些正确地绘制在一个球体上,它应该看起来像这样:
(由 google 地球提供)
红线大约是 180 度纬度标记所在的位置(集群 1 和 3 几乎是这条线上的反射)。 现在很明显集群 3 比集群 2 更接近集群 1。