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

2024-04-29 17:03:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有一个问题,使我在某个项目上退缩了一段时间。

我基本上是想用我写的一些脚本绘制的x,y点来捕捉多边形。 lat1,lon1是多边形的中心gps线,im正在查找其周围的多边形。

下面是我用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.25166666666667,-76.809722222222]是正确的。

至于角距离,我简单地用地球的raiuds(=3958.82)除以以英里为单位的距离来计算。

有人吗?


Tags: 项目脚本距离地球单位sincos多边形
3条回答

为什么不使用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,轴承=42.189275,-76.85823,0.5,30返回42.1955489,-76.853359。

更新版本的geopy(公里而不是英里)

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

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

请注意,代码还有两个问题:

(1)它不允许穿越经度的180度子午线;您需要限制您的答案,使-180<;=经度lt;=+180。

(2)如果要广泛使用此函数,可能需要删除冗余计算:sin(lat1)、cos(dr)、cos(lat1)和sin(dr)各计算两次。

相关问题 更多 >