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

Reply via email to