我正在开发一个应用程序,我需要能够在离线状态下使用地图数据。我已经查找了如何使用 CacheManager 以及如何下载引用 SampleCacheDownloader.java.
的图块我使用以下代码来下载图块:
CacheManager cMgr = new CacheManager(map);
BoundingBox bBox = cMgr.extendedBoundsFromGeoPoints(currentGeoPoints, 16);
cMgr.downloadAreaAsync(this, bBox, 16, 21, new CacheManager.CacheManagerCallback() {
@Override
public void onTaskComplete() {
}
@Override
public void updateProgress(int progress, int currentZoomLevel, int zoomMin, int zoomMax) {
}
@Override
public void downloadStarted() {
}
@Override
public void setPossibleTilesInArea(int total) {
}
@Override
public void onTaskFailed(int errors) {
}
});
代码有效,就像开始下载一样。但是 TileSourceFactory 类中包含的所有切片服务器要么抛出 TileSourcePolicyException“此在线切片源不支持批量下载”(例如 MAPNIK 和 WIKIMEDIA),要么无法获取切片,因为它们不存在设置缩放级别(例如 USGS_SAT 和 USGS_TOPO)。
所以我的问题是,是否还有其他公开可用的图块服务器,或者我是否必须设置自己的服务器才能批量下载图块?或者我是否有完全错误的方法来缓存包含在具有设置缩放级别的边界框中的图块?
将 osmdroid-android lib 从 5.6.5 更新到 6.1.18 后,我遇到了同样的问题。
看起来 osm 的人决定减少主服务器的负载并强制执行地图源策略。因此,现在禁止某些图块源批量下载图块。但是,旧版本仍然有效。我认为这意味着基本上旧的网址是有效的并且允许批量下载并且不违反政策。
我想你可以配置一个类似于旧库中的图块源:
public static ITileSource MAP_DATA_SOURCE = new XYTileSource("Mapnik",
0, 19, 256, ".png", new String[] {
"http://a.tile.openstreetmap.org/",
"http://b.tile.openstreetmap.org/",
"http://c.tile.openstreetmap.org/" },
"© OpenStreetMap contributors");