[學習]RTKLib詳解:convkml.c、convrnx.c與geoid.c


本文是 RTKLlib詳解 系列文章的一篇,目前該系列文章還在持續總結寫作中,以發表的如下,有興趣的可以翻閱。

[學習] RTKlib詳解:功能、工具與源碼結構解析
[學習]RTKLib詳解:pntpos.c與postpos.c
[學習]RTKLib詳解:rtkcmn.c與rtkpos.c
[學習]RTKLib詳解:ppp.c與ppp_ar.c
[學習]RTKLib詳解:ephemeris.c與rinex.c


文章目錄

    • Part A: convkml.c 文件解析
      • 一、文件整體說明
      • 二、執行流程與函數調用關系
      • 三、主要函數說明
        • 3.1 `main`
        • 3.2 `readcmdline`
        • 3.3 `readobsfile`
        • 3.4 `convkml`
        • 3.5 `writekmlhead`
        • 3.6 `writekmlbody`
        • 3.7 `writekmltail`
      • 四、關鍵算法數學原理與推導
        • 地理坐標系到 ECEF 的轉換
    • Part B: convrnx.c 文件解析
      • 一、文件整體說明
      • 二、執行流程與函數調用關系
      • 三、主要函數說明
        • 3.1 `main`
        • 3.2 `readcmdline`
        • 3.3 `initrnx`
        • 3.4 `openfiles`
        • 3.5 `convertrnx`
        • 3.6 `readrawdata`
        • 3.7 `outputrnx`
        • 3.8 `closefiles`
      • 四、關鍵算法數學原理與推導
        • 時間系統轉換
    • Part C: geoid.c 文件解析
      • 一、文件整體說明
      • 二、執行流程與函數調用關系
      • 三、主要函數說明
        • 3.1 `geoid_hgt`
        • 3.2 `load_geoid`
        • 3.3 `interp_geoid`
        • 3.4 `bilin_interp`
      • 四、關鍵算法數學原理與推導
        • 雙線性插值


Part A: convkml.c 文件解析

一、文件整體說明

convkml.c 是 RTKLIB 中用于將 GNSS 數據轉換為 KML(Keyhole Markup Language)格式的工具,便于在 Google Earth 等地理可視化軟件中展示軌跡、觀測點等信息。該文件主要實現了從 RINEX 或 RTKLIB 內部數據結構到 KML 標記語言的轉換。

主要功能:

  • 將 GNSS 觀測數據轉換為 KML 格式。
  • 支持多種顯示樣式,如路徑、標記點、高度剖面圖等。
  • 可選輸出模式包括靜態點、動態路徑等。

主要特色:

  • 支持多頻段和多系統數據。
  • 提供靈活的樣式配置選項。
  • 可導出不同時間分辨率的數據點。

二、執行流程與函數調用關系

程序執行流程如下:

  1. 初始化參數設置。
  2. 讀取輸入數據(如 RINEX 文件)。
  3. 處理數據并提取位置信息。
  4. 生成 KML 文件內容。
  5. 寫入 KML 文件并關閉資源。

函數調用關系如下所示:

main
readcmdline
initopt
readobsfile
convkml
writekmlhead
writekmlbody
writekmldata
writekmltail

其中:

  • readcmdline: 解析命令行參數。
  • initopt: 初始化輸出選項。
  • readobsfile: 讀取觀測文件(RINEX等)。
  • convkml: 主要轉換邏輯入口。
  • writekml* 函數負責生成 KML 的各個部分。

三、主要函數說明

3.1 main
int main(int argc, char *argv[])

功能:
主函數,負責接收命令行參數并調度各模塊完成 KML 轉換。

輸入參數:

  • argc: 命令行參數個數。
  • argv[]: 命令行參數數組。

輸出參數:

  • 返回狀態碼(0 表示成功,非零表示錯誤)。

3.2 readcmdline
void readcmdline(int argc, char *argv[], opt_t *opt)

功能:
解析命令行參數并填充配置結構體 opt

輸入參數:

  • argc, argv[]: 命令行參數。
  • opt: 輸出參數,包含所有配置選項。

3.3 readobsfile
int readobsfile(const char *file, obs_t *obs, nav_t *nav, opt_t *opt)

功能:
讀取觀測文件(如 RINEX),并將數據存儲到 obsnav 結構體中。

輸入參數:

  • file: 輸入文件路徑。
  • obs: 存儲觀測數據的結構體指針。
  • nav: 存儲導航數據的結構體指針。
  • opt: 配置選項。

返回值:

  • 成功返回 1,失敗返回 0。

