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,提问作者ʕ ᵔᴥᵔ ʔ




