我有一个问题,它在一些项目中吸引了我一段时间。
我基本上希望使用x,y点来捕捉多边形,这些点由我写的一些脚本绘制。 lat1,lon1是多边形的中心gps线,我正在寻找它周围的多边形。
这是我在python中的代码的一部分:
def getcords(lat1,lon1,dr,bearing): lat2=asin(sin(lat1)*cos(dr)+cos(lat1)*sin(dr)*cos(bearing)) lon2=lon1+atan2(sin(bearing)*sin(dr)*cos(lat1),cos(dr)-sin(lat1)*sin(lat2)) return [lat2,lon2]
我的输入是这样的: lat1,lon1 - 以十进制度给出。 -dr是通过将距离(以英里为单位)除以地球的-raiuds(= 3958.82)计算的角度 - 在0-360度之间。
但输入getcorsds1(42.189275,-76.85823,0.5 / 3958.82,30) 我得到[-1.3485899508698462,-76.8576637627568],但[42.2516666666667,-76.8097222222222]是正确答案。
至于角距离,我只需用英里的距离(= 3958.82)除以英里的距离来计算它。
人
答案 0 :(得分:4)
为什么不使用nice libraries?
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。
答案 1 :(得分:2)
sin和cos函数期望它们的参数在弧度中,而不是以度为单位。 asin和atan2函数以弧度生成结果,而不是以度为单位。通常,需要使用math.radians()
将输入角度(lat1,lon1和方位)从度数转换为弧度,并使用math.degrees()
将输出角度(lat2和lon2)从弧度转换为度数。
请注意,您的代码还有其他两个问题:
(1)不允许穿过经度为180度的子午线;你需要约束你的答案-180< = longitude_degrees< = +180。
(2)如果要广泛使用此功能,您可能希望删除冗余计算:sin(lat1),cos(dr),cos(lat1)和sin(dr)各自计算两次。
答案 2 :(得分:1)
较新版本的地理位置(+公里而不是里程数)
from geopy import Point
from geopy.distance import vincenty
distKm = 1
lat1 = 35.68096477080332
lon1 = 139.76720809936523
print 'center', lat1, lon1
print 'north', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 0).format_decimal()
print 'east', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 90).format_decimal()
print 'south', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 180).format_decimal()
print 'west', vincenty(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
答案 3 :(得分:-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