2009-06-19 30 views

回答

3

這是迄今爲止我所見過的最好的配方,http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html

a, b = major & minor semiaxes of the ellipsoid 
f = flattening (a−b)/a 
φ1, φ2 = geodetic latitude 
s = length of the geodesic 
α1, α2 = azimuths of the geodesic (initial/final bearing)  

tanU1 = (1−f).tanφ1 (U is ‘reduced latitude’)  
cosU1 = 1/√(1+tan²U1), sinU1 = tanU1.cosU1 (trig identities; §6)  
σ1 = atan2(tanU1, cosα1) (1) 
sinα = cosU1.sinα1 (2) 
cos²α = 1 − sin²α (trig identity; §6)  
u² = cos²α.(a²−b²)/b²  
A = 1+u²/16384.{4096+u².[−768+u².(320−175.u²)]} (3) 
B = u²/1024.{256+u².[−128+u².(74−47.u²)]} (4) 

σ = s/b.A (1st approximation), σ′ = 2π  
while abs(σ−σ′) > 10-12 { (i.e. 0.06mm) 
     cos2σm = cos(2.σ1 + σ) (5) 
    Δσ = B.sinσ.{cos2σm + B/4.[cosσ.(−1 + 2.cos²2σm) − B/6.cos2σm.(−3 + 4.sin²σ).(−3 + 4.cos²2σm)]} (6) 
    σ′ = σ 
    σ = s/b.A + Δσ (7) 
}   
φ2 = atan2(sinU1.cosσ + cosU1.sinσ.cosα1, (1−f).√[sin²α + (sinU1.sinσ − cosU1.cosσ.cosα1)²]) (8) 
λ = atan2(sinσ.sinα1, cosU1.cosσ − sinU1.sinσ.cosα1) (9) 
C = f/16.cos²α.[4+f.(4−3.cos²α)] (10) 
L = λ − (1−C).f.sinα.{σ+C.sinσ.[cos2σm + C.cosσ.(−1 + 2.cos²2σm)]} (difference in longitude) (11) 
α2 = atan(sinα, −sinU1.sinσ + cosU1.cosσ.cosα1) (reverse azimuth) (12) 
p2 = (φ2, λ1+L) 
2

這兩點有多遠?我喜歡使用高斯 - 克魯格投影,如果兩點在100海里左右的話,效果很好。它的優點是讓你在局部空間中使用正則三角函數,然後將其轉換回大地座標。

如果它們進一步分開,我會回到大圓圈,但圓的半徑作爲沿着所需軸承給定點的地球曲率半徑,使用WGS-84橢圓體計算。

+0

你確定你的意思100nm的?難道不是100公里嗎? – 2009-06-20 21:32:51

相關問題