3.4 convkml
int convkml(FILE *fp, const obs_t *obs, const nav_t *nav, const opt_t *opt)

功能:
核心轉換函數,將 GNSS 數據轉換為 KML 格式并寫入文件。

輸入參數:

  • fp: 文件指針。
  • obs, nav, opt: 輸入數據與配置。

返回值:

  • 成功返回 1,失敗返回 0。

3.5 writekmlhead
void writekmlhead(FILE *fp, const opt_t *opt)

功能:
寫入 KML 文件頭部信息,包括文檔聲明、命名空間等。

輸入參數:

  • fp: 文件指針。
  • opt: 配置信息。

3.6 writekmlbody
void writekmlbody(FILE *fp, const obs_t *obs, const nav_t *nav, const opt_t *opt)

功能:
寫入 KML 主體內容,包括路徑、標記點等。

輸入參數:

  • fp, obs, nav, opt: 同上。

3.7 writekmltail
void writekmltail(FILE *fp)

功能:
寫入 KML 文件尾部標簽,結束文檔。

輸入參數:

  • fp: 文件指針。

四、關鍵算法數學原理與推導

地理坐標系到 ECEF 的轉換

GNSS 接收機通常輸出經緯度和高度(LLH),但 KML 使用的是地心坐標系(ECEF)。因此需要進行 LLH 到 ECEF 的轉換。

公式如下:

N = a 1 ? e 2 sin ? 2 ( ? ) x = ( N + h ) cos ? ( ? ) cos ? ( λ ) y = ( N + h ) cos ? ( ? ) sin ? ( λ ) z = [ N ( 1 ? e 2 ) + h ] sin ? ( ? ) \begin{aligned} &N = \frac{a}{\sqrt{1 - e^2 \sin^2(\phi)}} \\ &x = (N + h)\cos(\phi)\cos(\lambda) \\ &y = (N + h)\cos(\phi)\sin(\lambda) \\ &z = \left[N(1 - e^2) + h\right]\sin(\phi) \end{aligned} ?N=1?e2sin2(?) ?a?x=(N+h)cos(?)cos(λ)y=(N+h)cos(?)sin(λ)z=[N(1?e2)+h]sin(?)?

其中:

  • ? \phi ?: 緯度(弧度)
  • λ \lambda λ: 經度(弧度)
  • h h h: 橢球高
  • a a a: WGS84 長半軸
  • e 2 = 1 ? b 2 a 2 e^2 = 1 - \frac{b^2}{a^2} e2=1?a2b2?: 第一偏心率平方

這個轉換是繪制軌跡的基礎。


Part B: convrnx.c 文件解析

一、文件整體說明

convrnx.c 是 RTKLIB 中用于將各種原始觀測數據(如 BINEX、UBX、RTCM 等)轉換為 RINEX 格式的工具。RINEX 是 GNSS 數據的標準格式,廣泛用于后處理和分析。

主要功能:

  • 多種原始數據格式轉 RINEX。
  • 支持多頻段、多系統。
  • 自動識別輸入數據格式。

主要特色:

  • 支持自動探測輸入數據類型。
  • 提供靈活的時間過濾與輸出選項。
  • 可以輸出壓縮的 RINEX(.crx/.gz)。

二、執行流程與函數調用關系

程序執行流程如下:

  1. 解析命令行參數。
  2. 打開輸入/輸出文件。
  3. 讀取并解析原始數據流。
  4. 轉換為 RINEX 格式并寫入文件。
  5. 清理資源并退出。

函數調用關系如下:

main
readcmdline
initrnx
openfiles
convertrnx
readrawdata
outputrnx
closefiles

三、主要函數說明

3.1 main
int main(int argc, char *argv[])

功能:
主函數,解析命令行參數并控制整個轉換流程。

輸入輸出:

  • 同前文。

3.2 readcmdline
void readcmdline(int argc, char *argv[], rnxopt_t *opt)

功能:
解析命令行參數并填充 rnxopt_t 結構體。

輸入輸出:

  • 同前文。

3.3 initrnx
int initrnx(rnxopt_t *opt)

功能:
根據用戶配置初始化 RINEX 轉換參數。

輸入參數:

  • opt: 轉換配置結構體。

3.4 openfiles
int openfiles(const char *infile, const char *outfile, FILE **fpin, FILE **fpout, rnxopt_t *opt)

功能:
打開輸入和輸出文件,支持壓縮格式。

輸入參數:

  • infile, outfile: 文件路徑。
  • fpin, fpout: 文件指針地址。
  • opt: 配置。

3.5 convertrnx
int convertrnx(FILE *fpin, FILE *fpout, rnxopt_t *opt)

