add wms to osmand

git-svn-id: https://osmand.googlecode.com/svn/trunk@400 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-07-27 18:58:42 +00:00
parent 59b29aa2e3
commit d707d5295b
8 changed files with 98 additions and 23 deletions

View file

@ -16,7 +16,6 @@ public class ToDoConstants {
// 80. Export/import favorite points // 80. Export/import favorite points
// 81. Add some objects to POI to help navigation ( // 81. Add some objects to POI to help navigation (
// highway (?), traffic_calming (?), barrier(?), military(?-), landuse (?), office(?), man_made(?), power(?). // highway (?), traffic_calming (?), barrier(?), military(?-), landuse (?), office(?), man_made(?), power(?).
// 79. Download any WMS layer and add to swing version (add tile manager ${x}, ${y}, ${z} to swing and to android)
// BUGS : // BUGS :
@ -51,6 +50,7 @@ public class ToDoConstants {
// DONE ANDROID : // DONE ANDROID :
// 64. Traffic information - yandex traffic // 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)
// DONE SWING // DONE SWING

View file

@ -29,6 +29,11 @@ public class TileSourceManager {
private int avgSize; private int avgSize;
private int bitDensity; private int bitDensity;
// default constructor
public TileSourceTemplate(String name, String urlToLoad){
this(name, urlToLoad, ".jpg", 18, 1, 256, 16, 20000); //$NON-NLS-1$
}
public TileSourceTemplate(String name, String urlToLoad, String ext, int maxZoom, int minZoom, int tileSize, int bitDensity, int avgSize) { public TileSourceTemplate(String name, String urlToLoad, String ext, int maxZoom, int minZoom, int tileSize, int bitDensity, int avgSize) {
this.maxZoom = maxZoom; this.maxZoom = maxZoom;
this.minZoom = minZoom; this.minZoom = minZoom;
@ -76,12 +81,19 @@ public class TileSourceManager {
@Override @Override
public String getUrlToLoad(int x, int y, int zoom) { public String getUrlToLoad(int x, int y, int zoom) {
// use int to string not format numbers! (non-nls) // use int to string not format numbers! (non-nls)
if(urlToLoad == null){
return null;
}
return MessageFormat.format(urlToLoad, zoom+"", x+"", y+""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return MessageFormat.format(urlToLoad, zoom+"", x+"", y+""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
public String getUrlTemplate(){
return urlToLoad;
}
@Override @Override
public boolean couldBeDownloadedFromInternet() { public boolean couldBeDownloadedFromInternet() {
return true; return urlToLoad != null;
} }

View file

@ -590,7 +590,7 @@ public class OsmExtractionUI implements IMapLocationListener {
@Override @Override
public void run() { public void run() {
try { try {
SQLiteBigPlanetIndex.createSQLiteDatabase(DataExtractionSettings.getSettings().getTilesDirectory(), regionName, map.getName()); SQLiteBigPlanetIndex.createSQLiteDatabase(DataExtractionSettings.getSettings().getTilesDirectory(), regionName, map);
} catch (SQLException e1) { } catch (SQLException e1) {
throw new IllegalArgumentException(e1); throw new IllegalArgumentException(e1);
} catch (IOException e1) { } catch (IOException e1) {

View file

@ -12,13 +12,15 @@ import java.sql.Statement;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import com.osmand.LogUtil; import com.osmand.LogUtil;
import com.osmand.map.ITileSource;
import com.osmand.map.TileSourceManager.TileSourceTemplate;
public class SQLiteBigPlanetIndex { public class SQLiteBigPlanetIndex {
private static final Log log = LogUtil.getLog(SQLiteBigPlanetIndex.class); private static final Log log = LogUtil.getLog(SQLiteBigPlanetIndex.class);
private static final int BATCH_SIZE = 50; private static final int BATCH_SIZE = 50;
public static void createSQLiteDatabase(File dirWithTiles, String regionName, String tileSource) throws SQLException, IOException { public static void createSQLiteDatabase(File dirWithTiles, String regionName, ITileSource template) throws SQLException, IOException {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
try { try {
Class.forName("org.sqlite.JDBC"); //$NON-NLS-1$ Class.forName("org.sqlite.JDBC"); //$NON-NLS-1$
@ -26,26 +28,36 @@ public class SQLiteBigPlanetIndex {
log.error("Illegal configuration", e); //$NON-NLS-1$ log.error("Illegal configuration", e); //$NON-NLS-1$
throw new IllegalStateException(e); throw new IllegalStateException(e);
} }
File fileToWrite = new File(dirWithTiles, regionName + "." + tileSource + ".sqlitedb"); File fileToWrite = new File(dirWithTiles, regionName + "." + template.getName() + ".sqlitedb");
fileToWrite.delete(); fileToWrite.delete();
Connection conn = DriverManager.getConnection("jdbc:sqlite:" + fileToWrite.getAbsolutePath()); //$NON-NLS-1$ Connection conn = DriverManager.getConnection("jdbc:sqlite:" + fileToWrite.getAbsolutePath()); //$NON-NLS-1$
Statement statement = conn.createStatement(); Statement statement = conn.createStatement();
statement.execute("CREATE TABLE tiles (x int, y int, z int, s int, image blob, PRIMARY KEY (x,y,z,s))"); statement.execute("CREATE TABLE tiles (x int, y int, z int, s int, image blob, PRIMARY KEY (x,y,z,s))");
statement.execute("CREATE INDEX IND on tiles (x,y,z,s)"); statement.execute("CREATE INDEX IND on tiles (x,y,z,s)");
statement.execute("CREATE TABLE info(minzoom,maxzoom)"); statement.execute("CREATE TABLE info(minzoom,maxzoom,url)");
statement.execute("CREATE TABLE android_metadata (locale TEXT)"); statement.execute("CREATE TABLE android_metadata (locale TEXT)");
statement.close(); statement.close();
conn.setAutoCommit(false);
PreparedStatement pStatement = conn.prepareStatement("INSERT INTO tiles VALUES (?, ?, ?, ?, ?)"); PreparedStatement pStatement = conn.prepareStatement("INSERT INTO INFO VALUES(?,?,?)");
if (template instanceof TileSourceTemplate) {
pStatement.setInt(1, template.getMinimumZoomSupported());
pStatement.setInt(2, template.getMaximumZoomSupported());
pStatement.setString(3, ((TileSourceTemplate) template).getUrlTemplate());
pStatement.execute();
}
pStatement.close();
conn.setAutoCommit(false);
pStatement = conn.prepareStatement("INSERT INTO tiles VALUES (?, ?, ?, ?, ?)");
int ch = 0; int ch = 0;
int bufSize = 32 * 1024; int bufSize = 32 * 1024;
byte[] buf = new byte[bufSize]; byte[] buf = new byte[bufSize];
int maxZoom = 17; int maxZoom = 17;
int minZoom = 1; int minZoom = 1;
File rootDir = new File(dirWithTiles, tileSource); File rootDir = new File(dirWithTiles, template.getName());
for(File z : rootDir.listFiles()){ for(File z : rootDir.listFiles()){
try { try {
int zoom = Integer.parseInt(z.getName()); int zoom = Integer.parseInt(z.getName());

View file

@ -1,7 +1,12 @@
package com.osmand; package com.osmand;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List; import java.util.List;
import java.util.regex.Pattern;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -9,6 +14,7 @@ import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.location.LocationManager; import android.location.LocationManager;
import android.os.Environment; import android.os.Environment;
import android.util.Log;
import com.osmand.activities.RouteProvider.RouteService; import com.osmand.activities.RouteProvider.RouteService;
import com.osmand.activities.search.SearchHistoryHelper; import com.osmand.activities.search.SearchHistoryHelper;
@ -304,16 +310,35 @@ public class OsmandSettings {
SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE); SharedPreferences prefs = ctx.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE);
String tileName = prefs.getString(MAP_TILE_SOURCES, null); String tileName = prefs.getString(MAP_TILE_SOURCES, null);
if (tileName != null) { if (tileName != null) {
if(tileName.endsWith(SQLiteTileSource.EXT)){
File file = new File(Environment.getExternalStorageDirectory(), ResourceManager.TILES_PATH);
return new SQLiteTileSource(new File(file, tileName));
}
List<TileSourceTemplate> list = TileSourceManager.getKnownSourceTemplates(); List<TileSourceTemplate> list = TileSourceManager.getKnownSourceTemplates();
for (TileSourceTemplate l : list) { for (TileSourceTemplate l : list) {
if (l.getName().equals(tileName)) { if (l.getName().equals(tileName)) {
return l; return l;
} }
} }
File tPath = new File(Environment.getExternalStorageDirectory(), ResourceManager.TILES_PATH);
File dir = new File(tPath, tileName);
if(dir.exists()){
if(tileName.endsWith(SQLiteTileSource.EXT)){
return new SQLiteTileSource(dir);
} else if (dir.isDirectory()) {
String url = null;
File readUrl = new File(dir, "url"); //$NON-NLS-1$
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(readUrl), "UTF-8")); //$NON-NLS-1$
url = reader.readLine();
url = url.replaceAll(Pattern.quote("{$z}"), "{0}"); //$NON-NLS-1$ //$NON-NLS-2$
url = url.replaceAll(Pattern.quote("{$x}"), "{1}"); //$NON-NLS-1$//$NON-NLS-2$
url = url.replaceAll(Pattern.quote("{$y}"), "{2}"); //$NON-NLS-1$ //$NON-NLS-2$
reader.close();
} catch (IOException e) {
Log.d(LogUtil.TAG, "Error reading url " + dir.getName(), e); //$NON-NLS-1$
}
return new TileSourceManager.TileSourceTemplate(dir.getName(), url);
}
}
} }
return TileSourceManager.getMapnikSource(); return TileSourceManager.getMapnikSource();
} }

View file

@ -44,6 +44,7 @@ public class ResourceManager {
public static final String ADDRESS_PATH = APP_DIR + IndexConstants.ADDRESS_INDEX_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 TRANSPORT_PATH = APP_DIR + IndexConstants.TRANSPORT_INDEX_DIR;
public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$ public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$
public static final String TEMP_SOURCE_TO_LOAD = "temp"; //$NON-NLS-1$
public static final int LIMIT_TRANSPORT = 200; public static final int LIMIT_TRANSPORT = 200;
@ -139,6 +140,14 @@ public class ResourceManager {
log.warn("File "+req.fileToSave.getName() + " couldn't be read", e); //$NON-NLS-1$//$NON-NLS-2$ log.warn("File "+req.fileToSave.getName() + " couldn't be read", e); //$NON-NLS-1$//$NON-NLS-2$
} }
req.fileToSave.delete(); req.fileToSave.delete();
String[] l = req.fileToSave.getParentFile().list();
if(l == null || l.length == 0){
req.fileToSave.getParentFile().delete();
l = req.fileToSave.getParentFile().getParentFile().list();
if(l == null || l.length == 0){
req.fileToSave.getParentFile().getParentFile().delete();
}
}
} }
} }
@ -180,14 +189,19 @@ public class ResourceManager {
protected StringBuilder builder = new StringBuilder(40); protected StringBuilder builder = new StringBuilder(40);
public synchronized String calculateTileId(ITileSource map, int x, int y, int zoom){ public synchronized String calculateTileId(ITileSource map, int x, int y, int zoom){
builder.setLength(0); builder.setLength(0);
if(map == null){
builder.append(TEMP_SOURCE_TO_LOAD);
} else {
builder.append(map.getName()); builder.append(map.getName());
}
if(map instanceof SQLiteTileSource){ if(map instanceof SQLiteTileSource){
builder.append('@'); builder.append('@');
} else { } else {
builder.append('/'); builder.append('/');
} }
builder.append(zoom).append('/').append(x). builder.append(zoom).append('/').append(x).
append('/').append(y).append(map.getTileFormat()).append(".tile"); //$NON-NLS-1$ append('/').append(y).append(map == null ? ".jpg" : map.getTileFormat()).append(".tile"); //$NON-NLS-1$ //$NON-NLS-2$
String file = builder.toString(); String file = builder.toString();
return file; return file;
} }
@ -223,8 +237,7 @@ public class ResourceManager {
File toSave = null; File toSave = null;
if (url != null) { if (url != null) {
if (map instanceof SQLiteTileSource) { if (map instanceof SQLiteTileSource) {
ITileSource base = ((SQLiteTileSource) map).getBase(); toSave = new File(dirWithTiles, calculateTileId(((SQLiteTileSource) map).getBase(), x, y, zoom));
toSave = new File(dirWithTiles, calculateTileId(base, x, y, zoom));
} else { } else {
toSave = new File(dirWithTiles, tileId); toSave = new File(dirWithTiles, tileId);
} }

View file

@ -4,6 +4,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.text.MessageFormat;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -15,6 +16,7 @@ import android.graphics.BitmapFactory;
import com.osmand.map.ITileSource; import com.osmand.map.ITileSource;
import com.osmand.map.TileSourceManager; import com.osmand.map.TileSourceManager;
import com.osmand.map.TileSourceManager.TileSourceTemplate;
public class SQLiteTileSource implements ITileSource { public class SQLiteTileSource implements ITileSource {
@ -23,6 +25,7 @@ public class SQLiteTileSource implements ITileSource {
private static final Log log = LogUtil.getLog(SQLiteTileSource.class); private static final Log log = LogUtil.getLog(SQLiteTileSource.class);
private ITileSource base; private ITileSource base;
private String urlTemplate = null;
private String name; private String name;
private SQLiteDatabase db; private SQLiteDatabase db;
private final File file; private final File file;
@ -34,9 +37,10 @@ public class SQLiteTileSource implements ITileSource {
i = name.lastIndexOf('.'); i = name.lastIndexOf('.');
if(i > 0){ if(i > 0){
String sourceName = name.substring(i+1); String sourceName = name.substring(i+1);
for(ITileSource is : TileSourceManager.getKnownSourceTemplates()){ for(TileSourceTemplate is : TileSourceManager.getKnownSourceTemplates()){
if(is.getName().equalsIgnoreCase(sourceName)){ if(is.getName().equalsIgnoreCase(sourceName)){
base = is; base = is;
urlTemplate = is.getUrlTemplate();
break; break;
} }
} }
@ -77,10 +81,10 @@ public class SQLiteTileSource implements ITileSource {
@Override @Override
public String getUrlToLoad(int x, int y, int zoom) { public String getUrlToLoad(int x, int y, int zoom) {
SQLiteDatabase db = getDatabase(); SQLiteDatabase db = getDatabase();
if(db == null || db.isReadOnly()){ if(db == null || db.isReadOnly() || urlTemplate == null){
return null; return null;
} }
return base != null ? base.getUrlToLoad(x, y, zoom) : null; return MessageFormat.format(urlTemplate, zoom+"", x+"", y+""); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
} }
@Override @Override
@ -117,6 +121,13 @@ public class SQLiteTileSource implements ITileSource {
private SQLiteDatabase getDatabase(){ private SQLiteDatabase getDatabase(){
if(db == null && file.exists()){ if(db == null && file.exists()){
db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, 0); db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, 0);
try {
String template = db.compileStatement("SELECT url FROM info").simpleQueryForString(); //$NON-NLS-1$
if(!Algoritms.isEmpty(template)){
urlTemplate = template;
}
} catch (RuntimeException e) {
}
} }
return db; return db;
} }
@ -203,10 +214,10 @@ public class SQLiteTileSource implements ITileSource {
@Override @Override
public boolean couldBeDownloadedFromInternet() { public boolean couldBeDownloadedFromInternet() {
if(getDatabase() == null || getDatabase().isReadOnly() || base == null){ if(getDatabase() == null || getDatabase().isReadOnly()){
return false; return false;
} }
return base.couldBeDownloadedFromInternet(); return urlTemplate != null;
} }

View file

@ -335,6 +335,8 @@ public class SettingsActivity extends PreferenceActivity implements OnPreference
if (f.getName().endsWith(SQLiteTileSource.EXT)) { if (f.getName().endsWith(SQLiteTileSource.EXT)) {
String n = f.getName(); String n = f.getName();
map.put(f.getName(), n.substring(0, n.indexOf('.'))); map.put(f.getName(), n.substring(0, n.indexOf('.')));
} else if(f.isDirectory() && !f.getName().equals(ResourceManager.TEMP_SOURCE_TO_LOAD)){
map.put(f.getName(), f.getName());
} }
} }
} }