在iPhone上,我以十进制度数获取用户的位置,例如:北纬39.470920和经度= -0.373192;那是A点。
我需要创建一条带有另一个GPS坐标的线,也是十进制度,B点。然后,计算从A到B的线与另一个点C之间的距离(垂直)。
问题是我对度数的值感到困惑。我希望得到米的结果。转换需要什么?计算这个的最终公式怎么样?
答案 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
不同。
让B
,C
,F
成为欧几里德空间中与球体表面上的点对应的向量。垂直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 distance和great-circle distance文章。他们提供您需要的公式。
答案 3 :(得分:1)
您应该调查Universal Transverse Mercator(UTM)坐标系和东向和北向术语。基本思想是将GPS坐标(在WGS84坐标系中)转换为距离某个点的距离 - 如果UTM北向是距离赤道的距离,则东向距离是一个选定的子午线。使用此转换,您将能够非常接近两点之间的实际距离。
答案 4 :(得分:1)
正如克里斯托夫所建议的那样,问题的难点可能更好地解决了三维空间。
我建议的解决方案(对不起,没有代码) - 它假定为球形地球:
答案 5 :(得分:0)
对于纬度,一度大约是1852米。
经度的转换取决于纬度。数学对我来说有点模糊,但我似乎记得它像COS(纬度* PI / 180)* 1852
答案 6 :(得分:0)
这是解决问题的Python code。它不会调用任何库,因此可以快速移植到任何其他语言。这是它使用的公式的derivation。