你从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库 :)