使用gpsd或cgps返回纬度和经度,然后退出



我想要一种非常简单的方法,从unix命令行的usb加密狗中查询我的gps位置。

现在,我知道我已经有了一个正常工作的软件和硬件系统,cgps命令成功地向我展示了我的位置就是明证。我现在希望能够从命令行请求我的gps位置(lat,以小数表示的长)。我的usb串行的路径是/dev/ttyUSB0,我使用的是一个全局卫星加密狗,它输出通用的NMEA语句

我该如何做到这一点?

感谢

telnet 127.0.0.1 2947

?WATCH={"enable":true}

?POLL;

给了你答案,但你仍然需要把小麦和谷壳分开。它还假设全球定位系统不是从冷启动的。

可以调用一个简短的脚本,例如。;

#!/bin/bash
exec 2>/dev/null
# get positions
gpstmp=/tmp/gps.data
gpspipe -w -n 40 >$gpstmp"1"&
ppid=$!
sleep 10
kill -9 $ppid
cat $gpstmp"1"|grep -om1 "[-]?[[:digit:]]{1,3}.[[:digit:]]{9}" >$gpstmp
size=$(stat -c%s $gpstmp)
if [ $size -gt 10 ]; then
   cat $gpstmp|sed -n -e 1p >/tmp/gps.lat
   cat $gpstmp|sed -n -e 2p >/tmp/gps.lon
fi
rm $gpstmp $gpstmp"1"  

这将导致输出40个句子,然后grep lat/lon到临时文件,然后进行清理。

或者,从GPS3-github存储库中,将alpha gps3.py放在与以下Python2.7-3.4脚本相同的目录中,然后执行。

from time import sleep
import gps3
the_connection = gps3.GPSDSocket()
the_fix = gps3.DataStream()
try:
    for new_data in the_connection:
        if new_data:
            the_fix.refresh(new_data)
        if not isinstance(the_fix.TPV['lat'], str):  # check for valid data
            speed = the_fix.TPV['speed']
            latitude = the_fix.TPV['lat']
            longitude = the_fix.TPV['lon']
            altitude = the_fix.TPV['alt']
            print('Latitude:', latitude, 'Longitude:', longitude)
            sleep(1)
except KeyboardInterrupt:
    the_connection.close()
    print("nTerminated by usernGood Bye.n")

如果您希望它在一次迭代后也关闭import sys,然后用sys.exit() 替换sleep(1)

更简单的解决方案:

$ gpspipe -w -n 10 |   grep -m 1 lon
{"class":"TPV","device":"tcp://localhost:4352","mode":2,"lat":11.1111110000,"lon":22.222222222}

您可以使用我的脚本:gps.sh return"x、 y";

#!/bin/bash
x=$(gpspipe -w -n 10 |grep lon|tail -n1|cut -d":" -f9|cut -d"," -f1)
y=$(gpspipe -w -n 10 |grep lon|tail -n1|cut -d":" -f10|cut -d"," -f1)
echo "$x,$y" 

sh gps.sh43.xx4092000,6.xx1269167

将不同答案的一些部分与更多的jq工作放在一起,我喜欢这个版本:

$ gpspipe -w -n 10 | grep -m 1 TPV | jq -r '[.lat, .lon] | @csv'
40.xxxxxx054,-79.yyyyyy367    

说明:

(1) 在调用gpspipe之后使用grep -m 1,正如@eadmaster的答案所使用的那样,因为一旦找到第一个匹配项,grep就会退出。这使您的结果更快,而不必等待10行(或使用两次gpspipe调用)。

(2) 使用jq同时提取两个字段;@csv格式化程序可读性更强。注意jq -r(原始输出)的使用,这样输出就不会放在引号中。否则输出将是"0";40.xxxx,-79.xxxx"-这对于某些应用可能是好的或更好的。

(3) 为清楚起见,按名称搜索TPV字段。这就是";时间、位置、速度";记录,这是我们想要提取当前lat&lon。只是在搜索";lat";或";lon";有可能被一些GPSE可能提供的GST对象混淆,在该对象中,"lat"one_answers"lon"是位置误差的标准偏差,而不是位置本身。

改进eadmaster的答案,这里有一个更优雅的解决方案:

gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1

说明:

  1. gpsd询问数据的10倍
  2. 使用jq分析接收到的JSON
  3. 我们只想要数值,所以使用grep进行筛选
  4. 我们想要最后一个收到的值,所以使用tail

示例:

$ gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1
28.853181286

相关内容

最新更新