最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#代碼實現(xiàn)解析WTGPS和BD數(shù)據(jù)

 更新時間:2025年06月04日 10:54:05   作者:阿蒙Armon  
在現(xiàn)代的導航與定位應用中,準確解析 GPS 和北斗(BD)等衛(wèi)星定位數(shù)據(jù)至關重要,本文將使用C#語言實現(xiàn)解析WTGPS和BD數(shù)據(jù),需要的可以了解下

在現(xiàn)代的導航與定位應用中,準確解析 GPS 和北斗(BD)等衛(wèi)星定位數(shù)據(jù)至關重要。今天,我們來探討如何使用 C# 語言對 WTGPS+BD 數(shù)據(jù)進行解析。

一、代碼結構概覽

首先,我們有一個WitGpsParser類,這個類主要負責解析原始的 GPS 數(shù)據(jù)。它包含了一些關鍵的字段和方法:

using System;
using System.Linq;


public class WitGpsParser
{
    // 經(jīng)緯度標記
    private readonly string gnzda = "GNZDA";
    // 時間戳標記
    private readonly string gngga = "GNGGA";
    private readonly StringSplitOptions options = StringSplitOptions.RemoveEmptyEntries;
   
   // ...
}

其中,gnzda和gngga分別用于標識不同類型的 GPS 數(shù)據(jù)語句,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;
}

它首先將輸入的原始數(shù)據(jù)按行分割,然后分別查找包含GNGGA和GNZDA的行。GNGGA語句通常包含位置信息,而GNZDA語句包含日期和時間信息。通過調(diào)用ToLocation和ToDateAndTimestamp方法,分別解析出位置和時間信息,并將它們組裝到Location對象中返回。

2. 位置信息解析

ToLocation方法負責從GNGGA語句中提取并解析位置相關信息:

private Location ToLocation(string raw)
{
   if (string.IsNullOrWhiteSpace(raw))
   {
       return null;
   }


   var raws = raw.Split(new char[] { ',' });

   // 驗證數(shù)據(jù)完整
   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,
   };
}

在這個方法中,首先檢查輸入數(shù)據(jù)是否為空或不完整。然后,通過調(diào)用ToLatitude和ToLongitude方法,將字符串形式的經(jīng)緯度轉換為實際的數(shù)值。同時,提取定位標志(flag)、衛(wèi)星數(shù)量(numSV)和海拔高度(altitude)等信息,最后構建并返回Location對象。

3. 經(jīng)緯度轉換方法

ToLatitude和ToLongitude方法用于將特定格式的經(jīng)緯度字符串轉換為實際的度數(shù):

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;
}

例如,對于經(jīng)度字符串,前三位表示度數(shù),后面五位表示分,通過特定的計算將其轉換為以度為單位的數(shù)值。

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 = utcDate.Substring(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);
   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);
}

該方法首先檢查數(shù)據(jù)的完整性,然后提取出 UTC 時間、日、月、年等信息。由于 GPS 數(shù)據(jù)中的時間通常是 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 Flag { get; set; }

   /// <summary>
   /// 緯度
   /// </summary>
   public double Latitude { get; set; }

   /// <summary>
   /// 經(jīng)度
   /// </summary>
   public double Longitude { get; set; }

   /// <summary>
   /// 衛(wèi)星數(shù)量
   /// </summary>
   public int NumSV { get; set; }

   /// <summary>
   /// 時間戳
   /// </summary>
   public double TimeStamp { get; set; }
}

它包含了海拔、日期、定位標志、經(jīng)緯度、衛(wèi)星數(shù)量和時間戳等屬性,方便在后續(xù)的應用中使用這些解析后的數(shù)據(jù)。

三、參考與拓展

更多關于 WTGPS+BD 數(shù)據(jù)解析的詳細信息,可以參考Wit Motion 的官方文檔。在實際應用中,可能還需要根據(jù)具體的業(yè)務需求,對解析后的數(shù)據(jù)進行進一步的處理和分析,例如結合地圖進行可視化展示,或者用于軌跡跟蹤等功能。

通過上述代碼和分析,我們可以看到如何在 C# 中有效地解析 WTGPS+BD 數(shù)據(jù),為開發(fā)高精度的定位相關應用奠定了基礎。

