首页 > 解决方案 > 如何以给定的速度在 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

但是有些点看起来很离谱,而且如果有些点非常接近,那么我也离题了。

标签: pythongps

解决方案


我建议为此使用外部库,如果您关心在远距离上准确地执行此操作,则很难正确计算。我以前用过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)

这在短距离上给出了一条大部分直线,但在较长距离上曲线会很明显


推荐阅读