3

我想从另一点的经度计算一个点的经度。它们具有相同的纬度,并且它们之间的距离是已知的。我尝试使用余弦公式的球面定律。

# '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),我可以从 lng1 计算 lng2 和距离。所以我从余弦公式的空间定律推理公式

# 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(value) 中的值等于 -2.5100189069914602,小于 -1。我对此一无所知。派生的形式错了吗?

4

2 回答 2

4

你的公式没有错。我没有进行计算,但我想重点是您(非常!!)靠近南极,基本上没有两个点相距如此大的距离。

于 2011-06-12T18:10:20.297 回答
0

只需在它之前添加一个比较:

if lat1 == lat2 and lng1 == lng2
  return 0
end
于 2015-12-10T11:49:23.990 回答