python - 如何以给定的速度在 2 个 gps 坐标之间迭代 gps 点
问题描述
给定 2 个开始和停止 gps 坐标(即点#1:39.5210981,-76.6194347,点#2:39.6206699,-76.554627),我使用 OpenStreetMap 获得了这两个开始和停止 gps 坐标之间最短路线的所有 gps 坐标点.
问题是如何从给定路线以每 1 秒间隔以速度(即 30 mph 或 45 km/h)迭代一组新的 gps 坐标?
我试图使用另一个stackoverflow用户给出的代码来计算两点之间的距离:
def midpoint(lat1, long1, lat2, long2, per):
return lat1 + (lat2 - lat1) * per, long1 + (long2 - long1) * per
但是有些点看起来很离谱,而且如果有些点非常接近,那么我也离题了。
解决方案
我建议为此使用外部库,如果您关心在远距离上准确地执行此操作,则很难正确计算。我以前用过pyproj
,它公开了一个Geod.inv
方法,上面写着:
返回前后方位角,加上初始点(由 lons1、lats1 指定)和终点点(由 lons2、lats2 指定)之间的距离。
“方位角”是您到达该点的角度,距离以米为单位。
它还公开Geod.fwd
了返回坐标:
给定初始点的经度 (lons) 和纬度 (lats),加上前向方位角 (az) 和距离 (dist),返回终点的经度、纬度和后向方位角。
我认为你想如何将这些放在一起是这样的:
import pyproj
# WGS-84 is the coordinate system used by GPS
wgs84_geod = pyproj.CRS('WGS 84').get_geod()
# I think I'm pulling these apart in the right order, but you'd want to check
src_lat, src_lon = 39.5210981,-76.6194347
dst_lat, dst_lon = 39.6206699,-76.554627
# how many meters between each point
delta = 45 * 1000 / 3600
# keep track of where we currently are
lat, lon = src_lat, src_lon
result = []
while True:
# figure out which direction to go and how far away we are
az, _, dist = wgs84_geod.inv(lon, lat, dst_lon, dst_lat)
# are we done yet?
if dist < delta:
break
result.append((lon, lat))
# move at our speed towards our target
lon, lat, _ = wgs84_geod.fwd(lon, lat, az, delta)
这在短距离上给出了一条大部分直线,但在较长距离上曲线会很明显
推荐阅读
- c# - 使用两个应用时的 Azure AD 身份验证重定向循环(cookie 错误)
- apache-kafka - Kafka.conn FetchResponse_v2 使用 python 消费者获取“message_set=b''”
- sql - 为什么将excel中的数据插入SQL表后出现1900-01-01 00:00:00.000?
- java - 如何将包含 List 的 Java Map 转换为 Scala map
- android - 当 recycler veiw 项目展开时(显示子视图),列表应滚动到展开项目的底部
- powershell - 如何使用 Powershell 将 .reg 文件导入计算机上的每个用户配置文件?
- networking - 使用 EKS 与 IP 白名单服务通信
- python - 如何在 keras/tensorflow 中定义秩大于 4 的张量的 2D 卷积
- android - 将 h5 文件转换为 tflite 文件的 input_arrays 和 output_arrays 是什么?
- c# - 为什么不能将 Func 强制转换为 Expression,而 lambda 可以