本文主要是介绍C#代码实现解析WTGPS和BD数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下...
在现代的导航与定位应用中,准确解析 GPS 和北斗(BD)等卫星定位数据至关重要。今天,我们来探讨如何使用 C# 语言对 WTGPS+BD 数据进行解析。
一、代码结构概览
首先,我们有一个WitGpsParser类,这个类主要负责解析原始的 GPS 数据。它包含了一些关键的字段和方法:
using System; using System.Linq; public class WitGpsParser { // 经纬度标记 private readonly string gnzda = "GNZDA"; // 时间戳标记 private readonly string gngga = "GNGGA"; private readonly StringSplitOptions options = StringSplitOptions.RemoveEmptyEntries; // ... }
其中,gnzda和gngga分别用于标识不同类型的 GPS 数据语句,options则用于在分割字符串时去除空元素。
1. 核心解析方法
Parse方法是整个解析过程的入口:
public Location Parse(string raw) { var separator = new char[] { '\n' }; var raws = raw.Split(separator, options); var r1 = raws.Where(r => r.Contains(this.gngga)).FirstOrDefault(); var location = this.ToLocation(r1); var r2 = raws.Where(r => r.Contains(this.gnzda)).FirstOrDefault(); var date = this.ToDateAndTimestamp(r2); if (location != null) { location.Date = date.Item1; location.TimeStamp = (double)date.Item2; } return location; }
它首先将输入的原始数据按行分割,然后分别查找包含GNGGA和GNZDA的行。GNGGA语句通常包含位置信息,而GNZDA语句包含日期和时间信息。通过调用ToLocation和ToDateAndTimestamp方法,分别解析出位置和时间信息,并将它们组装到Location对象中返回。
2. 位置信息解析
ToLocation方法负责从GNGGA语句中提取并解析位置相关信息:
private Location ToLocation(string raw) { if (string.IsNullOrWhiteSpace(raw)) { return null; } var raws = raw.Split(new char[] { ',' }); // 验证数据完整 if (raws.Length < 6 || raws.Skip(1).Take(5).All(r => string.IsNullOrWhiteSpace(r))) { return null; } var latitude = this.ToLatitude(raws[2]); var longitude = this.ToLongitude(raws[4]); var flag = int.Parse($"0{raws[6]}"); var numSV = 0; if (raws.Length >= 8) { numSV = int.Parse($"0{raws[7]}"); } var altitude = 0.0; if (raws.Length >= 10) { altitude = double.Parse($"0{raws[9]}"); } return new Location { Altitude = altitude, Flag = flag, Latitude = latitude, Longitude = longitude, NumSV = numSV, }; }
在这个方法中,首先检查输入数据是否为空或不完整。然后,通过调用ToLatitude和ToLongitude方法,将字符串形式的经纬度转换为实际的数值。同时,提取定位标志(flag)、卫星数量(numSV)和海拔高度(altitude)等信息,最后构建并返回Location对象。
3. 经纬度转换方法
ToLatitude和ToLongitude方法用于将特定格式的经纬度字符串转换为实际的度数:
private double ToLongitude(string l) { if (string.IsNullOrWhiteSpace(l) || l.Length < 8) { return 0; } var l1 = double.Parse(l.Substring(0, 3)); var l2 = double.Parse(l.Substring(3, 5)); return l1 + l2 / 60; } private double ToLatitude(string l) { if (string.IsNullOrWhiteSpace(l) || l.Length < 9) { return 0; } var l1 = double.Parse(l.Substring(0, 2)); var l2 = double.Parse(l.Substring(2, 7)); return l1 + l2 / 60; }
例如,对于经度字符串,前三位表示度数,后面五位表示分,通过特定的计算将其转换为以度为单位的数值。
4. 日期和时间戳解析
ToDateAndTimestamp方法负责从GNZDA语句中解析出日期和时间戳:
private (string, decimal) ToDateAndTimestamp(string raw) { if (string.IsNullOrWhiteSpace(raw)) { return ("", 0); } var separator = new char[] { ',' }; var date = raw.Split(separator, options); if (date.Length < 2) { return ("", 0); } var utcDate = date[1]; if (utcDate == null || utcDate.Length != 9) { return ("", 0); } var hour = utcDate.Substring(0, 2); hour = (int.Parse(hour) + 8).ToString(); hour = this.RemoveZero(hour); var minute = uwww.chinasem.cntcDate.SuChina编程bstring(2, 2); minute = this.RemoveZero(minute); var second = utcDate.Substring(4, 2); second = this.RemoveZero(second); 编程var day = date[2]; day = this.RemoveZero(day); var month = date[3]; month = this.RemoveZero(month); python var year = date[4]; var dateTime = $"{year}.{month}.{day} {hour}:{minute}"; // 时间戳 var dateTimeWithSecond = $"{dateTime}:{second}"; var timestamp = this.ToTimestamp(Convert.ToDateTime(dateTimeWithSecond)); return (dateTime, timestamp); }
该方法首先检查数据的完整性,然后提取出 UTC 时间、日、月、年等信息。由于 GPS 数据中的时间通常是 UTC 时间,这里将其转换为本地时间(这里简单地加了 8 小时)。最后,构建出日期字符串和对应的时间戳。
5. 辅助方法
RemoveZero方法用于去除字符串开头的零:
private string RemoveZero(string s) { if (s.StartsWith("0")) { return s.Substring(1, 1); } return s; }
ToTimestamp方法将DateTime对象转换为时间戳:
private decimal ToTimestamp(DateTime d) { if (d.ToUniversalTime() <= DateTimeOffset.MinValue.UtcDateTime) { return 0; } var milliseconds = (decimal)(new DateTimeOffset(d).ToUnixTimeMilliseconds()); return milliseconds / 1000.0m; }
二、Location类定义
Location类用于存储解析后的位置信息:
public class Location { /// <summary> /// 车辆高程 /// </summary> public double Altitude { get; set; } /// <summary> /// 日期 /// </summary> public string Date { get; set; } /// <summary> /// 标志 /// </summary> public int Fwww.chinasem.cnlag { get; set; } /// <summary> /// 纬度 /// </summary> public double Latitude { get; set; } /// <summary> /// 经度 /// </summary> public double Longitude { get; set; } /// <summary> /// 卫星数量 /// </summary> public int NumSV { get; set; } /// <summary> /// 时间戳 /// </summary> public double TimeStamp { get; set; } }
它包含了海拔、日期、定位标志、经纬度、卫星数量和时间戳等属性,方便在后续的应用中使用这些解析后的数据。
三、参考与拓展
更多关于 WTGPS+BD 数据解析的详细信息,可以参考Wit Motion 的官方文档。在实际应用中,可能还需要根据具体的业务需求,对解析后的数据进行进一步的处理和分析,例如结合地图进行可视化展示,或者用于轨迹跟踪等功能。
通过上述代码和分析,我们可以看到如何在 C# 中有效地解析 WTGPS+BD 数据,为开发高精度的定位相关应用奠定了基础。
到此这篇关于C#代码实现解析WTGPS和BD数据的文章就介绍到这了,更多相关C#解析数据内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于C#代码实现解析WTGPS和BD数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!