| | |
| | | |
| | | |
| | | /** |
| | | * 解析GNGGA数据返回Coordinate对象列表(增强版,包含高程数据) |
| | | * 解析GNGGA/GPGGA/GBGGA数据返回Coordinate对象列表(增强版,包含高程数据) |
| | | */ |
| | | public static void parseGNGGAToCoordinateList(String gnggaData) { |
| | | if (!isStartSaveGngga || gnggaData == null || gnggaData.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | String[] records = gnggaData.split("\\$GNGGA"); |
| | | String cleaned = gnggaData.trim(); |
| | | // 使用正则分割支持多种头部 |
| | | String[] records = cleaned.split("\\$(GN|GP|GB)GGA"); |
| | | for (String record : records) { |
| | | if (record == null || record.trim().isEmpty()) { |
| | | continue; |
| | | } |
| | | Coordinate coord = parseSingleGnggaRecord(record, false); |
| | | if (coord != null) { |
| | | coordinates.add(coord); |
| | |
| | | return null; |
| | | } |
| | | |
| | | int markerIndex = cleaned.indexOf("$GNGGA"); |
| | | int markerIndex = -1; |
| | | String[] headers = {"$GNGGA", "$GPGGA", "$GBGGA"}; |
| | | |
| | | // 找到最早出现的头部 |
| | | for (String header : headers) { |
| | | int idx = cleaned.indexOf(header); |
| | | if (idx >= 0 && (markerIndex == -1 || idx < markerIndex)) { |
| | | markerIndex = idx; |
| | | } |
| | | } |
| | | |
| | | String record = markerIndex >= 0 |
| | | ? cleaned.substring(markerIndex + "$GNGGA".length()) |
| | | ? cleaned.substring(markerIndex + 6) // 所有头部长度均为6 |
| | | : cleaned; |
| | | |
| | | Coordinate coordinate = parseSingleGnggaRecord(record, true); |
| | |
| | | return null; |
| | | } |
| | | |
| | | if (fixQuality != 4) { |
| | | // 修改为允许非RTK固定解也能显示位置(只要不是无效定位0即可) |
| | | if (fixQuality == 0) { |
| | | return null; |
| | | } |
| | | |
| | |
| | | String line; |
| | | StringBuilder gnggaData = new StringBuilder(); |
| | | |
| | | System.out.println("开始读取GNGGA文件: " + file.getAbsolutePath()); |
| | | |
| | | while ((line = reader.readLine()) != null) { |
| | | // 清理数据:移除多余的空格和换行 |
| | | line = line.trim(); |
| | |
| | | if (gnggaData.length() > 0) { |
| | | parseGNGGAToCoordinateList(gnggaData.toString()); |
| | | loadedCount = coordinates.size(); |
| | | System.out.println("成功加载 " + loadedCount + " 个坐标点"); |
| | | |
| | | // 输出统计信息 |
| | | if (loadedCount > 0) { |
| | | double[] elevationRange = getElevationRange(); |
| | | double avgElevation = getAverageElevation(); |
| | | System.out.println("海拔统计: 范围=" + String.format("%.2f", elevationRange[0]) + |
| | | " - " + String.format("%.2f", elevationRange[1]) + "米, 平均=" + |
| | | String.format("%.2f", avgElevation) + "米"); |
| | | } |
| | | } else { |
| | | System.out.println("文件中未找到有效的GNGGA数据"); |
| | | } |
| | | |
| | | } catch (IOException e) { |