You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2024/06/16 19:49:50 UTC
(sis) 01/02: Actually, `GeometryGetter` does not need to invoke `ByteBuffer.slice()` because WKB readers should start reading from current buffer position.
This is an automated email from the ASF dual-hosted git repository.
desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git
commit 4e0580c9571d5bb24e91be3cc65742ec948529a6
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Sun Jun 16 09:16:17 2024 +0200
Actually, `GeometryGetter` does not need to invoke `ByteBuffer.slice()`
because WKB readers should start reading from current buffer position.
---
.../main/org/apache/sis/geometry/wrapper/Geometries.java | 1 +
.../main/org/apache/sis/geometry/wrapper/esri/Factory.java | 5 ++++-
.../main/org/apache/sis/storage/sql/feature/GeometryGetter.java | 5 ++---
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/Geometries.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/Geometries.java
index f8a4d2b039..642414422f 100644
--- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/Geometries.java
+++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/Geometries.java
@@ -310,6 +310,7 @@ public abstract class Geometries<G> implements Serializable {
/**
* Reads the given bytes as a Well Known Binary (WKB) encoded geometry.
+ * The reading starts from the current buffer position.
* Whether this method changes the buffer position or not is implementation-dependent.
*
* @param data the binary data in WKB format. Cannot be null.
diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/esri/Factory.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/esri/Factory.java
index 720b09ee1e..0b513f3691 100644
--- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/esri/Factory.java
+++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/esri/Factory.java
@@ -291,7 +291,10 @@ public final class Factory extends Geometries<Geometry> {
* @return the geometry object for the given WKB.
*/
@Override
- public GeometryWrapper parseWKB(final ByteBuffer data) {
+ public GeometryWrapper parseWKB(ByteBuffer data) {
+ if (data.position() != 0) {
+ data = data.slice(); // ESRI implementation seems to ignore the position and always starts reading at 0.
+ }
return new Wrapper(OperatorImportFromWkb.local().execute(WkbImportFlags.wkbImportDefaults, Geometry.Type.Unknown, data, null));
}
}
diff --git a/endorsed/src/org.apache.sis.storage.sql/main/org/apache/sis/storage/sql/feature/GeometryGetter.java b/endorsed/src/org.apache.sis.storage.sql/main/org/apache/sis/storage/sql/feature/GeometryGetter.java
index 3aa316295e..451ad045b9 100644
--- a/endorsed/src/org.apache.sis.storage.sql/main/org/apache/sis/storage/sql/feature/GeometryGetter.java
+++ b/endorsed/src/org.apache.sis.storage.sql/main/org/apache/sis/storage/sql/feature/GeometryGetter.java
@@ -107,7 +107,7 @@ final class GeometryGetter<G, V extends G> extends ValueGetter<V> {
public V getValue(final InfoStatements stmts, final ResultSet source, final int columnIndex) throws Exception {
final byte[] wkb = encoding.getBytes(source, columnIndex);
if (wkb == null) return null;
- ByteBuffer buffer = ByteBuffer.wrap(wkb);
+ final ByteBuffer buffer = ByteBuffer.wrap(wkb);
/*
* The bytes should describe a geometry encoded in Well Known Binary (WKB) format,
* but this implementation accepts also the Geopackage geometry encoding:
@@ -141,8 +141,7 @@ final class GeometryGetter<G, V extends G> extends ValueGetter<V> {
default: throw new DataStoreContentException(Errors.forLocale(stmts.getLocale())
.getString(Errors.Keys.UnexpectedValueInElement_2, "envelope contents indicator"));
}
- buffer = buffer.position(offset).slice();
- // Result of slice is in BIG_ENDIAN.
+ buffer.position(offset).order(ByteOrder.BIG_ENDIAN);
}
final GeometryWrapper geom = geometryFactory.parseWKB(buffer);
CoordinateReferenceSystem crs = defaultCRS;