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

Reply via email to