【发布时间】:2010-10-31 12:31:23
【问题描述】:
我正在寻找一个免费的 python 库,它可以根据 GPS 坐标计算你的方向和速度,也许可以计算你是否在某些边界或类似的地方。
是否有您知道并且对您很有效的库?
我们在 linux 机器上使用 python 并从 gpsd 获取数据。所以我希望不需要一个只与设备对话的特殊库。我正在寻找的是 python 代码对数据进行一些基本计算。比如比较最后的位置,计算速度和方向。
【问题讨论】:
我正在寻找一个免费的 python 库,它可以根据 GPS 坐标计算你的方向和速度,也许可以计算你是否在某些边界或类似的地方。
是否有您知道并且对您很有效的库?
我们在 linux 机器上使用 python 并从 gpsd 获取数据。所以我希望不需要一个只与设备对话的特殊库。我正在寻找的是 python 代码对数据进行一些基本计算。比如比较最后的位置,计算速度和方向。
【问题讨论】:
显然 gpsd 附带的 python 模块是我们最好的模块。
gpsd 自带的gps 模块有一些非常有用的功能。第一个是从 gpsd 获取数据并将这些数据转换为可用的数据结构。 然后,模块可以让您访问您的速度,以及您当前相对于北方的航向。 还包括一个函数,用于计算地球上两个坐标之间的距离,同时考虑到地球的球形特性。
我们的特殊情况缺少的函数是:
计算点之间的航向。表示我在一个面向北方的点,我必须转向哪个角度才能面向我想要导航到的点。
利用第一个函数的数据和我们当前的航向来计算我们必须做的转向角度,以面对一个期望的点(没什么大不了的,因为它大多只是一个减法)
使用这个库的最大问题是它主要是 gpsd 的包装器,所以如果你在不同的操作系统上编程,那么你的 gpscode 应该像 Windows 或 MacOS 一样工作,你无法运行代码或安装模块。
【讨论】:
我不确定我是否了解您的确切要求,但是,根据您的设备 &c,似乎有很多可能的候选人,例如:
如果您的意思是您已经获得了 GPS 的单位输出并且只需要解析它 &c,我怀疑上述一个或多个示例(不幸的是我没有尝试过)将包含完全隔离的该任务的模块,根据许可条件,您可以重新调整用途;如果您正在这样做,this SO question 也可能会有所帮助。
【讨论】:
“Beginning Python Visualization”一书就包含了这样一个示例——解析 GPS 数据并从中推断速度和位置。其源代码可在线获取http://www.apress.com/
【讨论】:
您从 GPS 设备接收到的 GPS 语句很容易解码,这看起来是一个有趣的项目。我不确定你从 gspd 得到什么,但如果是这些句子,我实际上不得不在几周前为学校做这样的事情(但在 LabView 中):
$GPGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx
hhmmss.ss = UTC of position
llll.ll = latitude of position
a = N or S
yyyyy.yy = Longitude of position
a = E or W
x = GPS Quality indicator (0=no fix, 1=GPS fix, 2=Dif. GPS fix)
xx = number of satellites in use
x.x = horizontal dilution of precision
x.x = Antenna altitude above mean-sea-level
M = units of antenna altitude, meters
x.x = Geoidal separation
M = units of geoidal separation, meters
x.x = Age of Differential GPS data (seconds)
xxxx = Differential reference station ID
所以你可以做一个 gpsstring.split(',') 并且你会得到一个所有元素的数组,然后你可以解析。要查看有关这些句子的更多信息(我认为还有其他关于速度和方向的句子),请单击here。
例如,要获得两点之间的大致距离,您可以使用Haversine Formula:
distance=R*2*asin(sqrt((sin((lat1-lat2)/2))**2
+cos(lat1)*cos(lat2)*(sin((long1-long2)/2))**2))
其中 R 是地球的半径,采用您想要获得结果的测量单位(例如 R=6372km)。那条实际的线取自我周围的 LabView 程序,但语法与 Python 的非常相似(也许检查division 运算符,您可能想做“从 future 导入除法”。
此外,lat1、lat2、long1 和 long2 必须以弧度表示。你得到它们的格式很奇怪(hhmm.ff,其中 ff 是分钟的分数,所以它们从 0 到 99 而不是 0 到 59(以秒计))。
我使用的代码是:
h=floor(x/100);
m=floor(x-(h*100));
s=(x-floor(x))*60;
deg=sgn*(h+(m/60)+(s/3600));
rad=deg*pi/180;
符号为 1 表示北和东,-1 表示南和东。再次注意分裂。
检查边界是我认为最简单的部分。如果你已经得到了弧度或度数的位置,你可以检查纬度是否在两个纬度边界之间,对经度做同样的事情。
为所有内容编写一个包装器,您就拥有了 GPS 库:)
【讨论】:
大多数优秀的 GPS 装置(我们使用 Oncore M12M)实际上会为您提供速度和航向作为输出。我将首先检查您的 GPS 接收器的文档,以查看是否已发送此信息,或者是否可以启用此类消息。根据我的经验,这些数据通常是接收器提供给您的标准遥测数据的一部分。
如果这不起作用,我认为您最好的选择是使用 WGS-84(GPS 坐标系)的详细信息来获取实际的 (x,y,z) 坐标,然后将其与下一个坐标进行区分找到您的航向并计算时间间隔内的差异幅度以找到您的速度。这里有一些细节: http://topex.ucsd.edu/geodynamics/14gravity1_2.pdf
如果你真的想要一个包来做这一切,我认为 pyEphem 非常好,虽然我认为你可以节省一点时间搜索并通过自己编写来获得一些好的知识。
(对不起,如果没有帮助,第一次发帖,还在学习如何堆栈溢出)
【讨论】:
我发现gpsd-py3 library 对于您描述的任务非常有用。
【讨论】: