当我在u-center中使用GPS模块时,得到的纬度为11.27000000,经度为100.34000000。但当我在python脚本中读取nmea消息并对其进行格式化时,得到的纬度为100.00000000,经度为100.0000000。例如,但是大约1.27...度纬度和0.34...度经度的差异是准确的。
下面是我的代码:
import serial
try:
gps = serial.Serial('com5', baudrate=9600)
while True:
ser_bytes = gps.readline()
decoded_bytes = ser_bytes.decode("utf-8")
data = decoded_bytes.split(",")
if data[0] == '$GNRMC':
lat_nmea = (data[3],data[4])
lat_degrees = float(lat_nmea[0][0:2])
if lat_nmea[1 ] == 'S':
lat_degrees = -lat_degrees
lat_minutes = float(lat_nmea[0][2:])
lat = lat_degrees + (lat_minutes/60)
lon_nmea = (data[5],data[6])
lon_degrees = float(lon_nmea[0][0:3])
if lon_nmea[1] == 'W':
lon_degrees = -lon_degrees
lon_minutes = float(lon_nmea[0][3:])
lon = lon_degrees + (lon_minutes/60)
print("%0.8f" %lat, "%0.8f" %lon)
except KeyboardInterrupt:
print("Keyboard Interrupt")
输出:
10.0000000百万美元
当我只是用途:
print(data)
在第11行,我以GNRMC NMEA消息的形式得到了正确的坐标,我在第10行挑选了该消息:
[“$GNRMC”、..."、...“、”1127.00000“、”N“、”10034.00000“、”W“、...]
但是它们的格式并不是人们通常所期望的(例如11.2712345,100.3412345)。因此,我使用上面的代码来改变它们的外观。我看不到我所做的会导致纬度和经度改变的事情。
任何帮助都将不胜感激!谢谢:)
2条答案
按热度按时间zbwhf8kr1#
您正在尝试读取RMC消息。它们的格式在〉〉此处〈〈中描述
纬度格式:日分.秒
经度格式:日/分/秒/秒
日/年-度
mm-分钟
.-小数点
ffff-分钟的小数部分
这意味着您需要提取前两个(纬度)或三(经度)数字,并将其视为度,将剩余部分视为分(两位数,点,再多几位数)。我真的不能帮你的代码,我不知道python在所有,但您应该知道,在不同的接收器上,表示分数分钟的位数可能不同。不要硬编码要读取的数字位数(除了2/3位的度数),但要一直阅读到碰到逗号为止。
wqnecbli2#
看起来您只是应用了错误的基本方向。例如,Grytviken的坐标为:54°16′53.4″S 36°30′28.8″W,如果我通过了:
返回
-53.7185 -35.4920
,这是不正确的,因为它没有将S
和W
应用于分钟字段。我建议编写并测试一个小函数来同时解析“ddmm.mm”和“sign”字段,类似于:
这使得更容易确保它得到
-54.2815 -36.5080
的正确值。