osmdroid 离线地图加载

       osmdroid是手机地图开发者们的一个福音,但是国内资源不是太多 关于osmdroid的教程更是少之又少,我就把我自学过程中遇到的问题以及解决的方案写出来,大家一起讨论学习

一、首先下载问题

      想要下载官方的实例程序、以及源码、最新版本、基础教程、API文档都可以在osmdroid  github官网下载                       https://github.com/osmdroid/osmdroid 官网首页
相关文档,以及jar包,都可以在官网相关链接中打开,将项目push到本地后 官方提供了一个入门例子OpenStreetMapViewer

可以运行查看基础的功能(比较全面),osmdroid-android里面是源码

想下载5.6.3的jar包的话到

osmdroid-android-5.6.3.jar


二、离线地图加载

首先了解osmdroid支持的离线地图格式,官方也有介绍官方离线地图介绍  相关入门介绍里面都有,这里需要注意的有以下几

个地方:

如果是zip包的话需要放在sdcard/osmdroid目录下,调用zip包是比较简单的(一般应该不会使用这种方法,占用内存太大)

Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    map = (MapView) findViewById(R.id.map);
    map.setTileSource(new XYTileSource("YOUR MAP SOURCE", 0, 18, 256, ".jpg", new String[] {}));
    //....
    map.setUseDataConnection(false); //optional, but a good way to prevent loading from the network and test your zip loading. 
    IMapController mapController = map.getController();
    mapController.setZoom(_A ZOOM LEVEL YOU HAVE IN YOUR ZIP_);
    GeoPoint startPoint = new GeoPoint(_POSITION SOMEWHERE INSIDE YOUR MAP_);
    mapController.setCenter(startPoint);
}
 
   

官方推荐使用的是sqlite文件,引用sqlite文件的话必须注意需要使用符合osmdroid 的sqlite文件,大家可以下载sqlite可视化工
具查看数据表结构 ,我抓取得离线sqlite包:
china.sqlite
关键代码:
String strFilepath = Environment.getExternalStorageDirectory().getPath()+"/osmdroid/china.sqlite";
        File exitFile = new File(strFilepath);
        String fileName = "china";
        if(!exitFile.exists()){
            mMapView.setTileSource(TileSourceFactory.MAPNIK);
        }else {
            if(ArchiveFileFactory.isFileExtensionRegistered(fileName)){
                try {
                    OfflineTileProvider tileProvider = new OfflineTileProvider(new SimpleRegisterReceiver(this),new File[]{exitFile});
                    mMapView.setTileProvider(tileProvider);
                    String source = "";
                    IArchiveFile[] archives = tileProvider.getArchives();
                    if (archives.length>0){
                        Set tileSouce = archives[0].getTileSources();
                        if(!tileSouce.isEmpty()){
                            source = tileSouce.iterator().next();
                            mMapView.setTileSource(FileBasedTileSource.getSource(source));
                        }else {
                            mMapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
                        }
                    }else
                        mMapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
       // 关闭网络连接
        mMapView.setUseDataConnection(false)


你可能感兴趣的:(Android)