到此這篇關于C#代碼實現(xiàn)解析WTGPS和BD數(shù)據(jù)的文章就介紹到這了,更多相關C#解析數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#使用Spire.Doc?for?.NET實現(xiàn)批量接受或拒絕Word的修訂內(nèi)容

    C#使用Spire.Doc?for?.NET實現(xiàn)批量接受或拒絕Word的修訂內(nèi)容

    Microsoft?Word?的修訂功能可以記錄文檔中的修改、校對、更正,以及他人添加的建議和批注,本文將演示如何使用?Spire.Doc?for?.NET,通過代碼的方式批量接受或拒絕?Word?文檔中的所有修訂內(nèi)容,感興趣的小伙伴可以了解下
    2026-01-01
  • C#實現(xiàn)的中國移動官網(wǎng)手機號碼采集器

    C#實現(xiàn)的中國移動官網(wǎng)手機號碼采集器

    這篇文章主要介紹了C#實現(xiàn)的中國移動官網(wǎng)手機號碼采集器,本文先是采集號碼入庫,同時給出了篩選各類靚號的SQL語句,需要的朋友可以參考下
    2014-10-10
  • 基于WPF編寫有趣的久坐提醒桌面小程序

    基于WPF編寫有趣的久坐提醒桌面小程序

    這篇文章主要為大家詳細介紹了如何基于WPF編寫一個有趣的久坐提醒桌面小程序,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下
    2023-08-08
  • C#文件壓縮與解壓縮的多種實現(xiàn)方法

    C#文件壓縮與解壓縮的多種實現(xiàn)方法

    在C#中實現(xiàn)文件壓縮和解壓縮是一個常見的需求,可以通過多種方式實現(xiàn),包括使用.NET Framework內(nèi)置的類庫和第三方庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • C#中的枚舉類型(Enum)介紹

    C#中的枚舉類型(Enum)介紹

    這篇文章介紹了C#中的枚舉類型(Enum),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • WCF分布式開發(fā)之MSMQ消息隊列

    WCF分布式開發(fā)之MSMQ消息隊列

    這篇文章介紹了WCF分布式開發(fā)之MSMQ消息隊列,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#中矩形數(shù)組的定義和元素訪問

    C#中矩形數(shù)組的定義和元素訪問

    矩形數(shù)組是指由相同數(shù)據(jù)類型的元素按照行和列組成的二維數(shù)組,可以使用索引訪問矩形數(shù)組中的單個元素,也可以使用循環(huán)結構遍歷矩形數(shù)組中的所有元素,此外,我們還需要注意不要修改矩形數(shù)組的維度,避免使用矩形數(shù)組造成內(nèi)存占用過高等問題
    2024-01-01
  • unity shader實現(xiàn)玻璃折射效果

    unity shader實現(xiàn)玻璃折射效果

    這篇文章主要為大家詳細介紹了unity shader實現(xiàn)玻璃折射效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c# datetime 格式化大全

    c# datetime 格式化大全

    這篇文章主要介紹了c# datetime 格式化大全,有需要的朋友可以參考一下
    2014-01-01
  • C#異常處理中try和catch語句及finally語句的用法示例

    C#異常處理中try和catch語句及finally語句的用法示例

    這篇文章主要介紹了C#異常處理中try和catch語句及finally語句的用法示例,finally語句的使用涉及到了C#的垃圾回收特性,需要的朋友可以參考下
    2016-02-02

最新評論

同江市| 莲花县| 潮安县| 满洲里市| 罗山县| 墨竹工卡县| 尉犁县| 陇西县| 九台市| 绥阳县| 桑植县| 荆门市| 治多县| 广水市| 通河县| 新疆| 镇雄县| 安龙县| 中山市| 永丰县| 海盐县| 且末县| 民勤县| 舟曲县| 石楼县| 淮安市| 冀州市| 慈溪市| 沾化县| 凤城市| 四平市| 丰原市| 孝感市| 罗山县| 华坪县| 乌拉特后旗| 宜丰县| 洞头县| 景宁| 美姑县| 永寿县|