read NogoPolygons from OsmAnd Tracks
This commit is contained in:
parent
a0198e3b34
commit
41201520c7
4 changed files with 143 additions and 15 deletions
|
@ -29,8 +29,8 @@ public class OsmNogoPolygon extends OsmNodeNamed
|
||||||
{
|
{
|
||||||
public final static class Point
|
public final static class Point
|
||||||
{
|
{
|
||||||
final int y;
|
public final int y;
|
||||||
final int x;
|
public final int x;
|
||||||
|
|
||||||
Point(final int lon, final int lat)
|
Point(final int lon, final int lat)
|
||||||
{
|
{
|
||||||
|
|
|
@ -192,16 +192,20 @@ public final class RoutingContext
|
||||||
{
|
{
|
||||||
for( OsmNodeNamed nogo : nogos )
|
for( OsmNodeNamed nogo : nogos )
|
||||||
{
|
{
|
||||||
String s = nogo.name;
|
if (nogo instanceof OsmNogoPolygon)
|
||||||
int idx = s.indexOf( ' ' );
|
{
|
||||||
if ( idx > 0 ) s = s.substring( 0 , idx );
|
continue;
|
||||||
int ir = 20; // default radius
|
}
|
||||||
if ( s.length() > 4 )
|
String s = nogo.name;
|
||||||
{
|
int idx = s.indexOf( ' ' );
|
||||||
try { ir = Integer.parseInt( s.substring( 4 ) ); }
|
if ( idx > 0 ) s = s.substring( 0 , idx );
|
||||||
catch( Exception e ) { /* ignore */ }
|
int ir = 20; // default radius
|
||||||
}
|
if ( s.length() > 4 )
|
||||||
nogo.radius = ir / 110984.; // 6378000. / 57.3;
|
{
|
||||||
|
try { ir = Integer.parseInt( s.substring( 4 ) ); }
|
||||||
|
catch( Exception e ) { /* ignore */ }
|
||||||
|
}
|
||||||
|
nogo.radius = ir / 110984.; // 6378000. / 57.3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ import btools.expressions.BExpressionContextWay;
|
||||||
import btools.expressions.BExpressionMetaData;
|
import btools.expressions.BExpressionMetaData;
|
||||||
import btools.mapaccess.OsmNode;
|
import btools.mapaccess.OsmNode;
|
||||||
import btools.router.OsmNodeNamed;
|
import btools.router.OsmNodeNamed;
|
||||||
|
import btools.router.OsmNogoPolygon;
|
||||||
|
import btools.router.OsmNogoPolygon.Point;
|
||||||
import btools.router.OsmTrack;
|
import btools.router.OsmTrack;
|
||||||
import btools.router.RoutingContext;
|
import btools.router.RoutingContext;
|
||||||
import btools.router.RoutingEngine;
|
import btools.router.RoutingEngine;
|
||||||
|
@ -518,7 +520,7 @@ public class BRouterView extends View
|
||||||
scaleLon = scaleLat * coslat;
|
scaleLon = scaleLat * coslat;
|
||||||
|
|
||||||
startTime = System.currentTimeMillis();
|
startTime = System.currentTimeMillis();
|
||||||
rc.prepareNogoPoints( nogoList );
|
RoutingContext.prepareNogoPoints( nogoList );
|
||||||
rc.nogopoints = nogoList;
|
rc.nogopoints = nogoList;
|
||||||
|
|
||||||
rc.memoryclass = memoryClass;
|
rc.memoryclass = memoryClass;
|
||||||
|
@ -640,6 +642,41 @@ public class BRouterView extends View
|
||||||
canvas.drawCircle( (float) x, (float) y, (float) ir, paint );
|
canvas.drawCircle( (float) x, (float) y, (float) ir, paint );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void paintLine( Canvas canvas, final int ilon0, final int ilat0, final int ilon1, final int ilat1, final Paint paint )
|
||||||
|
{
|
||||||
|
final int lon0 = ilon0 - centerLon;
|
||||||
|
final int lat0 = ilat0 - centerLat;
|
||||||
|
final int lon1 = ilon1 - centerLon;
|
||||||
|
final int lat1 = ilat1 - centerLat;
|
||||||
|
final int x0 = imgw / 2 + (int) ( scaleLon * lon0 );
|
||||||
|
final int y0 = imgh / 2 - (int) ( scaleLat * lat0 );
|
||||||
|
final int x1 = imgw / 2 + (int) ( scaleLon * lon1 );
|
||||||
|
final int y1 = imgh / 2 - (int) ( scaleLat * lat1 );
|
||||||
|
canvas.drawLine( (float) x0, (float) y0, (float) x1, (float) y1, paint );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void paintPolygon( Canvas canvas, OsmNogoPolygon p, int minradius )
|
||||||
|
{
|
||||||
|
final int ir = (int) ( p.radius * 1000000. * scaleLat );
|
||||||
|
if ( ir > minradius )
|
||||||
|
{
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setColor( Color.RED );
|
||||||
|
paint.setStyle( Paint.Style.STROKE );
|
||||||
|
|
||||||
|
Point p0 = p.isClosed ? p.points.get(p.points.size()-1) : null;
|
||||||
|
|
||||||
|
for ( final Point p1 : p.points )
|
||||||
|
{
|
||||||
|
if (p0 != null)
|
||||||
|
{
|
||||||
|
paintLine( canvas, p0.x, p0.y, p1.x, p1.y, paint );
|
||||||
|
}
|
||||||
|
p0 = p1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onSizeChanged( int w, int h, int oldw, int oldh )
|
protected void onSizeChanged( int w, int h, int oldw, int oldh )
|
||||||
|
@ -824,8 +861,15 @@ public class BRouterView extends View
|
||||||
for ( int ngi = 0; ngi < nogoList.size(); ngi++ )
|
for ( int ngi = 0; ngi < nogoList.size(); ngi++ )
|
||||||
{
|
{
|
||||||
OsmNodeNamed n = nogoList.get( ngi );
|
OsmNodeNamed n = nogoList.get( ngi );
|
||||||
int color = 0xff0000;
|
if (n instanceof OsmNogoPolygon)
|
||||||
paintCircle( canvas, n, color, 4 );
|
{
|
||||||
|
paintPolygon( canvas, (OsmNogoPolygon)n, 4 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int color = 0xff0000;
|
||||||
|
paintCircle( canvas, n, color, 4 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Paint paint = new Paint();
|
Paint paint = new Paint();
|
||||||
|
|
|
@ -3,9 +3,15 @@ package btools.routingapp;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
import org.xmlpull.v1.XmlPullParserFactory;
|
||||||
|
|
||||||
import btools.router.OsmNodeNamed;
|
import btools.router.OsmNodeNamed;
|
||||||
|
import btools.router.OsmNogoPolygon;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read coordinates from a gpx-file
|
* Read coordinates from a gpx-file
|
||||||
|
@ -65,6 +71,13 @@ public class CoordinateReaderOsmAnd extends CoordinateReader
|
||||||
{
|
{
|
||||||
_readPointmap( osmandDir + "/favourites.gpx" );
|
_readPointmap( osmandDir + "/favourites.gpx" );
|
||||||
}
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_readNogoLines( basedir+tracksdir );
|
||||||
|
}
|
||||||
|
catch( IOException ioe )
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void _readPointmap( String filename ) throws Exception
|
private void _readPointmap( String filename ) throws Exception
|
||||||
|
@ -107,4 +120,71 @@ public class CoordinateReaderOsmAnd extends CoordinateReader
|
||||||
}
|
}
|
||||||
br.close();
|
br.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void _readNogoLines( String dirname ) throws IOException
|
||||||
|
{
|
||||||
|
|
||||||
|
File dir = new File( dirname );
|
||||||
|
|
||||||
|
if (dir.exists() && dir.isDirectory())
|
||||||
|
{
|
||||||
|
for (final File file : dir.listFiles())
|
||||||
|
{
|
||||||
|
final String name = file.getName();
|
||||||
|
if (name.startsWith("nogo") && name.endsWith(".gpx"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_readNogoLine(file);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _readNogoLine( File file ) throws Exception
|
||||||
|
{
|
||||||
|
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
|
||||||
|
factory.setNamespaceAware(false);
|
||||||
|
XmlPullParser xpp = factory.newPullParser();
|
||||||
|
|
||||||
|
xpp.setInput(new FileReader(file));
|
||||||
|
OsmNogoPolygon nogo = new OsmNogoPolygon(true);
|
||||||
|
int eventType = xpp.getEventType();
|
||||||
|
int numSeg = 0;
|
||||||
|
while (eventType != XmlPullParser.END_DOCUMENT) {
|
||||||
|
switch(eventType) {
|
||||||
|
case XmlPullParser.START_TAG: {
|
||||||
|
if (xpp.getName().equals("trkpt")) {
|
||||||
|
final String lon = xpp.getAttributeValue(null,"lon");
|
||||||
|
final String lat = xpp.getAttributeValue(null,"lat");
|
||||||
|
if (lon != null && lat != null) {
|
||||||
|
nogo.addVertex(
|
||||||
|
(int)( ( Double.parseDouble(lon) + 180. ) *1000000. + 0.5),
|
||||||
|
(int)( ( Double.parseDouble(lat) + 90. ) *1000000. + 0.5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case XmlPullParser.END_TAG: {
|
||||||
|
if (xpp.getName().equals("trkseg")) {
|
||||||
|
nogo.calcBoundingCircle();
|
||||||
|
final String name = file.getName();
|
||||||
|
nogo.name = name.substring(0, name.length()-4);
|
||||||
|
if (numSeg > 0)
|
||||||
|
{
|
||||||
|
nogo.name += Integer.toString(numSeg+1);
|
||||||
|
}
|
||||||
|
numSeg++;
|
||||||
|
checkAddPoint( "(one-for-all)", nogo );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eventType = xpp.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue