Hi Vittorio,

The example page is updated:
http://docs.geotools.org/latest/userguide/library/jts/snap.html

The page now links to 'live' code which you can access directly here:
http://svn.osgeo.org/geotools/trunk/docs/src/main/java/org/geotools/jts/SnapToLine.java

Note that there were a couple of minor problems in how the points were
being snapped in the original code. These should be fixed in the new
code.

Michael

On 3 November 2011 09:57, Michael Bedward <[email protected]> wrote:
> Hi Vittorio,
>
> Yes that looks good. I just tried it with a line shapefile and it
> actually managed to snap a few points :)
>
> I'll update the web page with this better code. Thanks for posting it.
>
> Michael
>
>
> On 2 November 2011 22:37, Vittorio.IT <[email protected]> wrote:
>> Hi Michael,
>>
>> after many many tests i solve the problem... I Hope :-)
>>
>> I get the solution using the latest geotools 8.0 with some fix
>>
>> first of all I used
>> org.geotools.data.FileDataStore;
>> to load the shapefile like the example on Quickstart
>>
>> second i push inside the library the follow api:
>>
>> gt-main, gt-api, gt-data,  gt-opengis,  off course
>> gt-shapefile and jts-1.8
>>
>> instead to  SimpleFeatureSource I used  FeatureSource
>>
>> Now I have to collect data and check if this function permit to fix the
>> accuracy of gps raw data and snap the postition to the correct road.
>>
>> Let me know what do you think about
>>
>> Thanks a lot
>>
>> Vittorio
>>
>>
>> import java.io.File;
>> import java.util.List;
>> import java.util.Random;
>>
>> import org.geotools.geometry.jts.ReferencedEnvelope;
>> import org.geotools.util.NullProgressListener;
>> import org.opengis.feature.Feature;
>> import org.opengis.feature.FeatureVisitor;
>> import org.opengis.feature.simple.SimpleFeature;
>>
>> import com.vividsolutions.jts.geom.Coordinate;
>> import com.vividsolutions.jts.geom.Envelope;
>> import com.vividsolutions.jts.geom.Geometry;
>> import com.vividsolutions.jts.geom.MultiLineString;
>> import com.vividsolutions.jts.index.SpatialIndex;
>> import com.vividsolutions.jts.index.strtree.STRtree;
>> import com.vividsolutions.jts.linearref.LinearLocation;
>> import com.vividsolutions.jts.linearref.LocationIndexedLine;
>> import org.geotools.data.FeatureSource;
>> import org.geotools.data.FileDataStore;
>> import org.geotools.data.FileDataStoreFinder;
>> import org.geotools.feature.FeatureCollection;
>>
>>
>> public class SnapToLine {
>>
>>    public static void main(String[] args) throws Exception {
>>
>>     *
>>      File file = new File("marche_highway.shp");
>>      FileDataStore store = FileDataStoreFinder.getDataStore(file);*
>>
>>
>>      System.out.println("Snapping against:"+file);
>>      FeatureSource source = store.getFeatureSource();
>>
>>
>>      final SpatialIndex index = new STRtree();
>>      FeatureCollection features = source.getFeatures();
>>        System.out.println("Slurping in features ...");
>>        features.accepts( new FeatureVisitor(){
>>            public void visit(Feature feature) {
>>                SimpleFeature simpleFeature = (SimpleFeature) feature;
>>                Geometry geom = (MultiLineString)
>> simpleFeature.getDefaultGeometry();
>>                Envelope bounds = geom.getEnvelopeInternal();
>>                if( bounds.isNull() ) return; // must be empty geometry?
>>                index.insert( bounds, new LocationIndexedLine( geom ));
>>            }
>>        }, new NullProgressListener() );
>>        final int DURATION = 6000;
>>        System.out.println("we now have our spatial index and are going to
>> snap for "+DURATION);
>>        ReferencedEnvelope limit = features.getBounds();
>>        Coordinate[] points = new Coordinate[10000];
>>        Random rand = new Random(file.hashCode());
>>        for( int i=0; i<10000;i++){
>>            points[i] = new Coordinate(
>>                    limit.getMinX()+rand.nextDouble()*limit.getWidth(),
>>                    limit.getMinY()+rand.nextDouble()*limit.getHeight()
>>            );
>>        }
>>        double distance = limit.getSpan(0) / 100.0;
>>        long now = System.currentTimeMillis();
>>        long then = now+DURATION;
>>        int count = 0;
>>        System.out.println("we now have our spatial index and are going to
>> snap for "+DURATION);
>>
>>        while( System.currentTimeMillis()<then){
>>            Coordinate pt = points[rand.nextInt(10000)];
>>            Envelope search = new Envelope(pt);
>>            search.expandBy(distance);
>>
>>            List&lt;LocationIndexedLine> hits = index.query( search );
>>            double d = Double.MAX_VALUE;
>>            Coordinate best = null;
>>            for( LocationIndexedLine line : hits ){
>>                LinearLocation here = line.project( pt );
>>                Coordinate point = line.extractPoint( here );
>>                double currentD = point.distance( pt );
>>                if( currentD < d ){
>>                    best = point;
>>                }
>>            }
>>            if( best == null ){
>>                // we did not manage to snap to a line? with real data sets
>> this happens all the time...
>>                System.out.println( pt + "-X");
>>            }
>>            else {
>>                System.out.println( pt + "->" + best );
>>            }
>>            count++;
>>        }
>>        System.out.println("snapped "+count+" times - and now I am tired");
>>        System.out.println("snapped "+count/DURATION+" per milli?");
>>    }
>> }
>>
>> --
>> View this message in context: 
>> http://osgeo-org.1803224.n2.nabble.com/newbie-Snap-a-Point-to-a-Line-problem-with-openstreetmap-shape-file-tp6951329p6954870.html
>> Sent from the geotools-gt2-users mailing list archive at Nabble.com.
>>
>> ------------------------------------------------------------------------------
>> RSA&#174; Conference 2012
>> Save $700 by Nov 18
>> Register now&#33;
>> http://p.sf.net/sfu/rsa-sfdev2dev1
>> _______________________________________________
>> Geotools-gt2-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users
>>
>

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to