osmdroid API解读(七)

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;
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值