osmdroid API解读(七)
osmdroid-android org.osmdroid.tileprovider.modules 包(一)
1. IArchiveFile
本地瓦片文件接口用于从本地文件载入瓦片。通常仅用于不需要计算就可以获取瓦片的本地文件
public interface IArchiveFile {
//初始化本地文件,比如执行初始化扫描、请求、打开数据库等
void init(File pFile) throws Exception;
//根据瓦片源及瓦片的基本信息获取瓦片图片的输入流
InputStream getInputStream(ITileSource tileSource, MapTile tile);
//关闭本地瓦片文件释放资源
void close();
//如果支持的话,获取本地可利用的瓦片源的名称列表,否则返回空集合
public Set<String> getTileSources();
}
1.1 几种类型的本地瓦片
1.1.1 MBTiles
支持MBTiles类型的本地瓦片包,也是sqlite型数据,只是字段与sqlite不一致。
public class MBTilesFileArchive implements IArchiveFile {
...
}
1.1.2 ZIP
支持zip类型的本地瓦片包,java.util.zip.ZipFile方法提供相应的解析方法。
public class ZipFileArchive implements IArchiveFile {
...
}
1.1.3 sqlite
支持sqlite类型的本地瓦片包,是osmdroid风格的本地瓦片提供者
public class DatabaseFileArchive implements IArchiveFile {
...
}
1.1.4 GEMF
支持GEMF文件的本地瓦片包。org.osmdroid.util.GEMFFile提供相应的解析方法。
public class GEMFFileArchive implements IArchiveFile {
...
}
1.2 ArchiveFileFactory
将1.1中提到的四种数据利用尾缀进行区别,并用四种相应的IArchiveFile类来解析。此类将上面1.1中的四种格式的瓦片包进行了封装:
public class ArchiveFileFactory {
static Map<String, Class<? extends IArchiveFile> > extensionMap = new HashMap<String, Class<? extends IArchiveFile>>();
//载入四种格式对应的IArchiveFile类
static {
extensionMap.put("zip", ZipFileArchive.class);
if (Build.VERSION.SDK_INT >= 10) {
extensionMap.put("sqlite", DatabaseFileArchive.class);
extensionMap.put("mbtiles", MBTilesFileArchive.class);
extensionMap.put("gemf", GEMFFileArchive.class);
}
}
//根据文件尾缀查询是否有相应的解析方法
public static boolean isFileExtensionRegistered(String extension){
return extensionMap.containsKey(extension);
}
//注册新的尾缀以及相应的本地文件解析管理IArchiveFile子类
public static void registerArchiveFileProvider(Class<? extends IArchiveFile> provider, String fileExtension){
extensionMap.put(fileExtension, provider);
}
//根据文件尾缀查询相应的IArchiveFile
public static IArchiveFile getArchiveFile(final File pFile) {
String extension = pFile.getName();
if (extension.contains(".")){
try {
extension = extension.substring(extension.lastIndexOf(".") + 1);
}catch (Exception ex){
//just to catch any potential out of index errors
}
}
Class<? extends IArchiveFile> aClass = extensionMap.get(extension.toLowerCase());
if (aClass!=null){
try {
IArchiveFile provider = aClass.newInstance();
provider.init(pFile);
return provider;
} catch (InstantiationException e) {
Log.e(IMapView.LOGTAG, "Error initializing archive file provider " + pFile.getAbsolutePath(), e);
} catch (IllegalAccessException e) {
Log.e(IMapView.LOGTAG, "Error initializing archive file provider " + pFile.getAbsolutePath(), e);
} catch (final Exception e) {
Log.e(IMapView.LOGTAG,"Error opening archive file " + pFile.getAbsolutePath(), e);
}
}
return null;
}
//获取本工厂类能解析的数据格式
public static Set<String> getRegisteredExtensions() {
Set<String> r = new HashSet<>();
r.addAll(extensionMap.keySet());
return r;
}
}
2. IFilesystemCache
写入文件系统缓存的接口。
public interface IFilesystemCache {
//将输入流保存为文件系统某瓦片源的某瓦片
boolean saveFile(final ITileSource pTileSourceInfo, MapTile pTile,
final InputStream pStream);
//如果瓦片已经下载,返回true
boolean exists(final ITileSource pTileSourceInfo, final MapTile pTile );
//当地图引擎关闭时使用,用于执行清理活动以及终止背景线程
void onDetach();
//从缓存中移除瓦片
boolean remove(ITileSource tileSource, MapTile tile);
//获取缓存中瓦片的到期期限
Long getExpirationTimestamp(final ITileSource pTileSource, final MapTile pTile);
//获取某块瓦片对应的图
Drawable loadTile(final ITileSource pTileSource, final MapTile pTile) throws Exception;
}
2.1 TileWriter
实现了IFilesystemCache,将网片写入文件系统缓存。如果缓存超过600Mb,将会被切割自500Mb;
public class TileWriter implements IFilesystemCache {
...
}
2.1 TileWriter
实现了IFilesystemCache,将数据写为sqlite数据库中,如果瓦片下载的服务器提供的话,支持过期期限。
public class SqlTileWriter implements IFilesystemCache {
...
}
2.2 SqliteArchiveTileWriter
实现了IFilesystemCache,将瓦片写入sqlite数据库中,不支持过期期限。
public class SqliteArchiveTileWriter implements IFilesystemCache {
...
}
3. INetworkAvailablityCheck
网络可用性检查接口
public interface INetworkAvailablityCheck {
boolean getNetworkAvailable();
boolean getWiFiNetworkAvailable();
boolean getCellularDataNetworkAvailable();
boolean getRouteToPathExists(int hostAddress);
}
3.1 NetworkAvailabliltyCheck
网络可用性检查的直接实现
public class NetworkAvailabliltyCheck implements INetworkAvailablityCheck {
...
}
4. ConfigurablePriorityThreadFactory
配置线程的优先级
public class ConfigurablePriorityThreadFactory implements ThreadFactory {
private final int mPriority;
private final String mName;
public ConfigurablePriorityThreadFactory(final int pPriority, final String pName) {
mPriority = pPriority;
mName = pName;
}
@Override
public Thread newThread(final Runnable pRunnable) {
final Thread thread = new Thread(pRunnable);
thread.setPriority(mPriority);
if (mName != null) {
thread.setName(mName);
}
return thread;
}
}