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<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® 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 >> > ------------------------------------------------------------------------------ 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
