GPS坐标以度为单位计算距离

时间:2009-07-23 07:02:42

标签: iphone math gps coordinates measurement

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

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

问题是我对度数的值感到困惑。我希望得到米的结果。转换需要什么?计算这个的最终公式怎么样?

7 个答案:

答案 0 :(得分:10)

使用 - (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];

答案 1 :(得分:6)

你的问题并不重要:在一个椭圆体上,甚至可能有多条线垂直于AB到C.

如果距离很小,你可能会使用欧几里德近似

Δx = R·cosα·Δλ
Δy = r·Δφ

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

纬度φ,经度λ,半长轴a和半轴b;在球面近似a = bφr的公式中的R·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与上图中的A不同。

BCF成为欧几里德空间中与球体表面上的点对应的向量。垂直F = 1/|B-A|² · (<B-A,C-A>·B - <B-A,C-B>·A) 的脚由

给出
<,>

其中|·|是标量积,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β))

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

{{1}}

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您应该调查Universal Transverse Mercator(UTM)坐标系和东向和北向术语。基本思想是将GPS坐标(在WGS84坐标系中)转换为距离某个点的距离 - 如果UTM北向是距离赤道的距离,则东向距离是一个选定的子午线。使用此转换,您将能够非常接近两点之间的实际距离。

答案 4 :(得分:1)

正如克里斯托夫所建议的那样,问题的难点可能更好地解决了三维空间。

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

这是解决问题的Python code。它不会调用任何库,因此可以快速移植到任何其他语言。这是它使用的公式的derivation