在 iPhone 上,我以十进制度数获取用户的位置,例如:纬度 39.470920 和经度 = -0.373192;这就是A点。
我需要用另一个 GPS 坐标创建一条线,也是十进制度,点 B。然后,计算从 A 到 B 的线与另一个点 C 之间的距离(垂直)。
问题是我对度数的值感到困惑。我想要以米为单位的结果。需要什么转换?计算这个的最终公式会是什么样子?
在 iPhone 上,我以十进制度数获取用户的位置,例如:纬度 39.470920 和经度 = -0.373192;这就是A点。
我需要用另一个 GPS 坐标创建一条线,也是十进制度,点 B。然后,计算从 A 到 B 的线与另一个点 C 之间的距离(垂直)。
问题是我对度数的值感到困惑。我想要以米为单位的结果。需要什么转换?计算这个的最终公式会是什么样子?
使用 - (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];
你的问题很重要:在一个椭球体上,甚至可能有不止一条垂直于 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α
是某种平均值。
球体上的度量 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β))
您应该研究通用横轴墨卡托 (UTM) 坐标系以及东向和北向术语。基本思想是将 GPS 坐标(在 WGS84 坐标系中)转换为与某个点的距离 - 如果 UTM 北距是距赤道的距离,东距是距选定子午线的距离。使用这种转换,您将能够很好地近似两点之间的实际距离。
对于纬度,1 度约为 1852 米。
经度的转换取决于纬度。数学对我来说有点模糊,但我似乎记得它类似于 COS(latitude * PI / 180) * 1852