首先很感谢周老师开源的数据下载程序,但是对于做导航相关的同学来说,我有一个想法~
输入观测文件,通过读取观测文件的头文件起始时间和结束时间,就下到对应天数的产品
(我是懒狗,其实对于我个人来说,我不需要过多的产品,只需要自己喜欢的产品即可,并且所有产品下载到一个文件里就好了)
1、头文件读取
static bool readobshead(const std::string& filename,std::vector<int>&start_time,int &doy){
std::vector<int>last_time= {0,0,0,0,0,0};
doy = 0;
std::fstream obsfile(filename);
if (!obsfile.is_open()) {
std::cerr << "Failed to open obs file: " << filename << std::endl;
return false;
}
std::string str_line = "";
std::istringstream temp(str_line);
while (getline(obsfile, str_line)) {
if(str_line.find("TIME OF FIRST OBS") != std::string::npos)
{
std::istringstream iss(str_line);
iss >> start_time[0] >> start_time[1] >> start_time[2]
>> start_time[3] >> start_time[4] >>start_time[5] ;
continue;
}
if (str_line.find("TIME OF LAST OBS") != std::string::npos) {
std::istringstream iss(str_line);
iss >> last_time[0] >> last_time[1] >> last_time[2]
>> last_time[3] >> last_time[4] >> last_time[5];
continue;
}
if (str_line.find("END OF HEADER") != std::string::npos) {
break;
}
}
doy = daysPassed(start_time,last_time);
if(doy != 0){
return true;
}else{
return false;
}
}
很简单的头文件读取,输出文件的路径,计算起始时间和doy也就是年积日
2、通过起始时间和结束时间让其支持跨天
static int daysPassed(const std::vector<int>& start_time,const std::vector<int> & end_time) {
// 判断是否跨天
if (start_time[0] == end_time[0] && start_time[1] == end_time[1] && start_time[2] == end_time[2]) {
return 1; // 同一天
} else {
return end_time[2] - start_time[2] + 1; // 跨天
}
}
3、判断是不是观测文件(这里按照文件末尾是不是o与O进行判断)
static bool endsWithO(const std::string& filename) {
if (!filename.empty()) {
char lastChar = filename.back(); // 获取文件名的最后一个字符
return (lastChar == 'O' || lastChar == 'o');
}
return false;
}
4、通过观测文件路径推断出此文件的所外路径
也就是D:data\o推断出D:data,数据下载到这个路径下
static std::string extractFolderPath(const std::string& filepath) {
// 寻找最后一个 '\' 字符的位置
size_t found = filepath.find_last_of("\\");
if (found != std::string::npos) {
// 返回路径部分
return filepath.substr(0, found);
} else {
// 如果没有找到 '\' 字符,返回空字符串
return "";
}
}
5、修改程序的主入口程序
这样我们就可以支持下载多个观测文件的数据啦,同时也不影响原先配置文件
int main(int argc, char * argv[]) {
if (argc < 2) {
std::cout << std::endl;
Logger::Trace(TEXPORT, "* Usage: run_GOOD GOOD_cfg.yaml [file1] [file2] ... [fileN]");
std::cout << std::endl;
return -1;
}
Logger::Trace(TEXPORT, "GAMP II: intelliGent Analysis system for Multi-sensor integrated navigation and Positioning v2.0");
Logger::Trace(TEXPORT, "===================================================================================================");
for (int i = 1; i < argc; ++i) {
std::string cfgfile = argv[i];
bool readobs =

最低0.47元/天 解锁文章
3115





