prepare renderer staff
git-svn-id: https://osmand.googlecode.com/svn/trunk@410 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
3920d390f4
commit
351d28408a
8 changed files with 124 additions and 22 deletions
|
@ -8,20 +8,17 @@ package com.osmand;
|
|||
*/
|
||||
public class ToDoConstants {
|
||||
|
||||
|
||||
|
||||
// TODO
|
||||
// 77. Implement upload gps track onto osm server (? not implemented yet on OSM?)
|
||||
// 78. Add ruler to the main tile view
|
||||
// 78. Add ruler to the main tile view (100m, 200m,...)
|
||||
// 80. Export/import favorite points
|
||||
// 81. Add some objects to POI to help navigation (
|
||||
// highway (?), traffic_calming (?), barrier(?), military(?-), landuse (?), office(?), man_made(?), power(?).
|
||||
// 82. Add overzoom +2 for Mapnik
|
||||
// 83. Add monitoring service to internet (?)
|
||||
// 83. Add monitoring service to send locations to internet (?)
|
||||
|
||||
// Improvements
|
||||
// 5. Download with wget
|
||||
// 6. progress while map is loading
|
||||
// ! Download with wget
|
||||
// ! progress while map is loading
|
||||
|
||||
// Not clear if it is really needed
|
||||
// 69. Add phone information to POI
|
||||
|
@ -47,6 +44,8 @@ public class ToDoConstants {
|
|||
// DONE ANDROID :
|
||||
// 64. Traffic information - yandex traffic
|
||||
// 79. Download any WMS layer and add to swing version (add tile manager ${x}, ${y}, ${z} to swing and to android)
|
||||
// 77. Implement upload gps track onto osm server (? not implemented yet on OSM?) -
|
||||
// not really needed, because gps tracks should be prepared before loading to OSM (OSM is not ready for it)
|
||||
|
||||
// DONE SWING
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ public class IndexConstants {
|
|||
public final static int TRANSPORT_TABLE_VERSION = 0;
|
||||
public final static int POI_TABLE_VERSION = 0;
|
||||
public final static int ADDRESS_TABLE_VERSION = 1;
|
||||
public final static int MAP_TABLE_VERSION = 0;
|
||||
|
||||
public static final String POI_INDEX_DIR = "POI/"; //$NON-NLS-1$
|
||||
public static final String ADDRESS_INDEX_DIR = "Address/"; //$NON-NLS-1$
|
||||
|
@ -15,10 +16,13 @@ public class IndexConstants {
|
|||
public static final String POI_INDEX_EXT = ".poi.odb"; //$NON-NLS-1$
|
||||
public static final String ADDRESS_INDEX_EXT = ".addr.odb"; //$NON-NLS-1$
|
||||
public static final String TRANSPORT_INDEX_EXT = ".trans.odb"; //$NON-NLS-1$
|
||||
public static final String MAP_INDEX_EXT = ".map.odb"; //$NON-NLS-1$
|
||||
|
||||
public static final String POI_INDEX_EXT_ZIP = ".poi.zip"; //$NON-NLS-1$
|
||||
public static final String ADDRESS_INDEX_EXT_ZIP = ".addr.zip"; //$NON-NLS-1$
|
||||
public static final String TRANSPORT_INDEX_EXT_ZIP = ".trans.zip"; //$NON-NLS-1$
|
||||
public static final String MAP_INDEX_EXT_ZIP = ".map.zip"; //$NON-NLS-1$
|
||||
|
||||
|
||||
public interface IndexColumn {
|
||||
public boolean isIndex();
|
||||
|
|
|
@ -42,6 +42,7 @@ import com.osmand.data.Street;
|
|||
import com.osmand.data.TransportRoute;
|
||||
import com.osmand.data.TransportStop;
|
||||
import com.osmand.data.City.CityType;
|
||||
import com.osmand.data.index.IndexConstants;
|
||||
import com.osmand.impl.ConsoleProgressImplementation;
|
||||
import com.osmand.osm.Entity;
|
||||
import com.osmand.osm.LatLon;
|
||||
|
@ -93,7 +94,8 @@ public class DataExtraction {
|
|||
private static final Log log = LogFactory.getLog(DataExtraction.class);
|
||||
|
||||
public static final int BATCH_SIZE = 5000;
|
||||
public static final String NODES_DB = "nodes.db";
|
||||
public static final String TEMP_NODES_DB = "nodes"+IndexConstants.MAP_INDEX_EXT;
|
||||
|
||||
|
||||
private final boolean loadAllObjects;
|
||||
private final boolean normalizeStreets;
|
||||
|
@ -132,15 +134,27 @@ public class DataExtraction {
|
|||
private Connection conn;
|
||||
|
||||
private boolean preloadRelationAndWaysIntoDB = false;
|
||||
private boolean createWholeOsmDB = false;
|
||||
|
||||
int currentCountNode = 0;
|
||||
private PreparedStatement prepNode;
|
||||
int currentRelationsCount = 0;
|
||||
private PreparedStatement prepRelations;
|
||||
int currentWaysCount = 0;
|
||||
private PreparedStatement prepWays;
|
||||
int currentTagsCount = 0;
|
||||
private PreparedStatement prepTags;
|
||||
private final String regionName;
|
||||
private File dbFile;
|
||||
|
||||
|
||||
public DataExtractionOsmFilter(String regionName) {
|
||||
this.regionName = regionName;
|
||||
}
|
||||
|
||||
public DataExtractionOsmFilter() {
|
||||
createWholeOsmDB = false;
|
||||
this.regionName = null;
|
||||
}
|
||||
|
||||
public ArrayList<Node> getPlaces() {
|
||||
|
@ -170,31 +184,39 @@ public class DataExtraction {
|
|||
log.error("Illegal configuration", e);
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
|
||||
File file = new File(workingDir, NODES_DB);
|
||||
if(createWholeOsmDB){
|
||||
dbFile = new File(workingDir, regionName+IndexConstants.MAP_INDEX_EXT);
|
||||
} else {
|
||||
dbFile = new File(workingDir, TEMP_NODES_DB);
|
||||
}
|
||||
// to save space
|
||||
if(file.exists()){
|
||||
file.delete();
|
||||
if(dbFile.exists()){
|
||||
dbFile.delete();
|
||||
}
|
||||
// creating nodes db to fast access for all nodes
|
||||
conn = DriverManager.getConnection("jdbc:sqlite:" + file.getAbsolutePath());
|
||||
conn = DriverManager.getConnection("jdbc:sqlite:" + dbFile.getAbsolutePath());
|
||||
|
||||
// prepare tables
|
||||
Statement stat = conn.createStatement();
|
||||
stat.executeUpdate("drop table if exists node;");
|
||||
stat.executeUpdate("create table node (id long, latitude double, longitude double);");
|
||||
stat.executeUpdate("create index IdIndex ON node (id);");
|
||||
stat.executeUpdate("create index IdIndex ON node (id, latitude, longitude);");
|
||||
stat.executeUpdate("drop table if exists ways;");
|
||||
stat.executeUpdate("create table ways (id long, node long);");
|
||||
stat.executeUpdate("create index IdWIndex ON ways (id);");
|
||||
stat.executeUpdate("create index IdWIndex ON ways (id, node);");
|
||||
stat.executeUpdate("drop table if exists relations;");
|
||||
stat.executeUpdate("create table relations (id long, member long, type byte, role text);");
|
||||
stat.executeUpdate("create index IdRIndex ON relations (id);");
|
||||
stat.executeUpdate("create index IdRIndex ON relations (id, member, type);");
|
||||
stat.executeUpdate("drop table if exists tags;");
|
||||
stat.executeUpdate("create table tags (id long, type byte, key, value);");
|
||||
stat.executeUpdate("create index IdTIndex ON tags (id, type);");
|
||||
stat.execute("PRAGMA user_version = " + IndexConstants.MAP_TABLE_VERSION); //$NON-NLS-1$
|
||||
stat.close();
|
||||
|
||||
prepNode = conn.prepareStatement("insert into node values (?, ?, ?);");
|
||||
prepWays = conn.prepareStatement("insert into ways values (?, ?);");
|
||||
prepRelations = conn.prepareStatement("insert into relations values (?, ?, ?, ?);");
|
||||
prepTags = conn.prepareStatement("insert into tags values (?, ?, ?, ?);");
|
||||
preloadRelationAndWaysIntoDB = indexTransport;
|
||||
conn.setAutoCommit(false);
|
||||
}
|
||||
|
@ -212,6 +234,10 @@ public class DataExtraction {
|
|||
prepRelations.executeBatch();
|
||||
}
|
||||
prepRelations.close();
|
||||
if (currentTagsCount > 0) {
|
||||
prepTags.executeBatch();
|
||||
}
|
||||
prepTags.close();
|
||||
conn.setAutoCommit(true);
|
||||
|
||||
final PreparedStatement pselectNode = conn.prepareStatement("select * from node where id = ?");
|
||||
|
@ -281,7 +307,9 @@ public class DataExtraction {
|
|||
if (conn != null) {
|
||||
try {
|
||||
conn.close();
|
||||
new File(workingDir, NODES_DB).delete();
|
||||
if(!createWholeOsmDB){
|
||||
dbFile.delete();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
}
|
||||
|
@ -351,7 +379,7 @@ public class DataExtraction {
|
|||
prepNode.executeBatch();
|
||||
currentCountNode = 0;
|
||||
}
|
||||
} else if(preloadRelationAndWaysIntoDB) {
|
||||
} else if(preloadRelationAndWaysIntoDB || createWholeOsmDB) {
|
||||
if (e instanceof Way) {
|
||||
for(Long i : ((Way)e).getNodeIds()){
|
||||
currentWaysCount ++;
|
||||
|
@ -378,6 +406,20 @@ public class DataExtraction {
|
|||
}
|
||||
}
|
||||
}
|
||||
if(createWholeOsmDB){
|
||||
for(Entry<String,String> i : e.getTags().entrySet()){
|
||||
currentTagsCount ++;
|
||||
prepTags.setLong(1, e.getId());
|
||||
prepTags.setLong(2, EntityType.valueOf(e).ordinal());
|
||||
prepTags.setString(3, i.getKey());
|
||||
prepTags.setString(4, i.getValue());
|
||||
prepTags.addBatch();
|
||||
}
|
||||
if (currentTagsCount >= BATCH_SIZE) {
|
||||
prepTags.executeBatch();
|
||||
currentTagsCount = 0;
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
log.error("Could not save in db", ex);
|
||||
}
|
||||
|
@ -390,6 +432,9 @@ public class DataExtraction {
|
|||
public Region readCountry(String path, IProgress progress, IOsmStorageFilter addFilter) throws IOException, SAXException, SQLException{
|
||||
File f = new File(path);
|
||||
InputStream stream = new FileInputStream(f);
|
||||
int i = f.getName().indexOf('.');
|
||||
String regionName = Algoritms.capitalizeFirstLetterAndLowercase(f.getName().substring(0, i));
|
||||
|
||||
InputStream streamFile = stream;
|
||||
long st = System.currentTimeMillis();
|
||||
if (path.endsWith(".bz2")) {
|
||||
|
@ -409,7 +454,7 @@ public class DataExtraction {
|
|||
storage.getFilters().add(addFilter);
|
||||
}
|
||||
|
||||
DataExtractionOsmFilter filter = new DataExtractionOsmFilter();
|
||||
DataExtractionOsmFilter filter = new DataExtractionOsmFilter(regionName);
|
||||
// data to load & index
|
||||
final ArrayList<Node> places = filter.getPlaces();
|
||||
final ArrayList<Entity> buildings = filter.getBuildings();
|
||||
|
@ -444,8 +489,8 @@ public class DataExtraction {
|
|||
|
||||
// 1. Initialize region
|
||||
Region country = new Region();
|
||||
int i = f.getName().indexOf('.');
|
||||
country.setName(Algoritms.capitalizeFirstLetterAndLowercase(f.getName().substring(0, i)));
|
||||
|
||||
country.setName(regionName);
|
||||
country.setStorage(storage);
|
||||
|
||||
// 2. Reading amenities
|
||||
|
|
|
@ -27,6 +27,8 @@ amenity_type_transportation = Transportation
|
|||
|
||||
indexing_address = Indexing address
|
||||
|
||||
indexing_map = Indexing map
|
||||
|
||||
indexing_poi = Indexing POI
|
||||
|
||||
indexing_transport = Indexing transport
|
||||
|
|
|
@ -19,7 +19,7 @@ amenity_type_shop = Einkaufen
|
|||
|
||||
amenity_type_sport = Sport
|
||||
|
||||
amenity_type_sustenance = Ernährung
|
||||
amenity_type_sustenance = Ern\u00E4hrung
|
||||
|
||||
amenity_type_tourism = Tourismus
|
||||
|
||||
|
@ -27,6 +27,8 @@ amenity_type_transportation = Nahverkehr
|
|||
|
||||
indexing_address = Indexing address
|
||||
|
||||
indexing_map = Indexing map
|
||||
|
||||
indexing_poi = Indexing POI
|
||||
|
||||
indexing_transport = Indexing transport
|
||||
|
|
|
@ -27,6 +27,8 @@ amenity_type_transportation = \u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u
|
|||
|
||||
indexing_address = \u0418\u043D\u0434\u0435\u043A\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0430\u0434\u0440\u0435\u0441
|
||||
|
||||
indexing_map = \u0418\u043D\u0434\u0435\u043A\u0441\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u043A\u0430\u0440\u0442\u044B
|
||||
|
||||
indexing_poi = \u0418\u043D\u0434\u0435\u043A\u0441\u0438\u0440\u0443\u044E\u0442\u0441\u044F POI
|
||||
|
||||
indexing_transport = \u0418\u043D\u0434\u0435\u043A\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442
|
||||
|
|
|
@ -27,6 +27,7 @@ import com.osmand.data.preparation.MapTileDownloader.IMapDownloaderCallback;
|
|||
import com.osmand.map.ITileSource;
|
||||
import com.osmand.osm.LatLon;
|
||||
import com.osmand.osm.MapUtils;
|
||||
import com.osmand.render.RenderMapsRepositories;
|
||||
import com.osmand.views.POIMapLayer;
|
||||
|
||||
/**
|
||||
|
@ -41,6 +42,7 @@ public class ResourceManager {
|
|||
|
||||
public static final String APP_DIR = "osmand/"; //$NON-NLS-1$
|
||||
public static final String POI_PATH = APP_DIR + IndexConstants.POI_INDEX_DIR;
|
||||
public static final String MAPS_PATH = APP_DIR;
|
||||
public static final String ADDRESS_PATH = APP_DIR + IndexConstants.ADDRESS_INDEX_DIR;
|
||||
public static final String TRANSPORT_PATH = APP_DIR + IndexConstants.TRANSPORT_INDEX_DIR;
|
||||
public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$
|
||||
|
@ -77,6 +79,8 @@ public class ResourceManager {
|
|||
|
||||
protected Map<String, TransportIndexRepository> transportRepositories = new LinkedHashMap<String, TransportIndexRepository>();
|
||||
|
||||
protected RenderMapsRepositories renderer = new RenderMapsRepositories();
|
||||
|
||||
public AsyncLoadingThread asyncLoadingTiles = new AsyncLoadingThread();
|
||||
|
||||
|
||||
|
@ -305,6 +309,25 @@ public class ResourceManager {
|
|||
warnings.addAll(indexingPoi(progress));
|
||||
warnings.addAll(indexingAddresses(progress));
|
||||
warnings.addAll(indexingTransport(progress));
|
||||
warnings.addAll(indexingMaps(progress));
|
||||
return warnings;
|
||||
}
|
||||
|
||||
public List<String> indexingMaps(final IProgress progress) {
|
||||
File file = new File(Environment.getExternalStorageDirectory(), MAPS_PATH);
|
||||
List<String> warnings = new ArrayList<String>();
|
||||
renderer.clearAllResources();
|
||||
if (file.exists() && file.canRead()) {
|
||||
for (File f : file.listFiles()) {
|
||||
if (f.getName().endsWith(IndexConstants.MAP_INDEX_EXT)) {
|
||||
progress.startTask(Messages.getMessage("indexing_map") + f.getName(), -1); //$NON-NLS-1$
|
||||
boolean initialized = renderer.initializeNewResource(progress, f);
|
||||
if (!initialized) {
|
||||
warnings.add(MessageFormat.format(Messages.getMessage("version_index_is_not_supported"), f.getName())); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return warnings;
|
||||
}
|
||||
|
||||
|
@ -500,6 +523,7 @@ public class ResourceManager {
|
|||
|
||||
public synchronized void close(){
|
||||
imagesOnFS.clear();
|
||||
renderer.clearAllResources();
|
||||
closeAmenities();
|
||||
closeAddresses();
|
||||
closeTransport();
|
||||
|
@ -515,6 +539,7 @@ public class ResourceManager {
|
|||
for(RegionAddressRepository r : addressMap.values()){
|
||||
r.clearCities();
|
||||
}
|
||||
renderer.clearCache();
|
||||
|
||||
System.gc();
|
||||
}
|
||||
|
|
23
OsmAnd/src/com/osmand/render/RenderMapsRepositories.java
Normal file
23
OsmAnd/src/com/osmand/render/RenderMapsRepositories.java
Normal file
|
@ -0,0 +1,23 @@
|
|||
package com.osmand.render;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import com.osmand.IProgress;
|
||||
|
||||
public class RenderMapsRepositories {
|
||||
|
||||
public boolean initializeNewResource(final IProgress progress, File file) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public void clearAllResources(){
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
||||
public void clearCache() {
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue