你会推荐哪个Python GPS库?

8
我正在寻找一个免费的Python库,可以从GPS坐标计算你的方向和速度,也可以计算你是否在某些边界内等类似问题。
您知道哪些库可以胜任这个任务并且效果良好吗?
我们使用Linux机器上的Python,并从gpsd获取数据。所以我希望不需要专门用于与设备通信的特殊库。我需要的是Python代码,可以对数据进行一些基本的计算,例如比较最后的位置并计算速度和方向。
6个回答

9
显然,自带gpsd的python模块对我们来说是最好的模块。
与gpsd一起提供的gps模块具有一些非常有用的功能。第一个是从gpsd获取数据并将这些数据转换为可用的数据结构。 然后,该模块可以让你访问你的速度和相对于北方的当前航向。 还包括一个函数来计算考虑地球球形特性的两个坐标之间的距离。
我们特殊情况所缺少的功能是:
- 计算两个点之间的航向。意思是,我在点a面向北方,在我要导航到的点上需要转多少度。 - 利用第一个函数的数据和我们的当前航向来计算需要转多少度才能面向所需点(这不是什么大问题,因为它主要只是一个减法)。
使用此库的最大问题是它大多数是gpsd的封装器,因此如果您在不同于您的GPS代码应在其中运行的操作系统(如Windows或macOS)上进行编程,则无法运行代码或安装模块。

1
关于Python中GPS的更多算法,请查看此页面:http://www.deanandara.com/Argonaut/Sensors/Gps/GettingData.html - Janusz

5
我不确定我理解您的确切要求,但是根据您的设备等因素,似乎有许多可能的候选者,例如: 如果您的意思是已经获得了GPS单元输出并且只需要解析它等操作,我怀疑上述一个或多个示例(不幸的是我没有尝试过)将包含用于该任务的良好隔离的模块,具体取决于许可条件,您可以重新利用;如果这就是您所做的事情,这个SO问题也可能会有帮助。

我在http://gagravarr.org/code/geo_helper.py上找到了geo_helper脚本,它似乎是我正在寻找的一点。我会试一试。 - Janusz
2
不错的脚本,但似乎没有速度。根据http://www.perrygeo.net/wordpress/?p=13,gpsd附带了gps.py,它似乎可以完成您需要的大部分工作(不包括检查是否在边界内,但根据边界格式,这可以单独计算)。 - Alex Martelli

3
你从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(','),就可以得到一个包含所有元素的数组,然后进行解析。要了解更多关于这些句子的内容(我认为还有其他关于速度和方向的句子),请点击这里
例如,要获取两点之间的大致距离,可以使用Haversine Formula
distance=R*2*asin(sqrt((sin((lat1-lat2)/2))**2
               +cos(lat1)*cos(lat2)*(sin((long1-long2)/2))**2))

其中R是地球半径的单位,您可以选择以任何单位得到结果(例如R=6372公里)。这个实际的代码行来自我拥有的LabView程序,但语法与Python非常相似(可能要检查division运算符,您可能想要执行“from future import division”)。

此外,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;

当sign为1时,表示北方和东方,当sign为-1时,表示南方和东方。再次提醒,要注意除法。

检查边界应该是最容易的部分。如果你已经将位置转换为弧度或角度,只需检查纬度是否在两个纬度边界之间,对经度也是同样的处理。

将所有内容包装在一个外壳中,你就拥有了GPS库 :)


3

《Python数据可视化入门》一书中提供了一个例子,可以解析GPS数据并推断出速度和位置。该书的源代码可在网上获取,网址为http://www.apress.com/


1
大多数好的GPS设备(我们使用Oncore M12M)实际上会输出您的速度和航向。我建议首先检查您的GPS接收器文档,看看是否已经发送了此信息,或者是否可以启用这样的消息。根据我的经验,这些数据通常是接收器提供的标准遥测数据之一。
如果这不起作用,我认为您最好使用WGS-84(GPS坐标系统)的详细信息来获取实际的(x,y,z)坐标,然后将其与下一个坐标相减以找到您的航向,并在时间间隔内计算差异的大小以找到您的速度。这里有一些细节:http://topex.ucsd.edu/geodynamics/14gravity1_2.pdf 如果您真的想要一个完成所有这些操作的软件包,我认为pyEphem非常好,尽管我认为编写自己的代码可能会节省一些搜索时间并获得一些良好的知识。
(如果没有帮助,对不起,我是第一次发布帖子,仍在学习如何使用Stack Overflow)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接