Hi, > I placed counter like this > > paths = new ArrayList();; > count = 0; > for (Iterator i = fc.getFeatures().iterator(); i.hasNext();) { > Feature feature = (Feature) i.next(); > LineString lineString = (LineString)feature.getGeometry(); > URL url; > try { > ...SNIP... > > br.close(); > if (count++ > 5) break; > > } catch (MalformedURLException e) { > e.printStackTrace(); > } catch (IOException e) { > e.printStackTrace(); > } > } > fc.addAll(paths); > } > > I am not sure if the place is correct but it seems to limit how many > linestrings are handled. However, I am not sure if the routing solutions are > coming in the same order than the legs to route if they are digitized as A-B, > B-C, C-D, D-E etc. Yes place is correct. Putting test before or after stream parsing depends on whether you want to count failures happening during parsing process or not. What is the order of features returned by fc.getFeatures().iterator() is a good question. I think iterator will return them in the same order they have been digitized because FeatureCollection is backed by an ArrayList which is an ordered array of features, but the contract of fc.getFeatures().iterator() do not guarantee anything about the order. You can test this way : print(feature.getID());
> The initial script is actually also by you. You made it a few years ago for > building Web Coverage Service requests. Oh, I did not remember, glad to know it has a second life ;-) Michaël > > -Jukka- > ________________________________________ > Michaël Michaud wrote: > >> Hi, >>> Thanks a lot for the improvements. However, I would like to ask you to >>> help with one more fix. Now the script fires the requests automatically and >>> it is dangerous if user has selected a layer with thousands of features. >>> Could you show how to limit the maximum number of requests to 10? Generally >>> it is good to be able to do several routings at a time because it gives a >>> simple way for the user to use interim fixed route points by digitizing the >>> route as connected lines but I think that 10 legs should be enough. >> I see, >> In your initial script, there was a counter. >> I removed it, but you can add it again and use it this way. >> count = 0; >> for (Iterator it = ....) { > if (count++ > 10) break; > } > >> Also an improvement I was too lazy to do is to put result in >> a new layer... >> Michaël > -Jukka Rahkonen- Michaël Michaud wrote: >>> Hi Jukka, >>> >>> Good job, >>> >>> With a few more lines, you can get the path in your map (hereafter, kml >>> parsing is very crude, but it shows how powerful beanshell scripting can >>> be). >>> >>> { >>> import com.vividsolutions.jts.geom.*; >>> import com.vividsolutions.jts.io.WKTReader; >>> import com.vividsolutions.jump.feature.*; >>> import com.vividsolutions.jump.geom.EnvelopeUtil; >>> import com.vividsolutions.jump.workbench.model.*; >>> import java.io.*; >>> import java.net.URL; >>> >>> fc = >>> wc.getLayerNamePanel().getSelectedLayers()[0].getFeatureCollectionWrap >>> per(); >>> paths = new ArrayList();; >>> for (Iterator i = fc.getFeatures().iterator(); i.hasNext();) { >>> Feature feature = (Feature) i.next(); >>> LineString lineString = (LineString)feature.getGeometry(); >>> URL url; >>> try { >>> // get URL content >>> url = new >>> URL("http://www.yournavigation.org/api/1.0/gosmore.php?format=kml&fla >>> t=" >>> +lineString.getStartPoint().getY()+"&flon=" >>> +lineString.getStartPoint().getX()+"&tlat=" >>> +lineString.getEndPoint().getY()+"&tlon=" >>> +lineString.getEndPoint().getX() >>> +"&v=motorcar" >>> +"&fast=1" >>> +"&layer=mapnik"); >>> print(url); >>> URLConnection conn = url.openConnection(); >>> >>> // open the stream and put it into BufferedReader >>> BufferedReader br = new BufferedReader( >>> new >>> InputStreamReader(conn.getInputStream())); >>> String inputLine; >>> StringBuffer sb = new StringBuffer(); >>> while ((inputLine = br.readLine()) != null) { >>> sb.append(inputLine).append("\n"); >>> } >>> wkt = sb.toString() >>> .replaceAll("(?s).*<coordinates>\\s*", "LINESTRING(") >>> .replaceAll("(?s)\\s*</coordinates>.*", ")") >>> .replaceAll("(?s)\\s+", "@") >>> .replaceAll("(?s),", " ") >>> .replaceAll("(?s)@", ","); >>> print(wkt); >>> bf = new BasicFeature(fc.getFeatureSchema()); >>> bf.setGeometry(new WKTReader().read(wkt)); >>> paths.add(bf); >>> >>> br.close(); >>> >>> } catch (MalformedURLException e) { >>> e.printStackTrace(); >>> } catch (IOException e) { >>> e.printStackTrace(); >>> } >>> } >>> fc.addAll(paths); >>> } >>> >>> >>> >>> Michaël >>> >>> >>>> Hi, >>>> >>>> Here is a demo script which finds route from the service or >>> yournavigation.org. Save the following code into lib\ext\BeanTools, draw >>> one or more lines with OpenJUMP by using EPSG:4326 system, run the tool >>> and copy the URLs from the result window into browser and you will get the >>> routes in KML format. Script creates a request which follows the YOURS >>> syntax http://wiki.openstreetmap.org/wiki/YOURS and it is simple to modify >>> to use other YOURS parameters. I also made another version which is getting >>> routes from the service of the Helsinki Region Traffic and it works fine >>> too. >>>> With a little bit of work it should be possible to make an OpenJUMP routing >>> service plugin. Creating a request is easy but a very good plugin should be >>> able to handle coordinate conversions between OJ project coordinate >>> system and the one used by the routing service. And then OpenJUMP should >>> be able to parse the returning route which is typically in GPX or KML >>> format. >>> However, I tested also a workaround by using GDAL in between. OpenJUMP >>> can create a ogr2ogr request and ogr2ogr can save the result as a shapefile >>> and possibly converted into another projection. >>>> >>>> Get_YOURS_Route.bsh >>>> ============== >>>> { >>>> import com.vividsolutions.jts.geom.*; >>>> import com.vividsolutions.jump.feature.*; >>>> import com.vividsolutions.jump.geom.EnvelopeUtil; >>>> import com.vividsolutions.jump.workbench.model.*; >>>> >>>> htmlFrame = wc.workbench.frame.outputFrame; >>>> htmlFrame.createNewDocument(); >>>> htmlFrame.setTitle("Output for gdal_translate"); >>>> fc = >>> wc.getLayerNamePanel().getSelectedLayers()[0].getFeatureCollectionWrap >>> per(); >>>> int j=1; >>>> for (Iterator i = fc.getFeatures().iterator(); i.hasNext();) { >>>> Feature feature = (Feature) i.next(); >>>> LineString lineString = >>>> (LineString)feature.getGeometry(); >>>> >>> htmlFrame.addText("http://www.yournavigation.org/api/1.0/gosmore.php? >>> format=kml&flat=" >>>> +lineString.getStartPoint().getY()+"&flon=" >>>> +lineString.getStartPoint().getX()+"&tlat=" >>>> +lineString.getEndPoint().getY()+"&tlon=" >>>> +lineString.getEndPoint().getX() >>>> +"&v=motorcar" >>>> +"&fast=1" >>>> +"&layer=mapnik"); >>>> j++; >>>> } >>>> wc.workbench.frame.flash(htmlFrame); >>>> htmlFrame.surface(); >>>> } >>>> >>>> >>>> With small modifications the script works with the routing service of >>>> the Helsinki Region Traffic. Coordinates must be in EPSG:2392 system. >>>> Can be tested for example with LINESTRING (2538008.7818696885 >>>> 6679830.130311615, 2538096.0339943343 6679899.818696884) >>>> >>>> >>>> >>>> >>> htmlFrame.addText("\"http://pk.hsl.fi/getroute/?format=gpx&profile=klero >>> weighted&from=location*Koordinaatti[" >>>> +lineString.getStartPoint().getX()+", " >>>> +lineString.getStartPoint().getY()+"]" >>>> +"*"+lineString.getStartPoint().getX() >>>> +"*"+lineString.getStartPoint().getY() >>>> +"&to=location*Koordinaatti[" >>>> +lineString.getEndPoint().getX()+", " >>>> +lineString.getEndPoint().getY()+"]" >>>> +"*"+lineString.getEndPoint().getX() >>>> +"*"+lineString.getEndPoint().getY() >>>> +"\"" ); >>>> >>>> >>>> >>>> -Jukka- >>>> >>>> ________________________________________ >>>> Michaël Michaud wrote: >>>> >>>> >>>>> Hi Jukka, >>>>> You can easily pick start and end point with Geometry geometry = >>>>> feature.getGeometry(); >>>> // this will return something whatever the geometry is Coordinate[] cc >>>> = geometry.getCoordinates(); x_start = cc[0].x; y_start = cc[0].y; >>>> x_end = cc[cc.length-1].x; y_end = cc[cc.length-1].y; >>>> >>>> // this is more readable if you make sure your geometry is a >>>> linestring before LineString lineString = >>>> (LineString)feature.getGeometry(); >>>> x_start = lineString.getStartPoint().getX(); >>>> y_start = lineString.getStartPoint().getY(); >>>> x_end = lineString.getEndPoint().getX(); y_end = >>>> lineString.getEndPoint().getX(); >>>> >>>>> Warning : I did not check the code >>>>> Michaël >>>>> PS let us know what you achieved with this code >>>>>> Hi, >>>>>> >>>>>> How could I pick Startpoint_X, Startpoint_Y, Endpoint_X,Endpoint_Y >>> from a linestring with BeanShell? Meaning is to build a http request for an >>> external routing service. Something similar is done in the following code >>> with >>> envelope of a geometry for building a WFS GetFeature request with BBOX >>> filter. >>>>>> Geometry geometry = feature.getGeometry(); >>>>>> Envelope env = geometry.getEnvelopeInternal(); >>>>>> htmlFrame.addText("wget " >>>>>> +"\"http://hip.latuviitta.org/cgi-bin/" >>>>>> +"tinyows?" >>>>>> +"SERVICE=WFS" >>>>>> +"&VERSION=1.0.0" >>>>>> +"&REQUEST=GetFeature" >>>>>> +"&TYPENAME=lv:municipalities" >>>>>> +"&BBOX=" >>>>>> +env.getMinX()+"," >>>>>> +env.getMinY()+"," >>>>>> +env.getMaxX()+"," >>>>>> +env.getMaxY()+"\"" >>>>>> +" -O prexif_" >>>>>> +j >>>>>> +".gml" ); >>>>>> >>>>>> -Jukka Rahkonen- >>>>> --------------------------------------------------------------------- >>>>> --------- Own the Future-Intel® Level Up Game Demo Contest 2013 >>>>> Rise to greatness in Intel's independent game demo contest. >>>>> Compete for recognition, cash, and the chance to get your game on >>>>> Steam. $5K grand prize plus 10 genre and skill prizes. >>>>> Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d >>>>> _______________________________________________ >>>>> Jump-pilot-devel mailing list >>>>> Jump-pilot-devel@lists.sourceforge.net >>>>> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>>> >>>>> >>>> ---------------------------------------------------------------------- >>>> -------- Own the Future-Intel® Level Up Game Demo Contest 2013 >>>> Rise to greatness in Intel's independent game demo contest. >>>> Compete for recognition, cash, and the chance to get your game on >>>> Steam. $5K grand prize plus 10 genre and skill prizes. >>>> Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d >>>> _______________________________________________ >>>> Jump-pilot-devel mailing list >>>> Jump-pilot-devel@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>> >>>> ---------------------------------------------------------------------- >>>> -------- Own the Future-Intel® Level Up Game Demo Contest 2013 >>>> Rise to greatness in Intel's independent game demo contest. >>>> Compete for recognition, cash, and the chance to get your game on >>>> Steam. $5K grand prize plus 10 genre and skill prizes. >>>> Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d >>>> _______________________________________________ >>>> Jump-pilot-devel mailing list >>>> Jump-pilot-devel@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >>>> >>>> >>> ------------------------------------------------------------------------------ >>> Own the Future-Intel® Level Up Game Demo Contest 2013 Rise to >>> greatness in Intel's independent game demo contest. >>> Compete for recognition, cash, and the chance to get your game on Steam. >>> $5K grand prize plus 10 genre and skill prizes. >>> Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d >>> _______________________________________________ >>> Jump-pilot-devel mailing list >>> Jump-pilot-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >> ------------------------------------------------------------------------------ >> Own the Future-Intel(R) Level Up Game Demo Contest 2013 >> Rise to greatness in Intel's independent game demo contest. Compete >> for recognition, cash, and the chance to get your game on Steam. >> $5K grand prize plus 10 genre and skill prizes. Submit your demo >> by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2 >> _______________________________________________ >> Jump-pilot-devel mailing list >> Jump-pilot-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel >> >> > > ------------------------------------------------------------------------------ > Minimize network downtime and maximize team effectiveness. > Reduce network management and security costs.Learn how to hire > the most talented Cisco Certified professionals. Visit the > Employer Resources Portal > http://www.cisco.com/web/learning/employer_resources/index.html > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > ------------------------------------------------------------------------------ > Minimize network downtime and maximize team effectiveness. > Reduce network management and security costs.Learn how to hire > the most talented Cisco Certified professionals. Visit the > Employer Resources Portal > http://www.cisco.com/web/learning/employer_resources/index.html > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > ------------------------------------------------------------------------------ Minimize network downtime and maximize team effectiveness. Reduce network management and security costs.Learn how to hire the most talented Cisco Certified professionals. Visit the Employer Resources Portal http://www.cisco.com/web/learning/employer_resources/index.html _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel