226 lines
5.8 KiB
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;
|
|
}
|
|
}
|