brouter/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReader.java

226 lines
5.8 KiB
Java

package btools.routingapp;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import android.os.Environment;
import btools.router.OsmNodeNamed;
import btools.router.RoutingHelper;
/**
* Read coordinates from a gpx-file
*/
public abstract class CoordinateReader
{
public List<OsmNodeNamed> waypoints;
public List<OsmNodeNamed> nogopoints;
public String basedir;
public String rootdir;
public String tracksdir;
private boolean nogosOnly;
private Map<String,Map<String, OsmNodeNamed>> allpointsMap;
public List<OsmNodeNamed> allpoints;
private HashMap<String,OsmNodeNamed> pointmap;
protected static String[] posnames
= new String[]{ "from", "via1", "via2", "via3", "via4", "via5", "via6", "via7", "via8", "via9", "to" };
public CoordinateReader( String basedir )
{
this.basedir = basedir;
}
public abstract long getTimeStamp() throws Exception;
public abstract int getTurnInstructionMode();
public void readAllPoints() throws Exception
{
allpointsMap = new TreeMap<String, Map<String,OsmNodeNamed>>();
readFromTo();
allpoints = new ArrayList<OsmNodeNamed>();
Set<String> names = new HashSet<String>();
for( String category : allpointsMap.keySet() )
{
Map<String, OsmNodeNamed> cat = allpointsMap.get( category );
if ( cat.size() < 101 )
{
for ( OsmNodeNamed wp : cat.values() )
{
if ( names.add( wp.name ) )
{
allpoints.add( wp );
}
}
}
else
{
OsmNodeNamed nocatHint = new OsmNodeNamed();
nocatHint.name = "<big category " + category + " supressed>";
allpoints.add( nocatHint);
}
}
}
/*
* read the from, to and via-positions from a gpx-file
*/
public void readFromTo() throws Exception
{
pointmap = new HashMap<String,OsmNodeNamed>();
waypoints = new ArrayList<OsmNodeNamed>();
nogopoints = new ArrayList<OsmNodeNamed>();
readPointmap();
boolean fromToMissing = false;
for( int i=0; i<posnames.length; i++ )
{
String name = posnames[i];
OsmNodeNamed n = pointmap.get(name);
if ( n != null )
{
waypoints.add( n );
}
else
{
if ( "from".equals( name ) ) fromToMissing = true;
if ( "to".equals( name ) ) fromToMissing = true;
}
}
if ( fromToMissing ) waypoints.clear();
}
protected void checkAddPoint( String category, OsmNodeNamed n )
{
if ( allpointsMap != null )
{
if ( category == null ) category = "";
Map<String, OsmNodeNamed> cat = allpointsMap.get( category );
if ( cat == null )
{
cat = new TreeMap<String, OsmNodeNamed>();
allpointsMap.put( category, cat );
}
if ( cat.size() < 101 )
{
cat.put( n.name, n );
}
return;
}
boolean isKnown = false;
for( int i=0; i<posnames.length; i++ )
{
if ( posnames[i].equals( n.name ) )
{
isKnown = true;
break;
}
}
if ( isKnown )
{
if ( pointmap.put( n.name, n ) != null )
{
if ( !nogosOnly )
{
throw new IllegalArgumentException( "multiple " + n.name + "-positions!" );
}
}
}
else if ( n.name != null && n.name.startsWith( "nogo" ) )
{
n.isNogo = true;
nogopoints.add( n );
}
}
protected abstract void readPointmap() throws Exception;
public static CoordinateReader obtainValidReader( String basedir, String segmentDir ) throws Exception
{
return obtainValidReader( basedir, segmentDir, false );
}
public static CoordinateReader obtainValidReader( String basedir, String segmentDir, boolean nogosOnly ) throws Exception
{
CoordinateReader cor = null;
ArrayList<CoordinateReader> rl = new ArrayList<CoordinateReader>();
AppLogger.log( "adding standard maptool-base: " + basedir );
rl.add( new CoordinateReaderOsmAnd( basedir ) );
rl.add( new CoordinateReaderLocus( basedir ) );
rl.add( new CoordinateReaderOrux( basedir ) );
// eventually add standard-sd
File standardbase = Environment.getExternalStorageDirectory();
if ( standardbase != null )
{
String base2 = standardbase.getAbsolutePath();
if ( !base2.equals( basedir ) )
{
AppLogger.log( "adding internal sd maptool-base: " + base2 );
rl.add( new CoordinateReaderOsmAnd( base2 ) );
rl.add( new CoordinateReaderLocus( base2 ) );
rl.add( new CoordinateReaderOrux( base2 ) );
}
}
// eventually add explicit directory
File additional = RoutingHelper.getAdditionalMaptoolDir( segmentDir );
if ( additional != null )
{
String base3 = additional.getAbsolutePath();
AppLogger.log( "adding maptool-base from storage-config: " + base3 );
rl.add( new CoordinateReaderOsmAnd( base3 ) );
rl.add( new CoordinateReaderOsmAnd( base3, true ) );
rl.add( new CoordinateReaderLocus( base3 ) );
rl.add( new CoordinateReaderOrux( base3 ) );
}
long tmax = 0;
for ( CoordinateReader r : rl )
{
if ( AppLogger.isLogging() )
{
AppLogger.log( "reading timestamp at systime " + new Date() );
}
long t = r.getTimeStamp();
if ( t != 0 )
{
if ( AppLogger.isLogging() )
{
AppLogger.log( "found coordinate source at " + r.basedir + r.rootdir + " with timestamp " + new Date( t ) );
}
}
if ( t > tmax )
{
tmax = t;
cor = r;
}
}
if ( cor == null )
{
cor = new CoordinateReaderNone();
}
cor.nogosOnly = nogosOnly;
cor.readFromTo();
return cor;
}
}