【问题标题】:GPS coordinates in degrees to calculate distances以度为单位的 GPS 坐标以计算距离
【发布时间】:2010-11-13 07:03:51
【问题描述】:

在 iPhone 上,我以十进制度数获取用户的位置,例如:纬度 39.470920 和经度 = -0.373192;这就是A点。

我需要用另一个 GPS 坐标创建一条线,也以十进制度为单位,点 B。然后,计算从 A 到 B 的线与另一个点 C 之间的距离(垂直)。

问题是我对度数的值感到困惑。我想要以米为单位的结果。需要什么转换?计算这个的最终公式会是什么样子?

【问题讨论】:

    标签: iphone math gps coordinates measurement


    【解决方案1】:

    使用 - (CLLocationDistance)getDistanceFrom:(const CLLocation *)location

    firstLongitude = 30.0;
    firstLatitude = 30.0;
    
    secondLongitude = 40.0;
    secondLatitude = 40.0;
    
    CLLocation *firstLoc = [[CLLocation alloc]initWithLatitude:firstLatitude longitude: firstLongitude];
    CLLocation *secondLoc = [[CLLocation alloc]initWithLatitude:secondLatitude longitude: secondLongitude];
    
    double distanceInMeters = [firstLoc getDistanceFrom: secondLoc];
    

    【讨论】:

    • 投了赞成票...我错过了这是一个 iPhone 问题。使用 CoreLocation 调用绝对是可行的方法。
    • 不错的答案,但并没有解决问题:他仍然需要确定 A 和 B 之间的连接线上的点,他想要计算到 C 的距离,这是困难的部分
    • @Christoph:我打算发表类似的评论,并建议(就像你所做的那样)在 3 空间中解决问题(或至少部分问题)。
    【解决方案2】:

    你的问题很重要:在一个椭球体上,甚至可能有不止一条垂直于 AB 到 C 的线。

    如果距离很小,您可能会使用欧几里得近似值

    Δx = R·cosα·Δλ
    Δy = r·Δφ
    
    r = b²/√(b² + (a² - b²)·cos²φ)
    R·cosα = a²/√(a² + b²·tan²φ)
    

    纬度φ,经度λ,长半轴a和短半轴b;球面近似a = brR·cosα 的公式中的 φ 必须是某种平均值。

    metric on spheroid http://img263.imageshack.us/img263/3620/spheroid.gif

    一种可能会产生更好结果的方法是在 3 空间(而不是在球体表面)解决问题,并获得与连接线相关的弧长。

    为此,您需要知道如何将具有法线角度的地理坐标φ 转换为笛卡尔坐标

    z = b²·sinφ/√(a²·cos²φ + b²·sin²φ)
    r = a²·cosφ/√(a²·cos²φ + b²·sin²φ)
    x = r·cosλ
    y = r·sinλ
    

    从极角α的地心坐标到笛卡尔坐标

    z = a·b·sinα/√(a²·sin²α + b²·cos²α)
    r = a·b·cosα/√(a²·sin²α + b²·cos²α)
    x = r·cosλ
    y = r·sinλ
    

    请注意,这些公式中的r 与上图中的不同。

    ABC 成为与球体表面上的点相对应的欧几里得空间中的向量。垂直F 的脚为

    F = 1/|B-A|² · (<B-A,C-A>·B - <B-A,C-B>·A)
    

    其中&lt;,&gt; 是标量积,|·| 是范数。

    现在,我们必须确定球体表面上与F 对应的点F',这意味着我们必须计算

    λ' = atan2(y,x)
    α' = arctan(z/√(x² + y²))
    

    然后将它们转换回笛卡尔坐标。

    割线的长度由下式给出

    d = |F'- C|
    

    球面近似对应的弧长为

    s = R·β
    

    其中βF'C 之间的角度,即

    β = arccos(cosβ) = arccos(<F',C>/(|F'|·|C|))
    

    R 是由下式给出的平均半径

    R = ³√(a²·b)
    

    或使用余弦规则为小距离获得更好的价值

    R = d/√(2·(1 - cosβ))
    

    【讨论】:

    • 原来欧几里得近似是错误的 - r,子午线的曲率半径,不会在赤道平面结束;第二个算法应该没问题...
    【解决方案3】:

    查看维基百科上的geographical distancegreat-circle distance 文章。它们提供了您需要的公式。

    【讨论】:

      【解决方案4】:

      您应该研究通用横轴墨卡托 (UTM) 坐标系以及东向和北向术语。基本思想是将 GPS 坐标(在 WGS84 坐标系中)转换为与某个点的距离 - 在 UTM 的情况下,北距是距赤道的距离,而东距是距选定子午线的距离。使用这种转换,您将能够很好地近似两点之间的实际距离。

      【讨论】:

      • +1。如果原始发布者希望最终结果以米为精度,那么他们最好使用比球体更精确的投影坐标。
      【解决方案5】:

      正如 Christoph 所建议的,问题中较难的部分可能在 3 空间中得到更好的解决。

      我建议的解决方案(对不起,没有代码) - 它假设一个球形地球:

      • 将 A、B、C 表示为来自地球中心 E 的向量
      • 通过矢量cross product 找到与 EA(从 E 到 A 的矢量)和 EB(应该有两个)正交的矢量
      • 通过dot product确定两个正交向量与EC之间的最小夹角
      • 从 90 度减去
      • 如果我们旋转坐标系使 A 和 B 位于赤道上,则得到的角度就是 C 的“纬度”,可以很容易地将其转换为距离(参见richardtallent 的回答)

      【讨论】:

        【解决方案6】:

        对于纬度,1 度大约是 1852 米。

        经度的转换取决于纬度。数学对我来说有点模糊,但我似乎记得它类似于 COS(latitude * PI / 180) * 1852

        【讨论】:

        • 我认为你的意思是 1852 公里(即 1,852,000 米)
        • 这些都没有意义。纬度一分钟约为1852米(一海里)。 1° 纬度为~60 海里或~111 公里(~20000/180)。 1852 公里是 1000 海里,或 ~16⅔°。
        • 感谢您清理它,阿鲁曼。我只是知道原始值不可能是正确的,并认为这是单元的问题,但从未真正检查过哪个单元。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-30
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多