将k m转换为gps坐标

时间:2010-07-08 09:32:02

标签: gps

我必须看看是否有一些GPS坐标在我创建的圆圈中。当我说我正在创建那个圆圈时我指的是:我有lat1,long1,  我的实际位置,我想测试这个位置周围是否有任何数据但是  不远1km。我试图使用圆不等式:(x2-a2)2+(y2-b2)2 <R2其中a = lat1,b = long1和R = radius。我知道R = 1km但是如何将1km转换成可以与GPS坐标进行比较的数据呢?而x,y是来自集合的每个值,以确定它们是否合适。

2 个答案:

答案 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);
}

同样,对于彼此接近的点,这将按预期工作,这次它们可以在世界的任何地方。如果你给它的点数相差很远,那么输出是正确的,但是没用(除非你非常擅长挖掘)。

希望它有所帮助。