Reading Mbtiles by overriding getURL, notice that the tile data is requested by callback onRequestRequired, but the callback is very slow and no longer requests data at high levels, why?
SDK Version:100.3
Demo:
public class MBTilesLayer extends ImageTiledLayer { String mMbTilesFilename; private SQLiteDatabase mapDb; //构造一个离线MBTiles图层 public MBTilesLayer( String _mbTilesPath ){ super( MbtilesUtil.newInstance().getMBTileTileinfo( _mbTilesPath ), MbtilesUtil.newInstance().getMBTileEnvelope( _mbTilesPath ) ); mMbTilesFilename = _mbTilesPath; try { mapDb = SQLiteDatabase.openDatabase( mMbTilesFilename, null, SQLiteDatabase.OPEN_READONLY ); //setBufferSize(BufferSize.NONE); } catch (SQLException ex) { Log.e(this.getName(), ex.getMessage()); throw (ex); } } @Override protected byte[] getTile(TileKey tileKey) { // need to flip origin int nRows = (1 << tileKey.getLevel()); // Num rows = 2^level int tmsRow = nRows - 1 - tileKey.getRow(); String sql = "SELECT tile_data FROM tiles WHERE zoom_level = " + Integer.toString( tileKey.getLevel() ) + " AND tile_column = " + Integer.toString( tileKey.getColumn() ) + " AND tile_row = " + Integer.toString( tmsRow ); System.out.println( "Sql " + sql ); Cursor imageCur = mapDb.rawQuery(sql,null); if (imageCur.moveToFirst()) { return imageCur.getBlob(0); } return null; // Alternatively we might return a "no data" tile } }