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

使用GeoTools访问WMTS服务解析XML时触发栈溢出问题

解决GeoTools 18.3访问PDOK WMTS服务时JMapFrame相关报错问题

我来帮你分析并解决这个问题:

你正在尝试调用荷兰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...

问题根源分析

从日志和你的环境描述来看,核心问题很明确:

  1. 服务连接本身是正常的——日志显示已经成功获取并缓存了WMTS的GetCapabilities响应Schema,说明和PDOK服务的通信没有障碍;
  2. 报错的直接原因是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:55:35