使用GeoTools访问WMTS服务解析XML时触发栈溢出问题
我来帮你分析并解决这个问题:
你正在尝试调用荷兰PDOK平台的免费WMTS红外影像服务(服务地址:http://geodata.nationaalgeoregister.nl/luchtfoto/infrarood/wmts?request=GetCapabilities&service=WMTS),使用环境为Java 1.8u131 x86 + GeoTools 18.3模块,但在使用JMapFrame时触发报错,部分日志信息如下:
May 07, 2018 4:37:29 PM org.geotools.xml.resolver.SchemaCache resolveLocation INFO: Cached XML schema: http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd
May 07, 2018 4:37:30 PM org.geotools.xml.re...
问题根源分析
从日志和你的环境描述来看,核心问题很明确:
- 服务连接本身是正常的——日志显示已经成功获取并缓存了WMTS的GetCapabilities响应Schema,说明和PDOK服务的通信没有障碍;
- 报错的直接原因是GeoTools 18.3的JMapFrame组件依赖Swing,但你的环境不支持Swing,这是不可调和的组件依赖矛盾。
可行解决方案
针对这个问题,给你几个具体的解决方向:
替换可视化组件,避开Swing依赖
如果需要可视化地图,建议改用GeoTools中不依赖Swing的方案:比如使用GeoTools的JavaFX扩展模块(需要额外引入依赖)来实现地图展示,或者如果是后端场景,直接通过MapContent结合图像渲染API生成地图图片输出,完全跳过Swing组件。绕开可视化,直接获取WMTS瓦片数据
如果你的需求不是展示地图,而是获取瓦片数据做后续处理,可以直接使用GeoTools的WMTS客户端API来请求瓦片,彻底避开JMapFrame。这里给你一段示例代码参考:
import org.geotools.data.wmts.WMTSClient; import org.geotools.data.wmts.model.WMTSCapabilities; import org.geotools.data.wmts.model.Layer; import org.geotools.data.wmts.request.GetTileRequest; import java.net.URL; import java.io.InputStream; public class WMTSExample { public static void main(String[] args) throws Exception { // 初始化WMTS客户端 WMTSClient client = new WMTSClient(new URL("http://geodata.nationaalgeoregister.nl/luchtfoto/infrarood/wmts?request=GetCapabilities&service=WMTS")); WMTSCapabilities capabilities = client.getCapabilities(); // 获取目标图层(需要替换为PDOK服务中实际的图层名) Layer targetLayer = capabilities.getLayerByName("luchtfoto_infrarood"); // 构建瓦片请求参数 GetTileRequest tileRequest = new GetTileRequest(); tileRequest.setLayer(targetLayer); tileRequest.setFormat("image/jpeg"); // PDOK红外影像支持的格式 tileRequest.setTileMatrixSet(capabilities.getTileMatrixSetById("EPSG:28992")); // PDOK默认坐标系 tileRequest.setTileMatrix("5"); // 缩放级别,可根据需求调整 tileRequest.setTileRow(10); tileRequest.setTileCol(10); // 获取瓦片输入流 InputStream tileStream = client.getTile(tileRequest); // 后续可将流写入文件或进行图像处理 } }
- 升级GeoTools版本
GeoTools 18.3是2018年的旧版本,后续版本对非Swing环境的支持更完善,也修复了不少旧Bug。如果环境允许,建议升级到较新的稳定版本(比如25.x或26.x系列,注意和Java版本的兼容性),能减少这类依赖问题的出现。
内容的提问来源于stack exchange,提问作者Houtman

