diff --git a/src/io/gpr/NormalizedRadarReader.cpp b/src/io/gpr/NormalizedRadarReader.cpp index aa9e43a..a3d360f 100644 --- a/src/io/gpr/NormalizedRadarReader.cpp +++ b/src/io/gpr/NormalizedRadarReader.cpp @@ -91,4 +91,17 @@ std::vector readRadarDataCube(const std::string& dataPath, } return cube; } +std::vector parseRadarCor(const std::string& corText) { + std::vector out; + std::istringstream in(corText); + std::string line; + while (std::getline(in, line)) { + if (line.empty() || line.rfind("VERSION", 0) == 0) continue; + std::istringstream ls(line); + TracePos p; std::string ns, ew, m; + if (ls >> p.index >> p.lat >> ns >> p.lon >> ew >> p.elev >> m >> p.solution) + out.push_back(p); + } + return out; +} } // namespace geopro::io::gpr diff --git a/src/io/gpr/NormalizedRadarReader.hpp b/src/io/gpr/NormalizedRadarReader.hpp index 2623724..d6fab03 100644 --- a/src/io/gpr/NormalizedRadarReader.hpp +++ b/src/io/gpr/NormalizedRadarReader.hpp @@ -37,6 +37,13 @@ double depthSpacingZ(const RadarHeader& h); std::vector readRadarDataCube(const std::string& dataPath, const RadarHeader& h); +// 规范化 .cor 轨迹单点:序号/纬度/经度/高程/解状态。 +struct TracePos { int index = 0; double lat = 0, lon = 0, elev = 0; int solution = 0; }; + +// 解析 .cor:跳过 "VERSION:" 行,每行 [序号 纬度 N/S 经度 E/W 高程 M 解状态] +// (制表/空格分隔)。本期仅解析,为 P1 多线配准预留。 +std::vector parseRadarCor(const std::string& corText); + } // namespace geopro::io::gpr #endif // GEOPRO_IO_GPR_NORMALIZED_RADAR_READER_HPP diff --git a/tests/io/gpr/test_normalized_radar_reader.cpp b/tests/io/gpr/test_normalized_radar_reader.cpp index 42146a9..a41443f 100644 --- a/tests/io/gpr/test_normalized_radar_reader.cpp +++ b/tests/io/gpr/test_normalized_radar_reader.cpp @@ -62,6 +62,20 @@ TEST(NormalizedRadarData, ReadsPositionMajorCubeLittleEndian) { EXPECT_EQ(at(0, 1, 0), 10); } +TEST(NormalizedRadarCor, ParsesRowsSkippingVersion) { + const std::string cor = + "VERSION:1\n" + "1\t317.179340\tN\t472.759046\tE\t49.980000\tM\t4\n" + "12\t317.201303\tN\t472.700649\tE\t51.040000\tM\t4\n"; + const auto pts = geopro::io::gpr::parseRadarCor(cor); + ASSERT_EQ(pts.size(), 2u); + EXPECT_EQ(pts[0].index, 1); + EXPECT_DOUBLE_EQ(pts[0].lat, 317.179340); + EXPECT_DOUBLE_EQ(pts[0].lon, 472.759046); + EXPECT_DOUBLE_EQ(pts[1].elev, 51.040000); + EXPECT_EQ(pts[1].solution, 4); +} + TEST(NormalizedRadarData, WrongFileSizeThrows) { fs::path dir = fs::temp_directory_path() / "radar_data_test"; fs::create_directories(dir);