5

我有一个问题让我在某个项目中退缩了一段时间。

我基本上是在寻找使用我编写的一些脚本绘制的 x、y 点来捕获多边形。lat, lon 是多边形的中心 GPS 线,我正在寻找它周围的多边形。

这是我在 python 中的代码的一部分:

def getcords(lat, lon, dr, bearing):
    lat2=asin(sin(lat)*cos(dr)+cos(lat)*sin(dr)*cos(bearing))
    lon2=lon+atan2(sin(bearing)*sin(dr)*cos(lat),cos(dr)-sin(lat)*sin(lat2))
    return [lat2,lon2]

我的输入是这样的:

  • lat, lon - 以十进制度数给出。
  • dr - 是以英里为单位的距离除以地球的半径计算的角度(=3958.82)
  • 轴承 - 0-360 度之间。

但是对于输入:

getcorsds1(42.189275, -76.85823, 0.5/3958.82, 30)

我得到输出: [-1.3485899508698462, -76.8576637627568],但是[42.2516666666667, -76.8097222222222]是正确的答案。

至于角距离,我只需将距离(以英里为单位)除以地球半径(= 3958.82)即可计算得出。

有人吗?

4

4 回答 4

5

使用geopy v2.0.0(+ 公里而不是英里)

from geopy import Point                                                                                                                                                                       
from geopy.distance import geodesic                                                                                                                                                           
                                                                                                                                                                                              
distKm = 1                                                                                                                                                                                    
lat1 = 35.68096477080332                                                                                                                                                                      
lon1 = 139.76720809936523                                                                                                                                                                     
                                                                                                                                                                                              
print('center', lat1, lon1)                                                                                                                                                                   
print('north', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 0).format_decimal())                                                                                                
print('east', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 90).format_decimal())                                                                                                
print('south', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 180).format_decimal())                                                                                              
print('west', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 270).format_decimal()) 

结果是

center 35.6809647708 139.767208099
north 35.6899775841, 139.767208099
east 35.680964264, 139.778254714
south 35.6719519439, 139.767208099
west 35.680964264, 139.756161485
于 2016-11-17T01:43:35.747 回答
4

你为什么不使用漂亮的库

from geopy import Point
from geopy.distance import distance, VincentyDistance

# given: lat1, lon1, bearing, distMiles
lat2, lon2 = VincentyDistance(miles=distMiles).destination(Point(lat1, lon1), bearing)

对于 lat1、lon1、distMiles、bearing = 42.189275、-76.85823、0.5、30,它返回 42.1955489、-76.853359。

于 2010-12-25T18:41:58.023 回答
3

sin 和 cos 函数期望它们的参数是弧度,而不是度数。asin 和 atan2 函数以弧度而不是度数生成结果。通常,需要使用 将输入角度(lat1、lon1 和方位角)从度转换为弧度,math.radians()并使用 将输出角度(lat2 和 lon2)从弧度转换为度math.degrees()

请注意,您的代码还有另外两个问题:

(一)不允许穿越经度180度子午线;你需要限制你的答案,使得 -180 <= longitude_degrees <= +180。

(2) 如果你打算广泛使用这个函数,你可能想去掉多余的计算:sin(lat1)、cos(dr)、cos(lat1)和sin(dr)分别计算两次。

于 2010-12-25T18:45:00.383 回答
-2

eumiro 你的代码
结果是Too many values to unpack
如何解决这个问题

from geopy import Point
from geopy.distance import distance, VincentyDistance

# given: lat1, lon1, bearing, distMiles
lat2, lon2 = VincentyDistance(miles=9.32057).destination(Point(52.20444, 0.3605$
print lat2, lon2
于 2014-05-17T10:59:30.403 回答