2011-06-12 41 views
3

我正準備從另一點的經度計算一個點的經度。它們具有相同的緯度,它們之間的距離是已知的。我嘗試使用公式的sperical law of cosines。餘弦公式的精確定律

# 'lat' short for 'latitude', 'lng' short for 'longitude'. 
# EARTH_RADIUS = 6371000.0, unit is meter. 
# 
distance = Math.acos(Math.sin(lat1)*Math.sin(lat2) + 
      Math.cos(lat1)*Math.cos(lat2) * 
      Math.cos(lng2-lng1)) * EARTH_RADIUS 

如果兩個點的緯度是相等的(LAT1 == LAT2)中,i可以從lng1與距離計算lng2。所以我從餘弦定理sperical法律公式

# lat1 == lat2 == lat 
# 'distance' and 'lng' are known 
lng2 = Math.acos((Math.cos(distance/EARTH_RADIUS) - Math.sin(lat)*Math.sin(lat))/(Math.cos(lat)*Math.cos(lat))) + lng 

原因公式這個公式工作得非常好,除了一些情況。

喜歡

lat_degrees = -89.8345981836319 
lng_degrees = 96.42309331893921 
lat = lat1 = lat2 = (lat_degrees * Math::PI)/180 # -1.567909520510494 
lng = (lng_degrees * Math::PI)/180 # 1.682900453373236 
distance = 67544.06725769254 

這將衝擊片雷管錯誤

Math::DomainError: Numerical argument is out of domain - "acos" 

由於Math.acos(值)等於-2.5100189069914602的值,該值小於-1。我對此毫不知情。派生形式是否錯誤?

+0

什麼編程語言,這是? – 2011-06-12 17:56:44

+0

如果您可以閱讀一點JavaScript,請查看https://groups.google.com/forum/#!topic/google-maps-api/PMxcDEnwNak – 2011-06-12 18:02:55

+1

@WTP編程語言是ruby。 – 2011-06-12 18:05:46

回答

4

你的配方沒有任何問題。我沒有做計算,但我認爲重點是你靠近南極(非常接近),並且基本上沒有兩個分離如此大距離的點。

0

只需添加收到了比較:

if lat1 == lat2 and lng1 == lng2 
    return 0 
end