
输入导航文件既可解算卫星位置,解算结果除了展示在结果区外,还会在工作目录下新建一个RESULT.csv文件。
软件通过c++结合qt开发,运行速度较快。
核心计算代码如下
.cpp文件
// An highlighted block
#pragma once
#include <iostream>
#include <regex>
#include <cctype>
#include "Satellites.h"
using namespace std;
#define U 3.986005e+14 // WGS-84 中地球引力常数
#define E 7.29211567e-5 // 地球自转速率
Satellites::Satellites(string path1, string path2)
{
vector<string> prn;
vector<vector<long double>> vt; // 二维动态数组
vector<long double> vi; // 一维动态数组
this->inFile.open(path1, ios::in); // 打开文件
this->oFile.open(path2, ios::out | ios::trunc);
if (this->inFile && this->oFile) // 若文件打开成功则继续下面操作
{
string s; // 存放读取的每一行字符串
smatch m; // 存放正则匹配到的元素
regex r("G\\d\\d.*|-?\\d.\\d{12}e[-+]\\d\\d"); // 正则匹配每个卫星单元
regex r1("\\d{4}|\\d\\d|-?\\d\\.\\d{12}e[+-]\\d\\d"); // 正则匹配非首行
int i = 0;
while (getline(this->inFile, s)) // 打开文件
{
if (++i == 3220) break;
if (regex_search(s, m, r)) // 匹配条件为 True 进入
if (regex_search(s, m, regex("G\\d\\d"))) // 首行则进入
{
prn.push_back(s.substr(0, 3)); // 将卫星 prn 推入
vt.push_back(vi); // 将之前的遍历作为一个推入 vt
vi.clear(); // 清空vi,为下一次遍历做准备
for (sregex_iterator it(s.begin() + 3, s.end(), r1), end_it; it != end_it; ++it) // sregex_iterator 正则迭代作用
vi.push_back(stold(it->str())); // 将匹配的每一个参数转为浮点型再推入vi
}
else
for (sregex_iterator it(s.begin(), s.end(), r1),
end_it; it != end_it; ++it) vi.push_back(stold(it->str())); // 将匹配的每一个参数转为浮点型再推入vi
}
vt.push_back(vi); // 将最后一次遍历的值推入 vt
// 写入文档首行条目
this->oFile << "n" << "," << "tk" << "," << "mk" << "," << "ek" << "," << "vk" << "," << "pa" << "," << "cu" << "," <<
"cr" << "," << "ci" << "," << "uk" << "," << "rk" << "," << "ik" << "," << "xk" << "," << "yk" << "," << "dk" <<
"," << "Xk" << "," << "Yk" << "," << "Zk" << endl;
}
else cout << "打开文件失败!请关闭 Excel 后重试!" << endl; // 若文件打开失败则提示
//cout << prn.size() << " " << vt.size() << " " << vt[0][0] << endl;
for (int i = 1

该软件采用C++和Qt开发,实现快速卫星位置解算。通过对输入的导航文件解析,提取卫星数据,计算出卫星的详细轨道参数,并将结果保存到RESULT.csv文件。核心算法涉及地球物理常数、时间转换及几何参数的精确计算,确保了定位的准确性。
最低0.47元/天 解锁文章
9653

被折叠的 条评论
为什么被折叠?



