Fixed: https://sourceforge.net/p/jts-topo-suite/code/1013/
(SF commit comments seems borked, but the commited code looks right) On Tue, Jul 28, 2015 at 10:53 AM, Martin Davis <[email protected]> wrote: > 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
