package eu.geopaparazzi.spatialite.database.spatial.core.mbtiles; /** @author Simon Thepot aka djcoin <simon.thepot@gmail.com, simon.thepot@makina-corpus.com> */ import java.io.File; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import eu.geopaparazzi.spatialite.database.spatial.core.mbtiles.MbTilesMetadata.MetadataParseException; import eu.geopaparazzi.spatialite.database.spatial.core.mbtiles.MbTilesMetadata.MetadataValidator; public class MBTilesDroidSpitter { // private static final int VERSION_BDD = 1; // private MbTilesSQLite mbtilesdb; private SQLiteDatabase db; private File dbpath; private MbTilesMetadata metadata; public MBTilesDroidSpitter( File dbpath ) { // mbtilesdb = new MbTilesSQLite(ctx, dbpath.getName(), null, VERSION_BDD); this.dbpath = dbpath; } public void open( boolean fetchMetadata, String metadataVersion ) { // db = mbtilesdb.getReadableDatabase(); db = SQLiteDatabase.openDatabase(dbpath.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.NO_LOCALIZED_COLLATORS); if (!fetchMetadata) return; try { fetchMetadata(metadataVersion); } catch (MetadataParseException e) { e.printStackTrace(); System.out.println(e.getMessage()); } } public void close() { db.close(); } public SQLiteDatabase getBDD() { return db; } public Drawable getTileAsDrawable( int x, int y, int z ) { return new BitmapDrawable(getTileAsBitmap(x, y, z)); } public Drawable getTileAsDrawable( String x, String y, String z ) { return new BitmapDrawable(getTileAsBitmap(x, y, z)); } public Bitmap getTileAsBitmap( int x, int y, int z ) { return this.getTileAsBitmap(Integer.toString(x), Integer.toString(y), Integer.toString(z)); } public byte[] getTileAsBytes( String x, String y, String z ) { final Cursor c = db.rawQuery("select tile_data from tiles where tile_column=? and tile_row=? and zoom_level=?", new String[]{x, y, z}); if (!c.moveToFirst()) { c.close(); return null; } byte[] bb = c.getBlob(c.getColumnIndex("tile_data")); c.close(); return bb; } // Warning: you should have checked that those x y z are real integers /** * @return the bitmap of the tile or null if no tile matched the given parameters */ public Bitmap getTileAsBitmap( String x, String y, String z ) { // TODO: Optimize this if we have metadata with bound or min/max zoomlevels // Do not make any request and return null if we know it won't match any tile byte[] bb = getTileAsBytes(x, y, z); return BitmapFactory.decodeByteArray(bb, 0, bb.length); } public MbTilesMetadata fetchMetadata( String metadataVersion ) throws MetadataParseException { Cursor c = db.query(MbTilesSQLite.TABLE_METADATA, new String[]{MbTilesSQLite.COL_METADATA_NAME, MbTilesSQLite.COL_METADATA_VALUE}, null, null, null, null, null); MetadataValidator validator = MbTilesMetadata.MetadataValidatorFactory.getMetadataValidatorFromVersion(metadataVersion); if (validator == null) return null; this.metadata = MbTilesMetadata.createFromCursor(c, c.getColumnIndex(MbTilesSQLite.COL_METADATA_NAME), c.getColumnIndex(MbTilesSQLite.COL_METADATA_VALUE), validator); return this.metadata; } public MbTilesMetadata getMetadata() { return this.metadata; } }