Good catch - thanks. There is actually an existing method CoordinateSequences.reverse:
http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/CoordinateSequences.html#reverse(com.vividsolutions.jts.geom.CoordinateSequence) I'll try and implement a fix (and unit test!) ASAP. On Tue, Jul 28, 2015 at 4:51 AM, Tim O'Farrell <[email protected]> wrote: > package esgeomworkshopprofiler; > > > > import com.vividsolutions.jts.geom.CoordinateSequence; > > import com.vividsolutions.jts.geom.Geometry; > > import com.vividsolutions.jts.geom.GeometryFactory; > > import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory; > > import com.vividsolutions.jts.io.ParseException; > > import com.vividsolutions.jts.io.WKTReader; > > > > /** > > * > > * @author tofarrell > > */ > > public class BugExample { > > > > public static void main(String[] args) throws ParseException { > > > > //Create a geometry backed by a packed coordinate sequence - note > that the points are in the wrong order > > GeometryFactory factory = new > GeometryFactory(PackedCoordinateSequenceFactory.DOUBLE_FACTORY); > > WKTReader reader = new WKTReader(factory); > > Geometry geom = reader.read("LINESTRING (100 100, 0 0)"); > > > > // Normalize the geometry - there is a bug here - the normalize > method assumes that the geometry is backed > > // by a coordinate array. The soft reference to the coordinate > array in packed coordinate sequence masks > > // this issue > > geom.normalize(); > > > > // Create a clone of the geometry - the clone does not have the > changes made by normalize > > Geometry clone = (Geometry)geom.clone(); > > > > // The clone is not equal to the original > > if(!clone.toString().equals(geom.toString())){ > > throw new IllegalStateException("Clone was not the same as > original!!!"); > > } > > } > > > > //Proposed fix - replace normalize method in LineString.java > > > > CoordinateSequence points; // this variable is here only so that the > code will compile > > > > > > public void normalize() { > > for (int i = 0; i < points.size() / 2; i++) { > > int j = points.size() - 1 - i; > > // skip equal points on both ends > > if (!points.getCoordinate(i).equals(points.getCoordinate(j))) { > > if > (points.getCoordinate(i).compareTo(points.getCoordinate(j)) > 0) { > > reverse(points); > > } > > return; > > } > > } > > } > > > > /** > > * Reverse the order of coordinates in a sequence > > * @param sequence > > */ > > static void reverse(CoordinateSequence sequence){ > > int min = 0; > > int max = sequence.size()-1; > > while(min < max){ > > for(int i = sequence.getDimension(); i-- > 0;){ > > double tmp = sequence.getOrdinate(min, i); > > sequence.setOrdinate(min, i, sequence.getOrdinate(max, > i)); > > sequence.setOrdinate(max, i, tmp); > > } > > min++; > > max--; > > } > > } > > } > > > ------------------------------------------------------------------------------ > > _______________________________________________ > Jts-topo-suite-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/jts-topo-suite-user > >
------------------------------------------------------------------------------
_______________________________________________ Jts-topo-suite-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jts-topo-suite-user
