From 454fbc00e2732484e1efd5a644bb4bea6011372f Mon Sep 17 00:00:00 2001 From: Benedikt Rothe Date: Wed, 1 Oct 2025 18:43:46 +0200 Subject: [PATCH] Support High-Bit-detection for M-values (like for Z-values). Needed to read Geopackages-files, written by ESRI/ArcGISPro --- src/main/java/mil/nga/sf/wkb/GeometryReader.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/mil/nga/sf/wkb/GeometryReader.java b/src/main/java/mil/nga/sf/wkb/GeometryReader.java index 6f9bb0e..8b2d9aa 100644 --- a/src/main/java/mil/nga/sf/wkb/GeometryReader.java +++ b/src/main/java/mil/nga/sf/wkb/GeometryReader.java @@ -35,6 +35,11 @@ public class GeometryReader { */ private static final long WKB25D = Long.decode("0x80000000"); + /** + * High-Bit-Indikator for M-values + */ + private static final long WKBM = Long.decode("0x40000000"); + /** * Read a geometry from well-known bytes * @@ -355,6 +360,12 @@ public GeometryTypeInfo readGeometryType() throws IOException { unsignedGeometryTypeCode -= WKB25D; } + boolean hasM = false; + if (unsignedGeometryTypeCode > WKBM) { + hasM = true; + unsignedGeometryTypeCode -= WKBM; + } + int geometryTypeCode = (int) unsignedGeometryTypeCode; // Determine the geometry type @@ -366,7 +377,9 @@ public GeometryTypeInfo readGeometryType() throws IOException { if (!hasZ) { hasZ = GeometryCodes.hasZ(geometryTypeCode); } - boolean hasM = GeometryCodes.hasM(geometryTypeCode); + if (!hasM) { + hasM = GeometryCodes.hasM(geometryTypeCode); + } GeometryTypeInfo geometryInfo = new GeometryTypeInfo(geometryTypeCode, geometryType, hasZ, hasM);