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 waypoints; public List nogopoints; public String basedir; public String rootdir; public String tracksdir; private boolean nogosOnly; private Map> allpointsMap; public List allpoints; private HashMap 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>(); readFromTo(); allpoints = new ArrayList(); Set names = new HashSet(); for( String category : allpointsMap.keySet() ) { Map 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 = ""; allpoints.add( nocatHint); } } } /* * read the from, to and via-positions from a gpx-file */ public void readFromTo() throws Exception { pointmap = new HashMap(); waypoints = new ArrayList(); nogopoints = new ArrayList(); readPointmap(); boolean fromToMissing = false; for( int i=0; i cat = allpointsMap.get( category ); if ( cat == null ) { cat = new TreeMap(); allpointsMap.put( category, cat ); } if ( cat.size() < 101 ) { cat.put( n.name, n ); } return; } boolean isKnown = false; for( int i=0; i rl = new ArrayList(); 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; } }