功能:
主轉換循環,讀取原始數據并寫入 RINEX。

輸入輸出:

  • 同上。

3.6 readrawdata
int readrawdata(FILE *fp, unsigned char *buff, int nmax, int format, raw_t *raw)

功能:
讀取原始觀測數據并解析為內部結構。

輸入參數:

  • fp: 輸入文件指針。
  • buff: 緩沖區。
  • nmax: 最大讀取長度。
  • format: 數據格式(如 RTCM3, UBX 等)。
  • raw: 輸出解析后的數據。

返回值:

  • 成功返回字節數,失敗返回負值。

3.7 outputrnx
int outputrnx(FILE *fp, const raw_t *raw, const rnxopt_t *opt)

功能:
將解析后的數據按 RINEX 格式寫入輸出文件。

輸入參數:

  • fp, raw, opt: 同上。

3.8 closefiles
void closefiles(FILE *fpin, FILE *fpout)

功能:
關閉輸入輸出文件句柄。


四、關鍵算法數學原理與推導

時間系統轉換

原始數據中的時間戳可能使用 GPS 時間、UTC、本地時間等,而 RINEX 要求使用 GPS 時間或 UTC。因此需要進行時間系統轉換。

GPS 時間與 UTC 的關系為:

t G P S = t U T C + Δ t l e a p t_{GPS} = t_{UTC} + \Delta t_{leap} tGPS?=tUTC?+Δtleap?

其中 Δ t l e a p \Delta t_{leap} Δtleap? 是閏秒修正值,需通過星歷或頭文件獲取。


Part C: geoid.c 文件解析

一、文件整體說明

geoid.c 實現了大地高與正常高的相互轉換,依賴于大地水準面模型(如 EGM96、EGM2008)。它提供了基于插值方法的大地高與正高之間的轉換功能。

主要功能:

  • 計算某一點的大地水準面高(N)。
  • 支持多種大地水準面模型。
  • 提供雙線性插值功能。

主要特色:

  • 支持網格化模型數據。
  • 可擴展性強,易于添加新模型。
  • 高效的插值算法。

二、執行流程與函數調用關系

程序執行流程如下:

  1. 加載大地水準面模型文件。
  2. 對給定的地理坐標進行插值計算。
  3. 輸出大地水準面高。

函數調用關系如下:

geoid_hgt
load_geoid
interp_geoid
bilin_interp

三、主要函數說明

3.1 geoid_hgt
double geoid_hgt(double lat, double lon, const char *model)

功能:
對外接口,輸入經緯度和模型名,返回大地水準面高。

輸入參數:

  • lat, lon: 地理緯度和經度(十進制度)。
  • model: 模型名稱(如 “egm96_15”)。

返回值:

  • 大地水準面高 N(米)。

3.2 load_geoid
int load_geoid(const char *model, geoid_t *geoid)

功能:
加載指定模型的網格數據到內存。

輸入參數:

  • model: 模型名。
  • geoid: 存儲模型數據的結構體。

返回值:

  • 成功返回 1,失敗返回 0。

3.3 interp_geoid
double interp_geoid(double lat, double lon, const geoid_t *geoid)

功能:
調用雙線性插值函數計算某點的大地水準面高。

輸入參數:

  • lat, lon: 插值點坐標。
  • geoid: 模型數據結構體。

返回值:

  • 插值結果(米)。

3.4 bilin_interp
double bilin_interp(double x, double y, double *v, int nx, int ny)

功能:
實現雙線性插值算法。

輸入參數:

  • x, y: 插值點坐標。
  • v: 網格數據數組。
  • nx, ny: 網格尺寸。

返回值:

  • 插值結果。

四、關鍵算法數學原理與推導

雙線性插值

設四個角點分別為:

  • f ( x 1 , y 1 ) f(x_1, y_1) f(x1?,y1?)
  • f ( x 2 , y 1 ) f(x_2, y_1) f(x2?,y1?)
  • f ( x 1 , y 2 ) f(x_1, y_2) f(x1?,y2?)
  • f ( x 2 , y 2 ) f(x_2, y_2) f(x2?,y2?)

目標點 ( x , y ) (x, y) (x,y) 在矩形區域內,則插值公式為:

