判断GPS航点是否已经过
想象一下,有几个跑步的人在参加马拉松比赛。这些运动员都带着GPS设备。赛道上没有传感器,我需要知道每个运动员什么时候经过预设的GPS坐标点。不过,由于赛道可能很宽,不同的运动员可能会在稍微不同的经纬度位置经过这个点。
那么,判断一个运动员是否经过了这个坐标点的最佳方法是什么呢?
我在使用Python,并且愿意使用外部库。我处理的是已经处理过的GPS数据,所以我只有每个时间点的经纬度(还有一些其他信息,比如速度和行驶的距离)。
2 个回答
1
你可以试试这个方法:
“路标”是指两条线段相交的地方(图中的黑线)。在这个路标上,分别从两条相交的线段画一条垂直的线(图中红色和蓝色的线就是通过路标的)。当跑步者进入图中红色标记的区域时,就认为他靠近了这个路标(假设跑步者是从右边来的)。过了一段时间,跑步者可能会进入图中蓝色标记的区域——一旦发生这种情况,就说明跑步者已经越过了这个路标。
如果跑步者从来没有进入蓝色标记的区域,那就说明他偏离了轨道,路标就没有被越过。
1
在我看来,有几种方法可以解决你的问题。 我想到的第一种方法是:
from shapely.geometry import LineString
line1 = LineString([(i, i) for i in range(5)])
line2 = zip(range(5)[::-1], range(5))
if line1.crosses(line2):
print 'yeah!'
加一个循环,遍历每个航点线
其他可能的选项有:
- 用简单的数学计算,找出两条直线的交点——这其实是高中水平的知识
- 把你的数据导入到postgres数据库中,使用postgis功能,比如ST_Crosses(如果postgres对你来说太复杂,可以试试SpatialLite-sqlite)
- 使用pyshp、shapely、gdal/geos、geodjango、geoalchemy等工具
- 把上面的一些方法结合起来,写一个更复杂的算法,比如在某条线或点周围创建一个缓冲区,然后检查GPS位置是否在这个缓冲区内,同时查看后续的位置是否也在缓冲区外?