在osmdroid中支持多种离线地图格式,其中sqlite,mbtiles,zip,gemf等格式,那么他们的格式有什么不同呢?
下面我们慢慢来研究一下源代码既可以知道。
针对ArchiveFileFactory的类查看如下:
package org.osmdroid.tileprovider.modules;
import java.io.File;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.database.sqlite.SQLiteException;
public class ArchiveFileFactory {
private static final Logger logger = LoggerFactory.getLogger(ArchiveFileFactory.class);
/**
* Return an implementation of {@link IArchiveFile} for the specified file.
* @return an implementation, or null if there's no suitable implementation
*/
public static IArchiveFile getArchiveFile(final File pFile) {
if (pFile.getName().endsWith(".zip")) {
try {
return ZipFileArchive.getZipFileArchive(pFile);
} catch (final IOException e) {
logger.error("Error opening ZIP file", e);
}
}
if (pFile.getName().endsWith(".sqlite")) {
try {
return DatabaseFileArchive.getDatabaseFileArchive(pFile);
} catch (final SQLiteException e) {
logger.error("Error opening SQL file", e);
}
}
if (pFile.getName().endsWith(".mbtiles")) {
try {
return MBTilesFileArchive.getDatabaseFileArchive(pFile);
} catch (final SQLiteException e) {
logger.error("Error opening MBTiles SQLite file", e);
}
}
if (pFile.getName().endsWith(".gemf")) {
try {
return GEMFFileArchive.getGEMFFileArchive(pFile);
} catch (final IOException e) {
logger.error("Error opening GEMF file", e);
}
}
return null;
}
}
其中sqlite格式如下:存储的表名为:tiles字段为tile,key,provider,
具体实现如下:
package org.osmdroid.tileprovider.modules;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import org.osmdroid.tileprovider.MapTile;
import org.osmdroid.tileprovider.tilesource.ITileSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
public class DatabaseFileArchive implements IArchiveFile {
private static final Logger logger = LoggerFactory.getLogger(DatabaseFileArchive.class);
private final SQLiteDatabase mDatabase;
private DatabaseFileArchive(final SQLiteDatabase pDatabase) {
mDatabase = pDatabase;
}
public static DatabaseFileArchive getDatabaseFileArchive(final File pFile) throws SQLiteException {
return new DatabaseFileArchive(SQLiteDatabase.openOrCreateDatabase(pFile, null));
}
@Override
public InputStream getInputStream(final ITileSource pTileSource, final MapTile pTile) {
try {
InputStream ret = null;
final String[] tile = {"tile"};
final long x = (long) pTile.getX();
final long y = (long) pTile.getY();
final long z = (long) pTile.getZoomLevel();
final long index = ((z << z) + x << z) + y;
final Cursor cur = mDatabase.query("tiles", tile, "key = " + index + " and provider = '" + pTileSource.name() + "'",