osmdroid离线地图瓦片使用
本文档定义了在没有网络连接时使用osmdroid。
支持的离线数据格式
osmdroid支持多种不同类型的离线缓存瓦片。
- sqlite数据库(osmdroid推荐)
- osmdroid ZIP
- MBTiles
- FEMF
- GeoPackage(开发中)
创建离线缓存瓦片
你有多种不同的选择。
OSM Map Tile Packager ( OSM地图瓦片打包器)
osmdroid提供了OSM Map Tile Packager,用于下载并存储瓦片以供离线使用。详见readme.md。
Mobile Atlas Creator (MOBAC,移动地图创建器)
MOBAC是最早的用于支持大量地地图源输入并输出多种数据格式的工具,而且是开源的。
通常的流程:
- 创建新的、osmd所支持类型的atlas
- 选择地图源
- 选择一个你想要的区域及你要求的缩放等级
- 点击“Add Selection”
- 点击“Create Atlas”
- 一旦完成,复制atlas文件(.sqlite .zip等)到你的运行设备的/sdcard/osmdroid/目录下
- 告诉你的osmdroid不要使用网络连接并设置该地图挖填源
Maperitive.net
Maperitive支持从OSM数据API生成瓦片图像,并作为MOBAC替换物(已经被openstreetmap.org屏蔽)。
在设备中使用osmdroid的Cache Manager(> version 5.2 )
缓存管理者提供了对已下载的瓦片缓存的程序化连接。也可以用于穿件瓦片缓存。这里有两个关键点:
- cache of downloaded tiles 是osmdroid从在线瓦片资源下载的已过期的瓦片缓存。默认的过期是指在线瓦片资源离线两周以上。Cache大小受限于使用者设备存储空间的允许。这两个设置都可以通过OpenStreetMapTileProvideConstants(版本 < 5.6,5.6及更新的版本使用Configuration.getInstance()结构)来变更和重写。
- Tile Archives 是永久性存储,从来不会过期。这适合离线使用者的需求,但您必须注意在线瓦片源使用权限。许多在线瓦片源禁止创建永久性的瓦片存储。请仔细查看使用者权限。
Cache Manager可以执行一系列任务:
- 下载限定范围和zoom水平的所有瓦片
- 下载横穿点集的和确定zoom水平的所有瓦片
- 清除一定范围、zoom等级、瓦片源的所有瓦片
- 清除一定点集范围的所有瓦片
Cache Manager实例
实例应用源
- 从文件系统缓存导入新的sqlite based cache
- 清除所有的cache
- 清除特殊的瓦片源
- 创建瓦片archive
- cache一定范围的瓦片
关于瓦片源名称的重点
当下载地图源使用MOBAC和使用下面两种格式中的一种
- osmdroid SQLite
- osmdroid ZIP
在两种情况中,地图源名称被编码为database或zip文件格式,并被唯一保存(每个缓存多于一个瓦片源)。因此你在请求离线瓦片时告诉你的osmdroid瓦片源的名称。
@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);
}
Gotchas
MOBAC对一次性下载的瓦片数有限制,这可以通过修改源码来改变。
当瓦片特别多时,MOBAC可能占用太多的内存。至少在V1.8到至少V1.9.x,算法导致内存中会尽量的缓存数据,知道占满JVM ceiling,然后快速插入数据库。虽然这使数据尽可能快的插入数据库,但也可能导致稳定性的问题。
OSMBonusPack
OSMBonusPack是osmdroid的一个插件型android library,能够用于下载和缓存地图瓦片。详见Cache Manager。