You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OSMdroid离线地图加载异常求助:仅显示网格无瓦片

解决osmdroid离线瓦片加载失败(仅显示网格)的问题

我看了你的配置和日志,这里有几个明显的问题导致瓦片加载不出来,咱们一个个来修正:

1. 瓦片格式不匹配

你从Atlas Creator下载的瓦片是.png格式(比如335.png),但代码里XYTileSource设置的后缀是".jpg",这会让osmdroid去寻找不存在的jpg文件,自然加载失败。把后缀改成.png就行:

mapView.setTileSource(new XYTileSource("MapquestOSM", ResourceProxy.string.mapnik, 10, 13, 256, ".png", new String[] { 
    "http://otile1.mqcdn.com/tiles/1.0.0/map/", 
    "http://otile2.mqcdn.com/tiles/1.0.0/map/", 
    "http://otile3.mqcdn.com/tiles/1.0.0/map/", 
    "http://otile4.mqcdn.com/tiles/1.0.0/map/"
}));

2. 缩放级别超出你下载的瓦片范围

你下载的瓦片级别是10-13级,但代码里设置的最小级别是0、最大是18,而且你设置的初始缩放是15——这已经超过了你拥有的最高级别13,所以这个级别下没有瓦片,只能显示网格。
需要把XYTileSource的级别范围改成你实际有的10到13,同时初始缩放改成10-13之间的值,比如12:

// 修改TileSource的级别范围
new XYTileSource("MapquestOSM", ResourceProxy.string.mapnik, 10, 13, 256, ".png", ...)
// 修改初始缩放
mapController.setZoom(12);

3. 确认SD卡读取权限

如果你的设备是Android 6.0(API 23)及以上,需要动态申请READ_EXTERNAL_STORAGE权限,否则app无法读取SD卡上的tiles.zip。在Activity里添加权限申请逻辑:

private static final int REQUEST_PERMISSION = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 先检查权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_PERMISSION);
    } else {
        // 权限已获取,初始化地图
        initMap();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            initMap();
        } else {
            // 权限被拒绝,提示用户
            Toast.makeText(this, "需要读取SD卡权限才能加载离线地图", Toast.LENGTH_SHORT).show();
        }
    }
}

// 把原来的地图初始化逻辑放到这个方法里
private void initMap() {
    setContentView(R.layout.activity_main);
    MapView mapView = (MapView) findViewById(R.id.mapview);
    // ... 剩下的地图配置代码
}

4. 确认zip文件的路径和结构

osmdroid默认会读取/mnt/sdcard/osmdroid/下的zip文件,你的路径是对的,且zip解压后的根目录MapquestOSM和TileSource名字完全匹配(大小写一致),这部分没问题。

做完这些修改后,重新运行app,应该就能正常加载离线瓦片了。

内容的提问来源于stack exchange,提问作者hamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:23:09