利用sqlite儲存瓦片那是最好不過了,做離線地圖的時候,你拷那麼多圖片慢不?累不?
MBTiles是利用sqlite並有一種規則來儲存瓦片的,什麼是MBTiles?請參照我的部落格;
【移動GIS】MBTiles移動儲存簡介 這裡就不在獒述了。
MBTiles其實就是一個sqlite資料庫,但這個資料庫按照了一些規則建立了表來儲存瓦片資訊,所以把它叫做MBTiles,sqlite產生的資料檔案的尾碼名其實是可以隨便改變的哦,不影響你使用的,一般sqlite資料庫檔案問 .sqlite或者 .db ,然後儲存瓦片呢,我們產生資料庫檔案的時候就把他產生為 .mbtiles格式
在android移動預存程序中,不需要你再額外的加sqlite的JDBC啦,貌似android SDK就支援sqlite,那麼如何將瓦片匯入到sqlite資料庫中呢?沒辦法,只能自己寫個程式然後遍曆本地瓦片再依次插入到sqlite中去了,下面貼出插入瓦片的關鍵代碼:
package com.ehl.sqlite;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement;/** * sqlite資料操作 * * @author fazhen.zheng * */public class SqliteDB {private static Statement statement;private static Connection connection = null;private static PreparedStatement insertPS = null;private static PreparedStatement deletePS = null;public SqliteDB(String mbtilesPath) throws ClassNotFoundException, SQLException{Class.forName("org.sqlite.JDBC");if(mbtilesPath==null||mbtilesPath.trim().length()==0){connection = DriverManager.getConnection("jdbc:sqlite:ehl_mbtiles_db.mbtiles");statement = connection.createStatement();initTable();}else{connection = DriverManager.getConnection("jdbc:sqlite:" + mbtilesPath);statement = connection.createStatement();}insertPS = connection.prepareStatement("INSERT INTO tiles (zoom_level,tile_row,tile_column,tile_data) VALUES(?,?,?,?)");deletePS = connection.prepareStatement("DELETE FROM tiles WHERE zoom_level = ? and tile_row = ? and tile_column = ?");}/** * 初始化表資訊 * @throws SQLException */private void initTable() throws SQLException{statement.execute("DROP TABLE IF EXISTS metadata");statement.execute("DROP TABLE IF EXISTS tiles");statement.execute("CREATE TABLE metadata (name text, value text)");statement.execute("CREATE TABLE tiles (zoom_level integer, tile_row integer, tile_column integer, tile_data blob)");statement.execute("CREATE UNIQUE INDEX tile_index ON tiles (zoom_level, tile_row, tile_column)");statement.execute("CREATE UNIQUE INDEX name ON metadata (name)"); statement.execute("INSERT INTO metadata VALUES ('name', 'ehl_mbtiles_db')");statement.execute("INSERT INTO metadata VALUES ('type', 'baselayer')");statement.execute("INSERT INTO metadata VALUES ('version', '1.0')");statement.execute("INSERT INTO metadata VALUES ('description', '移動GIS')");statement.execute("INSERT INTO metadata VALUES ('format', 'png')");}/** * 插入一條資料 * @param zoom_level * @param tile_row * @param tile_column * @param tile_data */public void insertTiles(String zoom_level, String tile_row,String tile_column, File tile_data) {FileInputStream fis;ByteArrayOutputStream bos = null;try {connection.setAutoCommit(false);fis = new FileInputStream(tile_data);bos = new ByteArrayOutputStream();byte[] buf = new byte[1024];int readNum;while ((readNum = fis.read(buf)) != -1) {bos.write(buf, 0, readNum);}insertPS.setString(1, zoom_level);insertPS.setString(2, tile_row);insertPS.setString(3, tile_column);insertPS.setBytes(4, bos.toByteArray());deletePS.setString(1, zoom_level);deletePS.setString(2, tile_row);deletePS.setString(3, tile_column);deletePS.executeUpdate();insertPS.executeUpdate();connection.commit();} catch (Exception e) {try {connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();} }/** * 使用完畢後需關閉一些對象 */public void close() {try {if (insertPS != null)insertPS.close();if (deletePS != null)deletePS.close();if(statement!=null)statement.close();if (connection != null)connection.close();} catch (SQLException e) {System.err.println(e);}}}