事情没那么简单。您通常不能使用欧几里得距离。这就是我认为你可以做到的方式:
正确的方法
这样做的正确方法是计算大圆距离(表面上最短的步行距离),我从来没有真正理解过,但谷歌很容易(而且 adamk 已经给了你一个链接) .
懒惰的方式
假设您的点距离两极不太近,并且它们彼此靠近。然后您可以使用纬度和经度,就好像它们是欧几里得坐标一样。 (这基本上是一些cylindrical projection)。 1 纬度将是 (earth_circumference / 360) 长,1 经度将是 (cos(lat) * earth_circumference / 360) 长。
完整的代码如下所示:
double distance_lazy(double lat1, double lon1, double lat2, double lon2){
double xDist = (lat2 - lat1) * EARTH_CIRCUMFERENCE / 360.0;
double yDist = cos(lat1) * (lon2 - lon1) * EARTH_CIRCUMFERENCE / 360.0;
return sqrt(xDist^2 + yDist^2);
}
如果你们之间的距离只有几公里,那么这对整个欧洲来说应该可以工作......类似的事情。
“奇怪的定义”方式
你可以说的另一件事是,“距离”是两点之间的直线长度,即使它穿过地球。然后这将变成计算一个点的 3D 坐标,然后是它们的欧几里德距离
double distance_straight_line(double lat1, double lon1, double lat2, double lon2){
double x1 = cos(lat1) * cos(lon1) * EARTH_RADIUS;
double y1 = sin(lat1) * cos(lon1) * EARTH_RADIUS;
double z1 = sin(lon1) * EARTH_RADIUS;
double x2 = cos(lat2) * cos(lon2) * EARTH_RADIUS;
double y2 = sin(lat2) * cos(lon2) * EARTH_RADIUS;
double z2 = sin(lon2) * EARTH_RADIUS;
return sqrt((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2);
}
对于彼此靠近的点,这再次将按预期工作,这次它们可以在世界任何地方。如果你给它点相距很远,输出会是正确的,但毫无用处(除非你非常擅长挖掘)。
希望对你有帮助。