我正在尝试找到与给定群集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更接近。 在这种情况下,我应该更好地使用哪个公式?
答案 0 :(得分:3)
正如@Azat所说,你的照片是错误的。实际上有两个原因。
首先,你已经忘记了一些非常重要的东西 - 地图+/- 180度的“边缘”实际上在物理地球上相遇。也就是说,你需要(至少)把你的照片变成一个圆柱体,就像一些2D视频游戏一样。
其次,你需要记住是什么使得通过纬度/长度计算球体上的距离如此棘手:当你靠近北极/南极时,相同的经度值会靠近在一起,而纬度值将保持相同的距离。
(由google earth提供)
红线是180度纬度标记的位置(簇1和3几乎是该线上的反射)。 现在很明显,群集3比群集2更接近群集1。
答案 1 :(得分:1)
你所有的计算都是完全准确的。
你真的很接近南极,为什么你在绘制点时会犯很大的错误,比如地球是否平坦。
这是来自谷歌地球的图片,地球是圆的,我们可以看到 1 更接近 3 而不是 2 :< / p>