找了一圈,没有找到现成的库,倒是发现一个解析Nmea的库 NmeaParser,就根据c算法源码转了一下,凑合着用了,记录下。
1 第三方依赖
[dependencies]
serial = "0.4"
nmea-parser = "0.10"
anyhow = "1.0"
thiserror = "1.0"
tracing-subscriber = { version = "0.3", features = ["fmt", "time", "chrono"] }
tracing-appender = "0.2"
log = "0.4"
2 实现源码
//! GPS module
use crate::GwError;
use nmea_parser::{NmeaParser, ParsedMessage};
use serial::prelude::*;
use std::{io::Read, time::Duration};
const SERIAL_PORT: &str = "/dev/ttyTHS2";
const PI: f64 = 3.14159265358979323846264338327950288_f64;
const A: f64 = 6378245.0;
const EE: f64 = 0.00669342162296594323;
fn transform_lat(x: f64, y: f64) -> f64 {
let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * (x.abs()