我必须看看是否有一些GPS坐标在我创建的圆圈中。当我说我正在创建那个圆圈时我指的是:我有lat1,long1,
我的实际位置,我想测试这个位置周围是否有任何数据但是
不远1km。我试图使用圆不等式:(x2-a2)2+(y2-b2)2 <R2
其中a = lat1,b = long1和R = radius。我知道R = 1km但是如何将1km转换成可以与GPS坐标进行比较的数据呢?而x,y是来自集合的每个值,以确定它们是否合适。
答案 0 :(得分:2)
Lat / Lng坐标不适用于Phytagoras公式,因为地球是一个球体,而不是平面...
看一下这本手册:
http://www.movable-type.co.uk/scripts/latlong.html
您需要距离公式,以查看您所拥有的纬度/经度与圆心的纬度/经度之间的距离是否小于R.
答案 1 :(得分:0)
这不是那么简单。您通常不能使用欧几里德距离。这就是我认为你可以做到的:
这样做的正确方法是计算大圆距离(表面上最短的步行距离),这是我从未真正理解的,但谷歌相当容易(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);
}
同样,对于彼此接近的点,这将按预期工作,这次它们可以在世界的任何地方。如果你给它的点数相差很远,那么输出是正确的,但是没用(除非你非常擅长挖掘)。
希望它有所帮助。