locationtech / spatial4j

LocationTech Spatial4j: A Geospatial Library for Java
https://projects.eclipse.org/projects/locationtech.spatial4j
934 stars 167 forks source link

Validation for self-intersection WKT Multipolygon fails at the WKTReader, while works when wrapped in a `GEOMETRYCOLLECTION` #232

Open seut opened 1 month ago

seut commented 1 month ago

Used version 0.8.

We encountered that parsing a WKT MultiPolygon containing a self-intersection works while it will raise a validation error when it is wrapped into a GEOMETRYCOLLECTION.

This code parses the WKT string into a valid MultiPolygon instance.

var reader = (WKTReader) JtsSpatialContext.GEO.getFormats().getWktReader();
var shape = reader.parse(''MULTIPOLYGON (((5 5, 10 5, 10 10, 5 5)), ((6 6, 10 5, 10 10, 6 6)))');

While this one raises a InvalidShapeException:

var reader = (WKTReader) JtsSpatialContext.GEO.getFormats().getWktReader();
var shape = reader.parse(''GEOMETRYCOLLECTION ( MULTIPOLYGON (((5 5, 10 5, 10 10, 5 5)), ((6 6, 10 5, 10 10, 6 6))) )');

Stacktrace:

Caused by: org.locationtech.spatial4j.exception.InvalidShapeException: Self-intersection at or near point (10.0, 5.0, NaN)
    at org.locationtech.spatial4j.shape.jts.JtsGeometry.validate(JtsGeometry.java:127)
    at org.locationtech.spatial4j.shape.jts.JtsShapeFactory.makeShapeFromGeometry(JtsShapeFactory.java:502)
    at org.locationtech.spatial4j.shape.jts.JtsShapeFactory.makeShapeFromGeometry(JtsShapeFactory.java:475)
    at org.locationtech.spatial4j.shape.jts.JtsShapeFactory$JtsMultiShapeBuilder.build(JtsShapeFactory.java:446)
    at org.locationtech.spatial4j.io.WKTReader.parseGeometryCollectionShape(WKTReader.java:356)
    at org.locationtech.spatial4j.io.WKTReader.parseShapeByType(WKTReader.java:165)
    at org.locationtech.spatial4j.io.WKTReader.parseIfSupported(WKTReader.java:110)
    at org.locationtech.spatial4j.io.WKTReader.parse(WKTReader.java:81)

I would expect that both variants behave the same.

dsmiley commented 1 month ago

I love the clear issue report; looks so ready to turn into a test. I confess I am lacking time to debug this but will be a reviewer.