You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

ArcGIS Android Runtime 100.2.0中WMTS底图图层无法显示求助

解决ArcGIS Android Runtime 100.2.0中WMTS底图不显示的问题(KVP编码服务)

我帮你梳理下这个问题的解决思路和具体实现代码,毕竟ArcGIS Android Runtime 100.2.0对仅支持KVP编码的WMTS服务配置有几个关键细节需要注意:

1. 先确认WMTS服务的核心参数

从你提供的GetCapabilities地址里,我们需要提取几个必须的参数(这些是构建图层的关键):

  • 目标图层ID:top100raster(你已经明确了)
  • 空间参考:EPSG:28992(Amersfoort / RD New)
  • 瓦片矩阵集ID:EPSG:28992(对应这个空间参考的瓦片矩阵集合)
  • 支持的图像格式:image/png(服务里该图层支持的输出格式)

2. 具体代码实现

这里提供两种可靠的实现方式,你可以根据自己的情况选择:

方式一:通过GetCapabilities自动解析服务信息

这种方式让API自动读取服务元数据,出错概率更低,推荐优先尝试:

// 初始化WMTS服务实例
String wmtsServiceUrl = "https://geodata.nationaalgeoregister.nl/tiles/service/wmts?request=getcapabilities";
WmtsService wmtsService = new WmtsService(wmtsServiceUrl);
wmtsService.loadAsync();

// 监听服务加载完成事件
wmtsService.addDoneLoadingListener(() -> {
    if (wmtsService.getLoadStatus() == LoadStatus.LOADED) {
        // 遍历服务中的所有图层,找到我们需要的top100raster
        for (WmtsLayerInfo layerInfo : wmtsService.getLayerInfos()) {
            if ("top100raster".equals(layerInfo.getId())) {
                // 创建WMTS图层
                WmtsLayer wmtsBaseLayer = new WmtsLayer(layerInfo);
                
                // 注意:必须创建对应空间参考的地图,否则图层不会显示
                ArcGISMap map = new ArcGISMap(SpatialReference.create(28992));
                // 将WMTS图层添加到底图图层集合
                map.getBasemap().getBaseLayers().add(wmtsBaseLayer);
                
                // 把地图设置到你的MapView
                mMapView.setMap(map);
                break;
            }
        }
    } else {
        // 处理服务加载失败的情况,打印错误日志排查
        Log.e("WMTS_ERROR", "加载WMTS服务失败: " + wmtsService.getLoadError().getMessage());
    }
});

方式二:手动构建WMTS图层参数(自动解析失败时用)

如果自动解析服务元数据出现问题,可以手动指定所有必要参数:

// 1. 构建目标图层的信息
WmtsLayerInfo top100LayerInfo = new WmtsLayerInfo(
        "top100raster",
        "Top100 Raster底图",
        Collections.singletonList("image/png"),
        "EPSG:28992",
        null, // 该图层无自定义样式,传null即可
        null  // 无维度信息,传null
);

// 2. 构建WMTS服务的核心信息,指定编码方式为KVP
WmtsServiceInfo serviceInfo = new WmtsServiceInfo(
        wmtsServiceUrl,
        "荷兰国家地理注册WMTS服务",
        WmtsVersion.VERSION_1_0_0,
        Collections.singletonList(top100LayerInfo),
        Collections.singletonList(buildTileMatrixSet()), // 手动构建瓦片矩阵集
        WmtsRequestEncoding.KVP // 关键!指定服务使用KVP编码
);

// 3. 创建WMTS图层并添加到地图
WmtsLayer wmtsLayer = new WmtsLayer(serviceInfo, top100LayerInfo);
ArcGISMap map = new ArcGISMap(SpatialReference.create(28992));
map.getBasemap().getBaseLayers().add(wmtsLayer);
mMapView.setMap(map);

手动构建瓦片矩阵集的辅助方法

你需要从GetCapabilities中提取对应EPSG:28992的所有瓦片矩阵信息,这里给出一个示例模板(需要补充完整所有级别):

private WmtsTileMatrixSet buildTileMatrixSet() {
    List<WmtsTileMatrix> tileMatrices = new ArrayList<>();
    
    // 以级别0为例,参数来自服务的GetCapabilities响应
    tileMatrices.add(new WmtsTileMatrix(
            "0",
            0,
            2834.640879296535, // 分辨率(米/像素)
            5669281.75859307,  // 比例尺分母
            2,                 // 瓦片宽度
            2,                 // 瓦片高度
            new Envelope(-285401.920, 22598.080, 595401.920, 903401.920, SpatialReference.create(28992)) // 图层范围
    ));
    
    // 继续添加级别1到13的瓦片矩阵信息(从GetCapabilities复制对应参数)
    
    return new WmtsTileMatrixSet(
            "EPSG:28992",
            SpatialReference.create(28992),
            tileMatrices
    );
}

3. 常见问题排查

如果图层还是不显示,检查以下几点:

  • 网络权限:确保AndroidManifest.xml中添加了<uses-permission android:name="android.permission.INTERNET" />,你的服务是HTTPS,Android 9+不需要额外配置明文流量许可。
  • 空间参考匹配:地图的空间参考必须和WMTS图层完全一致(EPSG:28992),不要用默认的WGS84(EPSG:4326),否则图层会因投影不匹配而不显示。
  • 瓦片矩阵参数正确性:手动构建时,必须保证分辨率、范围、瓦片尺寸等参数和服务完全一致,否则会出现空白或错位。
  • 图层ID拼写:确认top100raster和服务中的图层ID完全一致(大小写敏感)。
  • 服务可达性:测试设备能否正常访问该WMTS服务,排除网络或代理问题。

内容的提问来源于stack exchange,提问作者ʕ ᵔᴥᵔ ʔ

火山引擎 最新活动