【问题标题】:transform k m into gps Coordinates将 k m 转换为 gps 坐标
【发布时间】:2010-07-08 09:32:02
【问题描述】:

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

【问题讨论】:

  • 我正在尝试使用圆不等式:(x2-a2)2+(y2-b2)2

标签: gps


【解决方案1】:

Lat/Lng 坐标不适用于 Phytagoras 公式,因为地球是一个球体,而不是平坦的......

看看这本手册:

http://www.movable-type.co.uk/scripts/latlong.html

你需要距离方程,看看你拥有的纬度/经度与圆心经度/经度之间的距离是否小于R。

【讨论】:

    【解决方案2】:

    事情没那么简单。您通常不能使用欧几里得距离。这就是我认为你可以做到的方式:

    正确的方法

    这样做的正确方法是计算大圆距离(表面上最短的步行距离),我从来没有真正理解过,但谷歌很容易(而且 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);
    }
    

    对于彼此靠近的点,这再次将按预期工作,这次它们可以在世界任何地方。如果你给它点相距很远,输出会是正确的,但毫无用处(除非你非常擅长挖掘)。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多