diff --git a/settings.gradle b/settings.gradle index 013d71c0..ddc74185 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,6 +3,7 @@ include ':vtm' include ':vtm-android' include ':vtm-android-example' include ':vtm-android-gdx' +include ':vtm-android-mvt' include ':vtm-app' include ':vtm-desktop' include ':vtm-desktop-lwjgl' diff --git a/vtm-android-example/build.gradle b/vtm-android-example/build.gradle index e40f9ab4..11effe9c 100644 --- a/vtm-android-example/build.gradle +++ b/vtm-android-example/build.gradle @@ -9,6 +9,7 @@ configurations.all { dependencies { implementation project(':vtm-android') + implementation project(':vtm-android-mvt') implementation project(':vtm-extras') implementation project(':vtm-http') implementation project(':vtm-jeo') diff --git a/vtm-android-example/res/values/strings.xml b/vtm-android-example/res/values/strings.xml index 0c910315..57cad61b 100644 --- a/vtm-android-example/res/values/strings.xml +++ b/vtm-android-example/res/values/strings.xml @@ -27,7 +27,6 @@ Now Warning To run this sample activity, you need an MBTiles Database installed on storage.\n\nadb push %s %s - Unknown format \'%s\' found in MBTiles database \'%s\' in field \'metadata.format\'. Supported format(s) are: \'%s\' Exit diff --git a/vtm-android-example/src/org/oscim/android/test/MBTilesBitmapTileActivity.java b/vtm-android-example/src/org/oscim/android/test/MBTilesBitmapTileActivity.java index ce81203b..b42f0d7d 100644 --- a/vtm-android-example/src/org/oscim/android/test/MBTilesBitmapTileActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/MBTilesBitmapTileActivity.java @@ -19,10 +19,8 @@ package org.oscim.android.test; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; -import android.text.TextUtils; -import org.oscim.android.tiling.source.mbtiles.MBTilesBitmapTileDataSourceWorker; -import org.oscim.android.tiling.source.mbtiles.MBTilesMvtTileDataSourceWorker; +import org.oscim.android.tiling.source.mbtiles.MBTilesBitmapTileSource; import org.oscim.android.tiling.source.mbtiles.MBTilesTileSource; import org.oscim.core.BoundingBox; import org.oscim.core.MapPosition; @@ -55,29 +53,7 @@ public class MBTilesBitmapTileActivity extends BitmapTileActivity { return; } - MBTilesTileSource tileSource = new MBTilesTileSource(file.getAbsolutePath(), null, 128, null); - - if (!MBTilesBitmapTileDataSourceWorker.SUPPORTED_FORMATS.contains(tileSource.getMetadataFormat())) { - AlertDialog.Builder builder = new AlertDialog.Builder(this) - .setTitle(R.string.warning) - .setMessage( - getResources().getString( - R.string.unknown_format_mbtiles, - tileSource.getMetadataFormat(), - file.getAbsolutePath(), - TextUtils.join(", ", MBTilesMvtTileDataSourceWorker.SUPPORTED_FORMATS) - ) - ) - .setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }); - builder.show(); - - return; - } + MBTilesTileSource tileSource = new MBTilesBitmapTileSource(file.getAbsolutePath(), 128, null); BitmapTileLayer bitmapLayer = new BitmapTileLayer(mMap, tileSource); mMap.layers().add(bitmapLayer); diff --git a/vtm-android-example/src/org/oscim/android/test/MBTilesMvtTileActivity.java b/vtm-android-example/src/org/oscim/android/test/MBTilesMvtTileActivity.java index a9fa05c3..513c2ec8 100644 --- a/vtm-android-example/src/org/oscim/android/test/MBTilesMvtTileActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/MBTilesMvtTileActivity.java @@ -19,23 +19,17 @@ package org.oscim.android.test; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; -import android.text.TextUtils; -import org.oscim.android.cache.TileCache; -import org.oscim.android.tiling.source.mbtiles.MBTilesMvtTileDataSourceWorker; +import org.oscim.android.mvt.tiling.source.mbtiles.MBTilesMvtTileSource; import org.oscim.android.tiling.source.mbtiles.MBTilesTileSource; +import org.oscim.android.tiling.source.mbtiles.UnsupportedMBTilesDatabaseException; import org.oscim.core.BoundingBox; -import org.oscim.core.GeoPoint; import org.oscim.core.MapPosition; import org.oscim.core.Tile; import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.theme.VtmThemes; -import org.oscim.tiling.TileSource; -import org.oscim.tiling.source.OkHttpEngine; -import org.oscim.tiling.source.UrlTileSource; -import org.oscim.tiling.source.mvt.OpenMapTilesMvtTileSource; import java.io.File; @@ -60,19 +54,13 @@ public class MBTilesMvtTileActivity extends MapActivity { return; } - MBTilesTileSource tileSource = new MBTilesTileSource(file.getAbsolutePath(), "en"); - - if (!MBTilesMvtTileDataSourceWorker.SUPPORTED_FORMATS.contains(tileSource.getMetadataFormat())) { + MBTilesTileSource tileSource; + try { + tileSource = new MBTilesMvtTileSource(file.getAbsolutePath(), "en"); + } catch (UnsupportedMBTilesDatabaseException e) { AlertDialog.Builder builder = new AlertDialog.Builder(this) .setTitle(R.string.warning) - .setMessage( - getResources().getString( - R.string.unknown_format_mbtiles, - tileSource.getMetadataFormat(), - file.getAbsolutePath(), - TextUtils.join(", ", MBTilesMvtTileDataSourceWorker.SUPPORTED_FORMATS) - ) - ) + .setMessage(e.getMessage()) .setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/vtm-android-mvt/AndroidManifest.xml b/vtm-android-mvt/AndroidManifest.xml new file mode 100644 index 00000000..6a915c8c --- /dev/null +++ b/vtm-android-mvt/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/vtm-android-mvt/build.gradle b/vtm-android-mvt/build.gradle new file mode 100644 index 00000000..ccffd5c2 --- /dev/null +++ b/vtm-android-mvt/build.gradle @@ -0,0 +1,62 @@ +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' + +dependencies { + api project(':vtm-android') + api project(':vtm-mvt') +} + +android { + compileSdkVersion androidCompileSdk() + buildToolsVersion "$androidBuildVersionTools" + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + defaultConfig { + versionCode project.versionCode() + versionName project.versionName() + minSdkVersion androidMinSdk() + targetSdkVersion androidTargetSdk() + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + } + debug.setRoot('build-types/debug') + release.setRoot('build-types/release') + } + + lintOptions { abortOnError false } +} + +android.libraryVariants.all { variant -> + def name = variant.buildType.name + if (name == "debug") + return + + def jar = project.tasks.create "jar${name.capitalize()}", Jar + jar.dependsOn variant.javaCompileProvider + jar.exclude '**/BuildConfig.class' + jar.exclude '**/R.class' + jar.exclude '**/R$*.class' + jar.from variant.javaCompileProvider.get().destinationDir + artifacts.add('archives', jar) + + file('natives').eachDir() { dir -> + def nativesJar = project.tasks.create "nativesJar${name.capitalize()}-${dir.name}", Jar + nativesJar.classifier = "natives-${dir.name}" + nativesJar.from(dir.path) + artifacts.add('archives', nativesJar) + } +} + +if (project.hasProperty("SONATYPE_USERNAME")) { + afterEvaluate { + project.apply from: "${rootProject.projectDir}/deploy.gradle" + } +} diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesMvtTileDataSourceWorker.java b/vtm-android-mvt/src/org/oscim/android/mvt/tiling/source/mbtiles/MBTilesMvtTileDataSource.java similarity index 85% rename from vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesMvtTileDataSourceWorker.java rename to vtm-android-mvt/src/org/oscim/android/mvt/tiling/source/mbtiles/MBTilesMvtTileDataSource.java index 232e5d30..8ed00b49 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesMvtTileDataSourceWorker.java +++ b/vtm-android-mvt/src/org/oscim/android/mvt/tiling/source/mbtiles/MBTilesMvtTileDataSource.java @@ -12,17 +12,14 @@ * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see . */ -package org.oscim.android.tiling.source.mbtiles; +package org.oscim.android.mvt.tiling.source.mbtiles; import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import org.oscim.core.BoundingBox; +import org.oscim.android.tiling.source.mbtiles.MBTilesTileDataSource; import org.oscim.core.MercatorProjection; import org.oscim.layers.tile.MapTile; -import org.oscim.map.Viewport; import org.oscim.tiling.ITileDataSink; -import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.OverzoomDataSink; import org.oscim.tiling.QueryResult; import org.oscim.tiling.source.mvt.MvtTileDecoder; @@ -30,26 +27,16 @@ import org.oscim.tiling.source.mvt.MvtTileDecoder; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.zip.GZIPInputStream; -public class MBTilesMvtTileDataSourceWorker implements ITileDataSource { - public final static List SUPPORTED_FORMATS = Arrays.asList("pbf"); +public class MBTilesMvtTileDataSource extends MBTilesTileDataSource { + private final static List SUPPORTED_FORMATS = Arrays.asList("pbf"); - private static final String SELECT_TILES_FORMAT = - "SELECT zoom_level, tile_column, tile_row, tile_data " + - "FROM tiles " + - "WHERE %s " + - "ORDER BY zoom_level DESC " + - "LIMIT 1"; - - private static final String WHERE_FORMAT = "zoom_level=%d AND tile_column=%d AND tile_row=%d"; + public static final String WHERE_FORMAT = "zoom_level=%d AND tile_column=%d AND tile_row=%d"; private final String mLocale; - private final SQLiteDatabase mDatabase; private final ThreadLocal mThreadLocalMvtTileDecoders = new ThreadLocal() { @Override @@ -58,9 +45,17 @@ public class MBTilesMvtTileDataSourceWorker implements ITileDataSource { } }; - public MBTilesMvtTileDataSourceWorker(SQLiteDatabase database, String locale) { + public MBTilesMvtTileDataSource(String databasePath, String locale) { + super(databasePath); + + assertDatabaseFormat(); + mLocale = locale != null ? locale : "en"; - mDatabase = database; + } + + @Override + public List getSupportedFormats() { + return SUPPORTED_FORMATS; } @Override diff --git a/vtm-android-mvt/src/org/oscim/android/mvt/tiling/source/mbtiles/MBTilesMvtTileSource.java b/vtm-android-mvt/src/org/oscim/android/mvt/tiling/source/mbtiles/MBTilesMvtTileSource.java new file mode 100644 index 00000000..7122f470 --- /dev/null +++ b/vtm-android-mvt/src/org/oscim/android/mvt/tiling/source/mbtiles/MBTilesMvtTileSource.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Kostas Tzounopoulos + * + * This program is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * this program. If not, see . + */ +package org.oscim.android.mvt.tiling.source.mbtiles; + +import org.oscim.android.tiling.source.mbtiles.MBTilesTileSource; + +/** + * Create a Vector MBTiles tile source (OpenMapTiles MVT with gzipped-pbf tiles) + */ +public class MBTilesMvtTileSource extends MBTilesTileSource { + public MBTilesMvtTileSource(String databasePath) { + this(databasePath, null); + } + + /** + * Create a MBTiles tile data source for Raster databases + * + * @param databasePath the MBTiles database path + * @param locale the locale to use when rendering the MBTiles + */ + public MBTilesMvtTileSource(String databasePath, String locale) { + super(new MBTilesMvtTileDataSource(databasePath, locale)); + } +} diff --git a/vtm-android/build.gradle b/vtm-android/build.gradle index 552ec85d..f253066d 100644 --- a/vtm-android/build.gradle +++ b/vtm-android/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'com.github.dcendents.android-maven' dependencies { api project(':vtm') - api project(':vtm-mvt') api 'com.caverock:androidsvg:1.3' } diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSourceWorker.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java similarity index 84% rename from vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSourceWorker.java rename to vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java index bf0d7965..71713427 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSourceWorker.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java @@ -17,19 +17,16 @@ package org.oscim.android.tiling.source.mbtiles; import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; + import org.oscim.backend.CanvasAdapter; import org.oscim.backend.canvas.Bitmap; -import org.oscim.core.BoundingBox; import org.oscim.core.MercatorProjection; import org.oscim.layers.tile.MapTile; -import org.oscim.map.Viewport; import org.oscim.tiling.ITileDataSink; -import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.QueryResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,34 +34,43 @@ import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * A tile data source for MBTiles Raster databases. */ -public class MBTilesBitmapTileDataSourceWorker implements ITileDataSource { - public final static List SUPPORTED_FORMATS = Arrays.asList("png", "jpg", "jpeg"); - protected static final Logger log = LoggerFactory.getLogger(MBTilesBitmapTileDataSourceWorker.class); +public class MBTilesBitmapTileDataSource extends MBTilesTileDataSource { + private final static List SUPPORTED_FORMATS = Arrays.asList("png", "jpg", "jpeg"); + protected static final Logger log = LoggerFactory.getLogger(MBTilesBitmapTileDataSource.class); private final Integer mAlpha; private final Integer mTransparentColor; - private final SQLiteDatabase mDatabase; /** - * Create a MBTiles tile data source. + * Create a MBTiles tile data source for Raster databases * - * @param database the MBTiles database + * @param path the MBTiles database path * @param alpha an optional alpha value [0-255] to make the tiles transparent. * @param transparentColor an optional color that will be made transparent in the bitmap. */ - MBTilesBitmapTileDataSourceWorker(SQLiteDatabase database, Integer alpha, Integer transparentColor) { - mDatabase = database; + public MBTilesBitmapTileDataSource(String path, Integer alpha, Integer transparentColor) { + super(path); + + try { + assertDatabaseFormat(); + } catch (UnsupportedMBTilesDatabaseException e) { + log.error("Invalid MBTiles database", e); + } + mAlpha = alpha; mTransparentColor = transparentColor; } + @Override + public List getSupportedFormats() { + return SUPPORTED_FORMATS; + } + private static android.graphics.Bitmap processAlpha(android.graphics.Bitmap bitmap, int alpha) { android.graphics.Bitmap newBitmap = android.graphics.Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), android.graphics.Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); @@ -136,16 +142,17 @@ public class MBTilesBitmapTileDataSourceWorker implements ITileDataSource { * @return the tile image bytes. */ private byte[] readTile(int tileX, int tileY, byte zoomLevel) { + long tmsTileY = MercatorProjection.tileYToTMS(tileY, zoomLevel); + Cursor cursor = null; try { - long tmsTileY = MercatorProjection.tileYToTMS(tileY, zoomLevel); cursor = mDatabase.rawQuery( - MBTilesTileDataSource.SELECT_TILES, + String.format(MBTilesTileDataSource.SELECT_TILES_FORMAT, MBTilesTileDataSource.WHERE_FORMAT), new String[]{String.valueOf(zoomLevel), String.valueOf(tileX), String.valueOf(tmsTileY)} ); if (cursor.moveToFirst()) { - return cursor.getBlob(0); + return cursor.getBlob(cursor.getColumnIndexOrThrow("tile_data")); } } finally { if (cursor != null) { diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java new file mode 100644 index 00000000..0a988669 --- /dev/null +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java @@ -0,0 +1,37 @@ +/* + * Copyright 2019 Andrea Antonello + * Copyright 2019 devemux86 + * Copyright 2019 Kostas Tzounopoulos + * + * This program is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * this program. If not, see . + */ +package org.oscim.android.tiling.source.mbtiles; + +/** + * Create a Raster MBTiles tile source + */ +public class MBTilesBitmapTileSource extends MBTilesTileSource { + public MBTilesBitmapTileSource(String databasePath) { + this(databasePath, null, null); + } + + /** + * Create a MBTiles tile data source for Raster databases + * + * @param databasePath the MBTiles database path + * @param alpha an optional alpha value [0-255] to make the tiles transparent. + * @param transparentColor an optional color that will be made transparent in the bitmap. + */ + public MBTilesBitmapTileSource(String databasePath, Integer alpha, Integer transparentColor) { + super(new MBTilesBitmapTileDataSource(databasePath, alpha, transparentColor)); + } +} diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileDataSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileDataSource.java index 44fa6050..0d89a0d3 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileDataSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileDataSource.java @@ -20,106 +20,60 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.text.TextUtils; -import org.locationtech.jts.geom.Point; import org.oscim.core.BoundingBox; -import org.oscim.core.GeoPoint; import org.oscim.core.MapPosition; -import org.oscim.layers.tile.MapTile; import org.oscim.map.Viewport; -import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSource; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -public class MBTilesTileDataSource implements ITileDataSource { - private static final String TABLE_TILES = "tiles"; - private static final String COL_TILES_ZOOM_LEVEL = "zoom_level"; - private static final String COL_TILES_TILE_COLUMN = "tile_column"; - private static final String COL_TILES_TILE_ROW = "tile_row"; - private static final String COL_TILES_TILE_DATA = "tile_data"; - private static final String TABLE_METADATA = "metadata"; - private static final String COL_METADATA_NAME = "name"; - private static final String COL_METADATA_VALUE = "value"; +abstract public class MBTilesTileDataSource implements ITileDataSource { + public static final String SELECT_TILES_FORMAT = + "SELECT zoom_level, tile_column, tile_row, tile_data " + + "FROM tiles " + + "WHERE %s " + + "ORDER BY zoom_level DESC " + + "LIMIT 1"; - public static final String SELECT_TILES = "SELECT " + COL_TILES_TILE_DATA + " from " + TABLE_TILES + " where " - + COL_TILES_ZOOM_LEVEL + "=? AND " + COL_TILES_TILE_COLUMN + "=? AND " + COL_TILES_TILE_ROW + "=?"; - public static final String SELECT_METADATA = "select " + COL_METADATA_NAME + "," + COL_METADATA_VALUE + " from " - + TABLE_METADATA; + public static final String WHERE_FORMAT = "zoom_level=? AND tile_column=? AND tile_row=?"; + public static final String SELECT_METADATA = "SELECT name, value FROM metadata"; - private final SQLiteDatabase mDatabase; - private final String mLocale; - private final Integer mAlpha; - private final Integer mTransparentColor; - private Map mMetadata; - private ITileDataSource mTileDataSource; + protected final SQLiteDatabase mDatabase; + protected Map mMetadata; - public MBTilesTileDataSource(String path, String locale, Integer alpha, Integer transparentColor) { + public MBTilesTileDataSource(String path) { mDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); - mLocale = locale; - mAlpha = alpha; - mTransparentColor = transparentColor; } - @Override - public void cancel() { - findWorker().cancel(); - } - - @Override - public void dispose() { - findWorker().cancel(); - } - - @Override - public void query(MapTile requestTile, ITileDataSink requestDataSink) { - findWorker().query(requestTile, requestDataSink); - } - - protected ITileDataSource findWorker() { - if (mTileDataSource != null) { - return mTileDataSource; - } + abstract public List getSupportedFormats(); + protected void assertDatabaseFormat() { String mbTilesFormat = getFormat(); if (mbTilesFormat == null) { - throw new RuntimeException("Unable to read the '" + TABLE_METADATA + ".format' field of the database."); + throw new RuntimeException("'metadata.format' field was not found. Is this an MBTiles database?"); } - if (MBTilesBitmapTileDataSourceWorker.SUPPORTED_FORMATS.contains(mbTilesFormat)) { - mTileDataSource = new MBTilesBitmapTileDataSourceWorker(mDatabase, mAlpha, mTransparentColor); + List supportedFormats = getSupportedFormats(); - return mTileDataSource; + if (!supportedFormats.contains(mbTilesFormat)) { + throw new RuntimeException( + String.format( + "Unsupported MBTiles 'metadata.format: %s'. Supported format(s) are: %s", + mbTilesFormat, + TextUtils.join(", ", supportedFormats) + ) + ); } - - if (MBTilesMvtTileDataSourceWorker.SUPPORTED_FORMATS.contains(mbTilesFormat)) { - mTileDataSource = new MBTilesMvtTileDataSourceWorker(mDatabase, mLocale); - - return mTileDataSource; - } - - List supportedFormats = new ArrayList<>(); - supportedFormats.addAll(MBTilesBitmapTileDataSourceWorker.SUPPORTED_FORMATS); - supportedFormats.addAll(MBTilesMvtTileDataSourceWorker.SUPPORTED_FORMATS); - - throw new RuntimeException( - String.format( - "Unknown MBtiles database format '%s' found in the 'metadata.format' field of the database. " - + "Expected one of: '%s'", - mbTilesFormat, - TextUtils.join(", ", supportedFormats) - ) - ); } - String getAttribution() { + public String getAttribution() { return getMetadata().get("attribution"); } - BoundingBox getBounds() { + public BoundingBox getBounds() { String bounds = getMetadata().get("bounds"); if (bounds == null) { @@ -135,7 +89,7 @@ public class MBTilesTileDataSource implements ITileDataSource { return new BoundingBox(s, w, n, e); } - MapPosition getCenter() { + public MapPosition getCenter() { String center = getMetadata().get("center"); if (center == null) { @@ -154,51 +108,51 @@ public class MBTilesTileDataSource implements ITileDataSource { return centerMapPosition; } - String getDescription() { + public String getDescription() { return getMetadata().get("description"); } - String getFormat() { + public String getFormat() { return getMetadata().get("format"); } - Integer getPixelScale() { + public Integer getPixelScale() { String pixelScale = getMetadata().get("pixel_scale"); return pixelScale != null ? Integer.parseInt(pixelScale) : null; } - int getMaxZoom() { + public int getMaxZoom() { String maxZoom = getMetadata().get("maxzoom"); return maxZoom != null ? Integer.parseInt(maxZoom) : Viewport.MAX_ZOOM_LEVEL; } - int getMinZoom() { + public int getMinZoom() { String minZoom = getMetadata().get("minzoom"); return minZoom != null ? Integer.parseInt(minZoom) : Viewport.MIN_ZOOM_LEVEL; } - String getName() { + public String getName() { return getMetadata().get("name"); } - String getVersion() { + public String getVersion() { return getMetadata().get("version"); } - String getId() { + public String getId() { return getMetadata().get("id"); } - Long getMTime() { + public Long getMTime() { String mTime = getMetadata().get("mtime"); return mTime != null ? Long.parseLong(mTime) : null; } - String getJson() { + public String getJson() { return getMetadata().get("json"); } diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileSource.java index 53d5b2ba..2e0d3acd 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesTileSource.java @@ -17,46 +17,17 @@ package org.oscim.android.tiling.source.mbtiles; import org.oscim.core.BoundingBox; -import org.oscim.core.GeoPoint; import org.oscim.core.MapPosition; -import org.oscim.map.Viewport; import org.oscim.tiling.TileSource; /** - * A tile source for MBTiles Raster and Vector databases. - * Supports the OpenMapTiles MVT pbf-gzip MBTiles format + * A tile source for MBTiles databases. */ -public class MBTilesTileSource extends TileSource { - private final MBTilesTileDataSource mTileDataSource; +abstract public class MBTilesTileSource extends TileSource { + protected final MBTilesTileDataSource mTileDataSource; - /** - * Create a MBTiles tile source (Raster/Vector) - * - * @param path the path to the MBTiles database. - */ - public MBTilesTileSource(String path) { - this(path, null, null, null); - } - - /** - * Create an MBTiles tile source with additional parameters - * - * @param path the path to the MBTiles database. (Raster & Vector) - * @param locale the database locale to use, e.g. "en", "de" (Vector only) - * @param alpha an optional alpha value [0-255] to make the tiles transparent. (Raster only) - * @param transparentColor an optional color that will be made transparent in the bitmap. (Raster only) - */ - public MBTilesTileSource(String path, String locale, Integer alpha, Integer transparentColor) { - mTileDataSource = new MBTilesTileDataSource(path, locale, alpha, transparentColor); - } - - /** - * Create a MBTiles tile source (Vector only) - * - * @param path the path to the MBTiles database. - */ - public MBTilesTileSource(String path, String locale) { - this(path, locale, null, null); + public MBTilesTileSource(MBTilesTileDataSource tileDataSource) { + mTileDataSource = tileDataSource; } @Override diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/UnsupportedMBTilesDatabaseException.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/UnsupportedMBTilesDatabaseException.java new file mode 100644 index 00000000..d7f31c70 --- /dev/null +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/UnsupportedMBTilesDatabaseException.java @@ -0,0 +1,4 @@ +package org.oscim.android.tiling.source.mbtiles; + +public class UnsupportedMBTilesDatabaseException extends RuntimeException { +}