f ( x , y ) = ( x 2 ? x ) ( y 2 ? y ) Δ x Δ y f ( x 1 , y 1 ) + ( x ? x 1 ) ( y 2 ? y ) Δ x Δ y f ( x 2 , y 1 ) + ( x 2 ? x ) ( y ? y 1 ) Δ x Δ y f ( x 1 , y 2 ) + ( x ? x 1 ) ( y ? y 1 ) Δ x Δ y f ( x 2 , y 2 ) f(x,y) = \frac{(x_2 - x)(y_2 - y)}{\Delta x \Delta y} f(x_1,y_1) + \frac{(x - x_1)(y_2 - y)}{\Delta x \Delta y} f(x_2,y_1) + \frac{(x_2 - x)(y - y_1)}{\Delta x \Delta y} f(x_1,y_2) + \frac{(x - x_1)(y - y_1)}{\Delta x \Delta y} f(x_2,y_2) f(x,y)=ΔxΔy(x2??x)(y2??y)?f(x1?,y1?)+ΔxΔy(x?x1?)(y2??y)?f(x2?,y1?)+ΔxΔy(x2??x)(y?y1?)?f(x1?,y2?)+ΔxΔy(x?x1?)(y?y1?)?f(x2?,y2?)

其中 Δ x = x 2 ? x 1 \Delta x = x_2 - x_1 Δx=x2??x1?, Δ y = y 2 ? y 1 \Delta y = y_2 - y_1 Δy=y2??y1?

此方法用于大地水準面模型的離散數據插值。


研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79453.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 破解aspose.words 18.6 使用

資源包&#xff1a;https://download.csdn.net/download/qq_36598111/90787167 jar包是破解過的&#xff0c;直接可以使用。 引入jar&#xff0c;要引入本地的&#xff0c;不要直接引入倉庫的 <dependency><groupId>com.aspose</groupId><artifactId>…

vue使用rules實現表單校驗——校驗用戶名和密碼

