给定点,方位和距离计算gps坐标

时间:2010-12-25 17:15:17

标签: python gps coordinates bearing

我有一个问题,它在一些项目中吸引了我一段时间。

我基本上希望使用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)除以英里的距离来计算它。

4 个答案:

答案 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
相关问题