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))

Attachment: TestUnionError.java
Description: TestUnionError.java

------------------------------------------------------------------------------
_______________________________________________
Jts-topo-suite-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jts-topo-suite-user

Reply via email to