C#代码实现解析WTGPS和BD数据

2025-06-04 15:50

本文主要是介绍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数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154904

相关文章

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu