python-3.x 在不同环境下获取不同的GPS坐标

8yparm6h  于 2022-11-19  发布在  Python
关注(0)|答案(2)|浏览(162)

当我在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)。因此,我使用上面的代码来改变它们的外观。我看不到我所做的会导致纬度和经度改变的事情。
任何帮助都将不胜感激!谢谢:)

zbwhf8kr

zbwhf8kr1#

您正在尝试读取RMC消息。它们的格式在〉〉此处〈〈中描述
纬度格式:日分.秒
经度格式:日/分/秒/秒

日/年-度
mm-分钟
.-小数点
ffff-分钟的小数部分

这意味着您需要提取前两个(纬度)或三(经度)数字,并将其视为度,将剩余部分视为分(两位数,点,再多几位数)。我真的不能帮你的代码,我不知道python在所有,但您应该知道,在不同的接收器上,表示分数分钟的位数可能不同。不要硬编码要读取的数字位数(除了2/3位的度数),但要一直阅读到碰到逗号为止。

wqnecbli

wqnecbli2#

看起来您只是应用了错误的基本方向。例如,Grytviken的坐标为:54°16′53.4″S 36°30′28.8″W,如果我通过了:

data = ['$GNRMC', '...', '...', "5416.89", "S", "03630.48", "W", ...]

返回-53.7185 -35.4920,这是不正确的,因为它没有将SW应用于分钟字段。
我建议编写并测试一个小函数来同时解析“ddmm.mm”和“sign”字段,类似于:

SIGN_NSEW = { 'N': 1, 'S': -1, 'E': 1, 'W': -1 }

def rmc_ddmm_to_degrees(val, sign):
    dd, mm = divmod(float(val), 100)
    return (dd + mm / 60) * SIGN_NSEW[sign]

latitude  = rmc_ddmm_to_degrees(data[3], data[4])
longitude = rmc_ddmm_to_degrees(data[5], data[6])

print(f"{latitude:.4f} {longitude:.4f}")

这使得更容易确保它得到-54.2815 -36.5080的正确值。

相关问题