編寫校驗規則 常規校驗 const rules {username: [{ required: true, message: 請輸入用戶名, trigger: blur },{ min: 5, max: 16, message: 長度在 5 到 16 個字符, trigger: blur }],password: [{ required: true, message: 請輸入密碼, trigger: blur },{ min: 5, max: 1…

寶塔服務安裝使用的保姆級教程

寶塔介紹&#xff1a; 寶塔面板&#xff08;BT Panel&#xff09; 是一款 國產的服務器運維管理面板&#xff0c;主要用于簡化 Linux/Windows 服務器的網站、數據庫、FTP、防火墻等管理操作。它通過圖形化界面&#xff08;Web端&#xff09;和命令行工具&#xff08;bt 命令&a…

數字化轉型-4A架構之數據架構

4A架構系列文章 數字化轉型-4A架構&#xff08;業務架構、應用架構、數據架構、技術架構&#xff09; 數字化轉型-4A架構之業務架構 數字化轉型-4A架構之應用架構 數字化轉型-4A架構之數據架構 數字化轉型-4A架構之技術架構 數據架構 Data Architecture&#xff08;DA&…

每日腳本 5.11 - 進制轉換和ascii字符

前置知識 python中各個進制的開頭 二進制 &#xff1a; 0b 八進制 &#xff1a; 0o 十六進制 : 0x 進制轉換函數 &#xff1a; bin() 轉為2進制 oct() 轉換為八進制的函數 hex() 轉換為16進制的函數 ascii碼和字符之間的轉換 &#xff1a; chr(97) 碼轉為字符 …

Vulnhub Lazysysadmin靶機攻擊實戰(一)

導語 ??靶機下載地址 https://download.vulnhub.com/lazysysadmin/Lazysysadmin.zip ??靶機信息地址 https://www.vulnhub.com/entry/lazysysadmin-1,205/ 文章目錄 信息收集掃描路徑提權其他思路探索其他方式找密碼總結下載安裝好靶機之后啟動虛擬機如下所示。 信息收集 我…

【DB2】DB2啟動失敗報錯SQL1042C

在本地某次啟動db2時報錯SQL1042C&#xff0c;具體報錯如下 [db2inst1standby ~]$ db2start 05/07/2025 16:32:53 0 0 SQL1042C An unexpected system error occurred. SQL1032N No start database manager command was issued. SQLSTATE57019在網上百度到說是需要…

Python中的re庫詳細用法與代碼解析

目錄 1. 前言 2. 正則表達式的基本概念 2.1 什么是正則表達式&#xff1f; 2.2 常用元字符 3. re庫的適應場景 3.1 驗證用戶輸入 3.2 從文本中提取信息 3.3 文本替換與格式化 3.4 分割復雜字符串 3.5 數據清洗與預處理 4. re庫的核心功能詳解 4.1 re.match()&#…

藍橋杯2025年第十六屆省賽真題-水質檢測

C語言代碼&#xff1a; #include <stdio.h> #include <string.h>#define MAX_LEN 1000000int main() {char a[MAX_LEN 1], b[MAX_LEN 1];// 使用 scanf 讀取字符數組scanf("%s", a);scanf("%s", b);int ans 0;int pre -1;int state -1;i…

65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 創建 3D 圖形

65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 創建 3D 圖形 實現效果 在該案例中&#xff0c;Three.js 被用來創建一個包含多個 3D 對象的場景。其中包括&#xff1a; 圓環結&#xff08;TorusKnot&#xff09;立方體&#xff08;Box&#xff09;球體&…

Python學習筆記--Django的安裝和簡單使用(一)

一.簡介 Django 是一個用于構建 Web 應用程序的高級 Python Web 框架。Django 提供了一套強大的工具和約定&#xff0c;使得開發者能夠快速構建功能齊全且易于維護的網站。Django 遵守 BSD 版權&#xff0c;初次發布于 2005 年 7 月, 并于 2008 年 9 月發布了第一個正式版本 1…

《汽車噪聲控制》復習重點

題型 選擇 填空 分析 計算 第一章 噪聲定義 不需要的聲音&#xff0c;妨礙正常工作、學習、生活&#xff0c;危害身體健康的聲音&#xff0c;統稱為噪聲 噪聲污染 與大氣污染、水污染并稱現代社會三大公害 聲波基本概念 定義 媒質質點的機械振動由近及遠傳播&am…

冒泡排序的原理

冒泡排序是一種簡單的排序算法&#xff0c;它通過重復地遍歷待排序的列表&#xff0c;比較相鄰的元素并交換它們的位置來實現排序。具體原理如下&#xff1a; 冒泡排序的基本思想 冒泡排序的核心思想是通過相鄰元素的比較和交換&#xff0c;將較大的元素逐步“冒泡”到列表的…

前端npm包發布流程:從準備到上線的完整指南

無論是使用第三方庫還是創建和分享自己的工具&#xff0c;npm都為我們提供了一個強大而便捷的平臺&#xff0c;然而很多開發者在將自己的代碼發布到npm上時往往面臨各種困惑和挑戰&#xff0c;本篇文章將從準備工作到發布上線&#xff0c;探討如何讓npm包更易發布及避免常見的坑…

使用 CDN 在國內加載本地 PDF 文件并處理批注:PDF.js 5.x 實戰指南

PDF.js 是一個強大的開源 JavaScript 庫&#xff0c;用于在 Web 瀏覽器中渲染 PDF 文件。它由 Mozilla 開發&#xff0c;能夠將 PDF 文檔繪制到 HTML5 Canvas 或 SVG 上&#xff0c;無需任何本機代碼或瀏覽器插件。對于許多需要在網頁中展示 PDF 內容的應用場景來說&#xff0c…

網絡化:DevOps 工程的必要基礎(Networking: The Essential Foundation for DevOps Engineering)

李升偉 編譯 理解網絡化基礎知識 你是否曾想過是什么真正讓卓越的DevOps工程師與眾人區別開來&#xff1f;答案是網絡化。是的&#xff0c;對網絡的基本理解不僅僅是有幫助的——它是絕對必要的。在當今以微服務、容器和分布式系統為主宰的互聯互通世界中&#xff0c;對網絡原…

C++基本知識 —— 缺省參數·函數重載·引用

C基本知識 —— 缺省參數函數重載引用 1. 缺省參數2. 函數重載3. 引用3.1 引用的基礎知識3.2 引用的作用3.3 const 引用3.4 指針與引用的關系 1. 缺省參數 什么是缺省參數&#xff1f;缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數的時候&#xff0c;如…

Rust 官方文檔:人話版翻譯指南

鑒于大部分翻譯文檔都不太會說人話&#xff0c;本專欄主要內容為 rust 程序設計語言、rust 參考手冊、std 庫 等官方文檔的中譯中。

FlySecAgent:——MCP全自動AI Agent的實戰利器

最近&#xff0c;出于對人工智能在網絡安全領域應用潛力的濃厚興趣&#xff0c;我利用閑暇時間進行了深入研究&#xff0c;并成功開發了一款小型輕量化的AI Agent安全客戶端FlySecAgent。 什么是 FlySecAgent&#xff1f; 這是一個基于大語言模型和MCP&#xff08;Model-Contr…

實戰項目5(08)

目錄 任務場景一 【r1配置】 【r2配置】 【r3配置】 ???????任務場景二 【r1配置】 【r2配置】 ???????任務場景一 按照下圖完成網絡拓撲搭建和配置 任務要求&#xff1a; 通過在路由器R1、R2和R3上配置靜態路由&#xff0c;實現網絡中各終端PC能夠正常…