| | |
| | | |
| | | |
| | | /** |
| | | * 解析GNGGA数据返回Coordinate对象列表(增强版,包含高程数据) |
| | | * 解析GNGGA/GPGGA/GBGGA数据返回Coordinate对象列表(增强版,包含高程数据) |
| | | */ |
| | | public static void parseGNGGAToCoordinateList(String gnggaData) { |
| | | if (!isStartSaveGngga || gnggaData == null || gnggaData.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | // 处理完整的GNGGA数据(可能包含$GNGGA前缀) |
| | | String cleaned = gnggaData.trim(); |
| | | if (cleaned.startsWith("$GNGGA")) { |
| | | // 如果数据以$GNGGA开头,直接解析 |
| | | String record = cleaned.substring("$GNGGA".length()); |
| | | // 使用正则分割支持多种头部 |
| | | 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); |
| | | } |
| | | } else { |
| | | // 处理可能包含多个$GNGGA记录的情况 |
| | | String[] records = cleaned.split("\\$GNGGA"); |
| | | for (String record : records) { |
| | | if (record == null || record.trim().isEmpty()) { |
| | | continue; // 跳过空字符串(split产生的第一个元素可能是空的) |
| | | } |
| | | 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; |
| | | } |
| | | |