I have an incorrect from the union of two Polygons. The first Polygon (g0) is created from a PackedCoordinateSequence. The second Polygon (g1) is created from a CoordinateArray.
The two Polygons are nearly on top of each other.
During the unioning process, 'OverlayOp.overlayOp' fails and so the code
defaults to 'SnapOverlayOp.overlayOp'.
In the subsequent code the removal of common bits using
'removeCommonBits(Geometry geom)' fails to successfully apply the translation
to the geometry created from (g0) PackedCoordinateSequence.
Subsequently the code unions the unshifted g0 geometry with the shifted g1
geometry, incorrectly producing a MultiPolygon.
Java test code attached (with plotting; please maximise Window)
I have copied some of the relevant method calls below.
Jim Kay
------------------------------------------------------------------------------------------
SnapIfNeededOverlayOp -> getResultGeometry(int opCode)
Normal:
result = OverlayOp.overlayOp(geom[0], geom[1], opCode);
Fails:
savedException = (com.vividsolutions.jts.geom.TopologyException)
com.vividsolutions.jts.geom.TopologyException: found non-noded intersection
between LINESTRING ( -0.08528230009449685 4.82017814227853, -0.110460580710986
4.81977663231897 ) and LINESTRING ( -0.0909282486242289 4.820088108149497,
-0.090682719052808 4.82011418579351 ) [ (-0.09092824862422651,
4.820088108149497, NaN) ]
If fails the alternative is:
result = SnapOverlayOp.overlayOp(geom[0], geom[1], opCode);
SnapOverlayOp.overlayOp(Geometry g0, Geometry g1, int opCode)
return op.getResultGeometry(opCode);
public Geometry getResultGeometry(int opCode)
Geometry[] prepGeom = snap(geom);
private Geometry[] snap(Geometry[] geom)
Geometry[] remGeom = removeCommonBits(geom);
private Geometry[] removeCommonBits(Geometry[] geom)
cbr commonCoord identified (0.0, 4.75)
remGeom[0] = cbr.removeCommonBits((Geometry) geom[0].clone());
public Geometry removeCommonBits(Geometry geom) // for g0
Translater trans = new Translater(invCoord); // setup (-0.0,
-4.75)
geom.apply(trans);
geom.geometryChanged();
return geom; // NO CHANGE IN COORDINATE VALUES FOR
g0 from PackedCoordinateSequence
remGeom[1] = cbr.removeCommonBits((Geometry) geom[1].clone());
public Geometry removeCommonBits(Geometry geom) // for g1
Translater trans = new Translater(invCoord); // setup (-0.0,
-4.75)
geom.apply(trans);
geom.geometryChanged();
return geom; // OK y values shifted down by 4.75
FOR g1
g0 created from PackedCoordinateSequence
POLYGON ((0.0100573988512497 4.78384542541783, 0.0254790503435339
4.7853680160678, 0.0257229583365779 4.8203671661845, -0.0432753661791916
4.82084801337078, -0.110460580710986 4.81977663231897, -0.125859513580305
4.81803925397127, -0.125615605587261 4.78304010385457, 0.0100573988512497
4.78384542541783))
g1 created from CoordinateArray
POLYGON ((-0.0852823000943891 4.820178142278531, -0.0432753661791916
4.82084801337078, -0.034111552138555 4.820784151034586, -0.0234947209409801
4.82090988483611, 0.0455036035747894 4.82042903764982, 0.0452596955817454
4.78542988753313, 0.0344169517745771 4.78443089375864, -0.101266578492074
4.78396502078076, -0.110216672717942 4.78477748220227, -0.110460580710986
4.81977663231897, -0.0909282486242289 4.820088108149497, -0.090682719052808
4.82011418579351, -0.0852823000943891 4.820178142278531))
Incorrect result
MULTIPOLYGON (((0.0100573988512497 9.53384542541783, -0.125615605587261
9.533040103854571, -0.125859513580305 9.568039253971271, -0.110460580710986
9.56977663231897, -0.0432753661791916 9.57084801337078, 0.0257229583365779
9.5703671661845, 0.0254790503435339 9.5353680160678, 0.0100573988512497
9.53384542541783)), ((-0.0852823000943891 4.820178142278531,
-0.0432753661791916 4.82084801337078, -0.034111552138555 4.820784151034586,
-0.0234947209409801 4.82090988483611, 0.0455036035747894 4.82042903764982,
0.0452596955817454 4.78542988753313, 0.0344169517745771 4.78443089375864,
-0.101266578492074 4.78396502078076, -0.110216672717942 4.78477748220227,
-0.110460580710986 4.81977663231897, -0.0909282486242289 4.820088108149497,
-0.090682719052808 4.82011418579351, -0.0852823000943891 4.820178142278531)))
Correct result
POLYGON ((0.0153233378632719 4.784365335331955, 0.0100573988512497
4.78384542541783, -0.125615605587261 4.78304010385457, -0.125859513580305
4.81803925397127, -0.110460580710986 4.81977663231897, -0.0909282486242289
4.820088108149497, -0.090682719052808 4.82011418579351, -0.0852823000943891
4.820178142278531, -0.0432753661791916 4.82084801337078, -0.034111552138555
4.820784151034586, -0.0234947209409801 4.82090988483611, 0.0455036035747894
4.82042903764982, 0.0452596955817454 4.78542988753313, 0.0344169517745771
4.78443089375864, 0.0153233378632719 4.784365335331955))
TestUnionError.java
Description: TestUnionError.java
------------------------------------------------------------------------------
_______________________________________________ Jts-topo-suite-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jts-topo-suite-user
