使用 gpsd 或 cgps 到 return 纬度和经度然后退出
use gpsd or cgps to return latitude and longitude then quit
我想要一种非常简单的方法来从 unix 命令行从 USB 加密狗查询我的 gps 位置。
现在,我知道我有一个正常运行的软件和硬件系统,cgps
命令成功地向我展示了我的位置就是证明。我现在希望能够从命令行对我的 gps 位置(lat,long in decimals)发出简短请求。我的 usb 串口路径是 /dev/ttyUSB0
,我使用的是输出通用 NMEA 语句的 Global Sat dongle
我怎样才能做到这一点?
谢谢
telnet 127.0.0.1 2947
?WATCH={"enable":true}
?POLL;
给了你答案,但你还是要分清麦子。它还假定 gps 不是来自冷启动。
可以调用一个简短的脚本,例如;
#!/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 repository 开始,将 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 user\nGood 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}
改进 的答案是一个更优雅的解决方案:
gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1
解释:
- 询问来自gpsd10倍的数据
- 使用jq
解析接收到的JSON
- 我们只需要数值,所以使用 grep
进行过滤
- 我们想要最后收到的值,所以使用 tail
示例:
$ gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1
28.853181286
您可以使用我的脚本: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.sh
43.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
(原始输出)的使用,这样输出就不会放在引号中。否则输出将是“40.xxxx,-79.xxxx”——对于某些应用程序来说可能更好或更好。
(3) 搜索某些GPS可能提供的TPV field by name for clarity. This is the "time, position, velocity" record, which is the one we want for extracting the current lat & lon. Just searching for "lat" or "lon" risks getting confused by the GST object,在那个对象中,'lat'和'lon'是位置误差的标准差,不是位置本身。
我想要一种非常简单的方法来从 unix 命令行从 USB 加密狗查询我的 gps 位置。
现在,我知道我有一个正常运行的软件和硬件系统,cgps
命令成功地向我展示了我的位置就是证明。我现在希望能够从命令行对我的 gps 位置(lat,long in decimals)发出简短请求。我的 usb 串口路径是 /dev/ttyUSB0
,我使用的是输出通用 NMEA 语句的 Global Sat dongle
我怎样才能做到这一点?
谢谢
telnet 127.0.0.1 2947
?WATCH={"enable":true}
?POLL;
给了你答案,但你还是要分清麦子。它还假定 gps 不是来自冷启动。
可以调用一个简短的脚本,例如;
#!/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 repository 开始,将 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 user\nGood 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}
改进
gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1
解释:
- 询问来自gpsd10倍的数据
- 使用jq 解析接收到的JSON
- 我们只需要数值,所以使用 grep 进行过滤
- 我们想要最后收到的值,所以使用 tail
示例:
$ gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1
28.853181286
您可以使用我的脚本: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.sh
43.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
(原始输出)的使用,这样输出就不会放在引号中。否则输出将是“40.xxxx,-79.xxxx”——对于某些应用程序来说可能更好或更好。
(3) 搜索某些GPS可能提供的TPV field by name for clarity. This is the "time, position, velocity" record, which is the one we want for extracting the current lat & lon. Just searching for "lat" or "lon" risks getting confused by the GST object,在那个对象中,'lat'和'lon'是位置误差的标准差,不是位置本身。