GeoServer2.13配置GeoWebcache后WMTS请求报TileOutOfRange异常求助
这个问题的原因从错误信息里已经说得很直白了:你请求的TileCol=40超出了当前瓦片矩阵(EPSG:4326:7)允许的列范围(最小值41,最大值44)。下面给你几个实用的解决思路:
1. 先确认图层的实际地理范围
GWC是根据你发布的Public_Geo:PumpJack图层的**边界范围(Bounding Box)**来计算每个瓦片级别下的有效行列号的。如果你的图层本身覆盖的区域比较小,那么在级别7时,只有列41到44对应的瓦片包含图层数据,列40的区域根本不在图层范围内,所以GWC会直接返回这个错误。
你可以登录GeoServer后台,找到这个图层,进入「发布」标签页,查看「Bounding Boxes」部分的内容,重点确认EPSG:4326坐标系下的范围是否符合你的预期。如果范围设置得太小,调整到覆盖你需要的区域即可。
2. 检查OpenLayers的WMTS图层配置
大概率是你的OpenLayers客户端里,WMTS源的瓦片矩阵集定义和GWC服务端的不一致,导致客户端计算出的行列号不在服务端的有效范围内。
最稳妥的办法是直接从GWC获取WMTS的Capabilities文档(访问服务端的/geoserver/gwc/service/wmts?request=GetCapabilities接口),然后让OpenLayers根据这份Capabilities自动配置图层,这样能保证客户端和服务端的瓦片规则完全对齐。
给你一段参考代码(适配OpenLayers 5及以上版本):
// 先获取WMTS Capabilities fetch('https://geoserver.althing.io/geoserver/gwc/service/wmts?request=GetCapabilities') .then(response => response.text()) .then(text => new ol.format.WMTSCapabilities().read(text)) .then(capabilities => { // 创建WMTS图层 const wmtsLayer = new ol.layer.Tile({ source: new ol.source.WMTS({ url: 'https://geoserver.althing.io/geoserver/gwc/service/wmts', params: { 'LAYERS': 'Public_Geo:PumpJack', 'TILEMATRIXSET': 'EPSG:4326' }, serverType: 'geoserver', projection: 'EPSG:4326', tileGrid: ol.tilegrid.createFromCapabilitiesMatrixSet(capabilities, 'EPSG:4326') }) }); // 将图层添加到地图 map.addLayer(wmtsLayer); });
3. 按需调整GWC的缓存范围(可选)
如果你确实需要请求列40的瓦片(哪怕该区域没有图层数据,只想返回空白瓦片),可以修改GWC中该图层的缓存范围,把边界扩大到包含列40对应的地理区域。
操作步骤:在GeoServer后台进入「GeoWeb Cache」→「图层」,找到Public_Geo:PumpJack,编辑它的「缓存范围」,设置更大的Bounding Box即可。不过要注意,这样会生成更多空瓦片,可能浪费存储空间,建议谨慎操作。
4. 快速验证服务是否正常
你可以先手动请求一个有效范围内的瓦片来测试服务是否能正常工作,比如把TileCol改成41,保持TileRow=39:
https://geoserver.althing.io/geoserver/gwc/service/wmts?layer=Public_Geo%3APumpJack&style=&tilematrixset=EPSG%3A4326&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fpng&TileMatrix=EPSG%3A4326%3A7&TileCol=41&TileRow=39
如果这个请求能正常返回瓦片,说明服务本身没问题,问题就出在客户端的行列号计算或者图层范围配置上。
内容的提问来源于stack exchange,提问作者cj devin

