diff --git a/README.md b/README.md
index d64e0db5..a9327a2d 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@ The project is also available as a [Maven](http://maven.apache.org/) dependency:
com.esri.geometry
esri-geometry-api
- 2.2.4
+ 2.3.0
```
@@ -41,7 +41,7 @@ The project is also available as a [Maven](http://maven.apache.org/) dependency:
## Resources
-* [ArcGIS Geodata Resource Center]( http://resources.arcgis.com/en/communities/geodata/)
+* [ArcGIS Geodata Resource Center](http://resources.arcgis.com/en/communities/geodata/)
* [ArcGIS Blog](http://blogs.esri.com/esri/arcgis/)
* [twitter@esri](http://twitter.com/esri)
@@ -54,7 +54,7 @@ Find a bug or want to request a new feature? Please let us know by submitting a
Esri welcomes contributions from anyone and everyone. Please see our [guidelines for contributing](https://github.com/esri/contributing)
## Licensing
-Copyright 2013-2019 Esri
+Copyright 2013-2026 Esri
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/pom.xml b/pom.xml
old mode 100755
new mode 100644
index 34e8318d..7d015ac1
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
com.esri.geometry
esri-geometry-api
- 2.2.4
+ 2.3.0
jar
Esri Geometry API for Java
@@ -101,14 +101,23 @@
2.9.6
4.12
0.9
+ 7.0.0
2.3.1
2.2.1
3.0.0-M1
+ 3.3.0
+ 6.4.0
+
+ org.osgi
+ osgi.annotation
+ ${osgi.core.version}
+ provided
+
com.fasterxml.jackson.core
jackson-core
@@ -123,6 +132,12 @@
${junit.version}
test
+
+ org.mockito
+ mockito-core
+ 3.12.4
+ test
+
org.openjdk.jol
jol-core
@@ -151,12 +166,50 @@
- maven-compiler-plugin
- ${compiler.plugin.version}
-
- ${java.source.version}
- ${java.target.version}
-
+ maven-compiler-plugin
+ ${compiler.plugin.version}
+
+ ${java.source.version}
+ ${java.target.version}
+
+
+
+ biz.aQute.bnd
+ bnd-maven-plugin
+ ${bnd.version}
+
+
+
+ bnd-process
+
+
+
+
+
+ bnd.bnd
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${jar.plugin.version}
+
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+ true
+
org.apache.maven.plugins
diff --git a/src/main/java/com/esri/core/geometry/GeometryEngine.java b/src/main/java/com/esri/core/geometry/GeometryEngine.java
index 99466fd2..2ba61cf4 100644
--- a/src/main/java/com/esri/core/geometry/GeometryEngine.java
+++ b/src/main/java/com/esri/core/geometry/GeometryEngine.java
@@ -44,6 +44,7 @@ public class GeometryEngine {
/**
+ * @deprecated Use jsonToGeometry(String)
* Imports the MapGeometry from its JSON representation. M and Z values are
* not imported from JSON representation.
*
@@ -55,6 +56,7 @@ public class GeometryEngine {
* @return The MapGeometry instance containing the imported geometry and its
* spatial reference.
*/
+ @Deprecated
public static MapGeometry jsonToGeometry(JsonParser json) {
MapGeometry geom = OperatorImportFromJson.local().execute(Geometry.Type.Unknown, new JsonParserReader(json));
return geom;
@@ -95,11 +97,11 @@ public static MapGeometry jsonToGeometry(String json) {
}
/**
- * Exports the specified geometry instance to it's JSON representation.
+ * Exports the specified geometry instance to its JSON representation.
*
* See OperatorExportToJson.
*
- * @see GeometryEngine#geometryToJson(SpatialReference spatialiReference,
+ * @see GeometryEngine#geometryToJson(SpatialReference spatialReference,
* Geometry geometry)
* @param wkid
* The spatial reference Well Known ID to be used for the JSON
@@ -114,7 +116,7 @@ public static String geometryToJson(int wkid, Geometry geometry) {
}
/**
- * Exports the specified geometry instance to it's JSON representation. M
+ * Exports the specified geometry instance to its JSON representation. M
* and Z values are not imported from JSON representation.
*
* See OperatorExportToJson.
@@ -177,7 +179,7 @@ public static String geometryToGeoJson(int wkid, Geometry geometry) {
}
/**
- * Exports the specified geometry instance to it's JSON representation.
+ * Exports the specified geometry instance to its JSON representation.
*
* See OperatorImportFromGeoJson.
*
diff --git a/src/main/java/com/esri/core/geometry/JsonParserReader.java b/src/main/java/com/esri/core/geometry/JsonParserReader.java
index 90427c63..5313c0ab 100644
--- a/src/main/java/com/esri/core/geometry/JsonParserReader.java
+++ b/src/main/java/com/esri/core/geometry/JsonParserReader.java
@@ -27,9 +27,10 @@
import com.fasterxml.jackson.core.*;
/**
- * A throw in JsonReader built around the Jackson JsonParser.
- *
+ * @deprecated Intended for internal use by geometry-api-java only.
+ * A throw-in JsonReader built around Jackson.
*/
+@Deprecated
public class JsonParserReader implements JsonReader {
private JsonParser m_jsonParser;
@@ -46,7 +47,7 @@ public static JsonReader createFromString(String str) {
try {
JsonFactory factory = new JsonFactory();
JsonParser jsonParser = factory.createParser(str);
-
+
jsonParser.nextToken();
return new JsonParserReader(jsonParser);
}
@@ -168,4 +169,3 @@ else if (t == Token.VALUE_FALSE)
throw new JsonGeometryException("Not a boolean");
}
}
-
diff --git a/src/main/java/com/esri/core/geometry/OperatorBuffer.java b/src/main/java/com/esri/core/geometry/OperatorBuffer.java
index 93c71b02..4150a9f9 100644
--- a/src/main/java/com/esri/core/geometry/OperatorBuffer.java
+++ b/src/main/java/com/esri/core/geometry/OperatorBuffer.java
@@ -81,7 +81,7 @@ public abstract Geometry execute(Geometry inputGeometry,
*Note that max_deviation can be exceeded because geometry is generalized with 0.25 * real_deviation, also input segments closer than 0.25 * real_deviation are
*snapped to a point.
*/
- abstract GeometryCursor execute(GeometryCursor input_geometries, SpatialReference sr, double[] distances, double max_deviation, int max_vertices_in_full_circle, boolean b_union, ProgressTracker progress_tracker);
+ public abstract GeometryCursor execute(GeometryCursor input_geometries, SpatialReference sr, double[] distances, double max_deviation, int max_vertices_in_full_circle, boolean b_union, ProgressTracker progress_tracker);
public static OperatorBuffer local() {
return (OperatorBuffer) OperatorFactoryLocal.getInstance().getOperator(
diff --git a/src/main/java/com/esri/core/geometry/RelationalOperations.java b/src/main/java/com/esri/core/geometry/RelationalOperations.java
index abf03372..34fdd216 100644
--- a/src/main/java/com/esri/core/geometry/RelationalOperations.java
+++ b/src/main/java/com/esri/core/geometry/RelationalOperations.java
@@ -1609,7 +1609,7 @@ private static boolean polylineDisjointPolyline_(Polyline polyline_a,
PairwiseIntersectorImpl intersector_paths = new PairwiseIntersectorImpl(multi_path_impl_a, multi_path_impl_b, tolerance, true);
if (!intersector_paths.next())
- return false;
+ return true;
return !linearPathIntersectsLinearPath_(polyline_a, polyline_b,
tolerance);
diff --git a/src/main/java/com/esri/core/geometry/SpatialReference.java b/src/main/java/com/esri/core/geometry/SpatialReference.java
index 4c337e27..26e6c562 100644
--- a/src/main/java/com/esri/core/geometry/SpatialReference.java
+++ b/src/main/java/com/esri/core/geometry/SpatialReference.java
@@ -74,6 +74,7 @@ boolean isLocal() {
}
/**
+ * @deprecated Use fromJson(String)
* Returns spatial reference from the JsonParser.
*
* @param parser
@@ -83,6 +84,7 @@ boolean isLocal() {
* @throws Exception
* if parsing has failed
*/
+ @Deprecated
public static SpatialReference fromJson(JsonParser parser) throws Exception {
return fromJson(new JsonParserReader(parser));
}
diff --git a/src/main/java/com/esri/core/geometry/ogc/OGCGeometry.java b/src/main/java/com/esri/core/geometry/ogc/OGCGeometry.java
index 17ef2f8f..a6fdeaa9 100644
--- a/src/main/java/com/esri/core/geometry/ogc/OGCGeometry.java
+++ b/src/main/java/com/esri/core/geometry/ogc/OGCGeometry.java
@@ -466,6 +466,21 @@ public OGCGeometry buffer(double distance) {
return OGCGeometry.createFromEsriGeometry(cursor.next(), esriSR);
}
+ public OGCGeometry buffer(double distance, int max_vertices_in_full_circle, double max_deviation) {
+ OperatorBuffer op = (OperatorBuffer) OperatorFactoryLocal.getInstance()
+ .getOperator(Operator.Type.Buffer);
+ if (distance == 0) {// when distance is 0, return self (maybe we should
+ // create a copy instead).
+ return this;
+ }
+
+ double d[] = { distance };
+ com.esri.core.geometry.GeometryCursor cursor = op.execute(
+ getEsriGeometryCursor(), getEsriSpatialReference(), d, max_deviation, max_vertices_in_full_circle, true,
+ null);
+ return OGCGeometry.createFromEsriGeometry(cursor.next(), esriSR);
+ }
+
public OGCGeometry centroid() {
OperatorCentroid2D op = (OperatorCentroid2D) OperatorFactoryLocal.getInstance()
.getOperator(Operator.Type.Centroid2D);
diff --git a/src/main/java/com/esri/core/geometry/ogc/package-info.java b/src/main/java/com/esri/core/geometry/ogc/package-info.java
new file mode 100644
index 00000000..b6b69aa6
--- /dev/null
+++ b/src/main/java/com/esri/core/geometry/ogc/package-info.java
@@ -0,0 +1,19 @@
+/*
+ Copyright 2017-2023 Esri
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+@org.osgi.annotation.bundle.Export
+@org.osgi.annotation.versioning.Version("2.2.4")
+package com.esri.core.geometry.ogc;
diff --git a/src/main/java/com/esri/core/geometry/package-info.java b/src/main/java/com/esri/core/geometry/package-info.java
new file mode 100644
index 00000000..5a613f65
--- /dev/null
+++ b/src/main/java/com/esri/core/geometry/package-info.java
@@ -0,0 +1,19 @@
+/*
+ Copyright 2017-2023 Esri
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+@org.osgi.annotation.bundle.Export
+@org.osgi.annotation.versioning.Version("2.2.4")
+package com.esri.core.geometry;
diff --git a/src/test/java/com/esri/core/geometry/TestEnvelope1D.java b/src/test/java/com/esri/core/geometry/TestEnvelope1D.java
new file mode 100644
index 00000000..4ecd8cbc
--- /dev/null
+++ b/src/test/java/com/esri/core/geometry/TestEnvelope1D.java
@@ -0,0 +1,22 @@
+package com.esri.core.geometry;
+
+import junit.framework.TestCase;
+import org.junit.Test;
+public class TestEnvelope1D extends TestCase{
+ @Test
+ public void testCalculateToleranceFromEnvelopeEmpty() {
+ Envelope1D envelope = new Envelope1D();
+ envelope.setEmpty();
+ double tolerance = envelope._calculateToleranceFromEnvelope();
+ assertEquals(100.0 * NumberUtils.doubleEps(), tolerance, 0.0001);
+ }
+
+ @Test
+ public void testCalculateToleranceFromEnvelopeNonEmpty() {
+ Envelope1D envelope = new Envelope1D(2.0, 4.0);
+ double tolerance = envelope._calculateToleranceFromEnvelope();
+ assertEquals(2.220446049250313e-14, tolerance, 1e-10);
+ }
+
+
+}
diff --git a/src/test/java/com/esri/core/geometry/TestIndexHashTable.java b/src/test/java/com/esri/core/geometry/TestIndexHashTable.java
new file mode 100644
index 00000000..36ec75ac
--- /dev/null
+++ b/src/test/java/com/esri/core/geometry/TestIndexHashTable.java
@@ -0,0 +1,72 @@
+package com.esri.core.geometry;
+import org.junit.Test;
+import junit.framework.TestCase;
+public class TestIndexHashTable extends TestCase{
+ @Test
+ public void testAddElement() {
+ IndexHashTable.HashFunction hashFunction = new IndexHashTable.HashFunction() {
+ @Override
+ public int getHash(int element) {
+ return element % 10; // A simple hash function for testing
+ }
+
+ @Override
+ public boolean equal(int element1, int element2) {
+ return element1 == element2;
+ }
+
+ @Override
+ public int getHash(Object elementDescriptor) {
+ return ((Integer) elementDescriptor) % 10;
+ }
+
+ @Override
+ public boolean equal(Object elementDescriptor, int element) {
+ return ((Integer) elementDescriptor) == element;
+ }
+ };
+
+ IndexHashTable hashTable = new IndexHashTable(10, hashFunction);
+
+ int element1 = 5;
+
+ int node1 = hashTable.addElement(element1);
+
+ assertEquals(node1, hashTable.findNode(element1));
+ }
+
+ @Test
+ public void testDeleteElement() {
+ IndexHashTable.HashFunction hashFunction = new IndexHashTable.HashFunction() {
+ @Override
+ public int getHash(int element) {
+ return element % 10; // A simple hash function for testing
+ }
+
+ @Override
+ public boolean equal(int element1, int element2) {
+ return element1 == element2;
+ }
+
+ @Override
+ public int getHash(Object elementDescriptor) {
+ return ((Integer) elementDescriptor) % 10;
+ }
+
+ @Override
+ public boolean equal(Object elementDescriptor, int element) {
+ return ((Integer) elementDescriptor) == element;
+ }
+ };
+
+ IndexHashTable hashTable = new IndexHashTable(10, hashFunction);
+
+ int element1 = 5;
+
+ int node1 = hashTable.addElement(element1);
+
+ hashTable.deleteElement(element1);
+ assertEquals(IndexHashTable.nullNode(), hashTable.findNode(element1));
+ }
+
+}
diff --git a/src/test/java/com/esri/core/geometry/TestIntersect2.java b/src/test/java/com/esri/core/geometry/TestIntersect2.java
index 36860635..0254dcb8 100644
--- a/src/test/java/com/esri/core/geometry/TestIntersect2.java
+++ b/src/test/java/com/esri/core/geometry/TestIntersect2.java
@@ -25,6 +25,7 @@
package com.esri.core.geometry;
import com.esri.core.geometry.Geometry.Type;
+import com.esri.core.geometry.ogc.OGCGeometry;
import junit.framework.TestCase;
import org.junit.Test;
@@ -39,6 +40,16 @@ protected void tearDown() throws Exception {
super.tearDown();
}
+ @Test
+ public void testIntersectsLinestringAndMultilinestring() {
+ // https://github.com/Esri/geometry-api-java/issues/326
+ OGCGeometry line = OGCGeometry.fromText("LINESTRING(1 0, 1 1)");
+ OGCGeometry multiLine = OGCGeometry.fromText("MULTILINESTRING((0 0, 0 1), (2 0, 2 1))");
+
+ assertFalse(line.intersects(multiLine));
+ assertFalse(multiLine.intersects(line));
+ }
+
@Test
/**
* Intersect
diff --git a/src/test/java/com/esri/core/geometry/TestJSONUtils.java b/src/test/java/com/esri/core/geometry/TestJSONUtils.java
new file mode 100644
index 00000000..86a29aff
--- /dev/null
+++ b/src/test/java/com/esri/core/geometry/TestJSONUtils.java
@@ -0,0 +1,47 @@
+package com.esri.core.geometry;
+
+import org.junit.Test;
+import junit.framework.TestCase;
+import org.mockito.Mockito;
+public class TestJSONUtils extends TestCase{
+
+ @Test
+ public void testReadDoubleWithFloatValue() {
+ JsonReader parser = Mockito.mock(JsonReader.class);
+ Mockito.when(parser.currentToken()).thenReturn(JsonReader.Token.VALUE_NUMBER_FLOAT);
+ Mockito.when(parser.currentDoubleValue()).thenReturn(3.14);
+
+ double result = JSONUtils.readDouble(parser);
+ assertEquals(3.14, result, 0.0001);
+ }
+
+ @Test
+ public void testReadDoubleWithIntValue() {
+ JsonReader parser = Mockito.mock(JsonReader.class);
+ Mockito.when(parser.currentToken()).thenReturn(JsonReader.Token.VALUE_NUMBER_INT);
+ Mockito.when(parser.currentIntValue()).thenReturn(42);
+
+ double result = JSONUtils.readDouble(parser);
+ assertEquals(42.0, result, 0.0001);
+ }
+
+ @Test
+ public void testReadDoubleWithNullValue() {
+ JsonReader parser = Mockito.mock(JsonReader.class);
+ Mockito.when(parser.currentToken()).thenReturn(JsonReader.Token.VALUE_NULL);
+
+ double result = JSONUtils.readDouble(parser);
+ assertTrue(Double.isNaN(result));
+ }
+
+ @Test
+ public void testReadDoubleWithNaNString() {
+ JsonReader parser = Mockito.mock(JsonReader.class);
+ Mockito.when(parser.currentToken()).thenReturn(JsonReader.Token.VALUE_STRING);
+ Mockito.when(parser.currentString()).thenReturn("NaN");
+
+ double result = JSONUtils.readDouble(parser);
+ assertTrue(Double.isNaN(result));
+ }
+
+}