| | |
| | | |
| | | |
| | | /** |
| | | * 解析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; |
| | | } |
| | | |