WMS 1.3.0 的 BBOX 是纬度在前,图层整个错位
从 GeoServer 取同一块范围,1.1.1 正常,1.3.0 返回空白图或上下颠倒的图。
现象
请求 VERSION=1.1.1&SRS=EPSG:4326&BBOX=116.0,39.7,116.6,40.1
返回北京城区的正确影像。
把版本改成 1.3.0、参数名改成 CRS=EPSG:4326,其它不变,
返回一张 256×256 的纯白图;把 BBOX 手动调换成
39.7,116.0,40.1,116.6 后恢复,但图像上下颠倒。
原因
OGC WMS 1.3.0 规定:当 CRS 是 EPSG:4326 时,坐标轴顺序按该 CRS 的定义走,
即 纬度, 经度(北, 东)。而 1.1.1 使用 SRS 参数,
不遵循轴向定义,永远是 经度, 纬度。
BBOX=116.0,39.7,116.6,40.1 在 1.3.0 里被解释为
「南纬 116°」到「北纬 116.6°」,纬度超出 ±90°,服务端按无效范围处理,返回空白。
若数值恰好都在 ±90 内,就会得到一块南北颠倒的影像。
| 版本 | 参数名 | EPSG:4326 的 BBOX 顺序 |
|---|---|---|
| WMS 1.1.1 | SRS | minLon, minLat, maxLon, maxLat |
| WMS 1.3.0 | CRS | minLat, minLon, maxLat, maxLon |
| WMS 1.3.0 | CRS=CRS:84 | minLon, minLat, maxLon, maxLat |
排查过程
- 看请求 URL 里的
VERSION,1.1.1 和 1.3.0 的轴向规则不同。 - 把 BBOX 四个数取绝对值,若第三个大于 90,说明纬度被写到了经度的位置。
- 用
GetCapabilities查该图层的<CRS>列表,确认是否支持CRS:84。 - 在浏览器直接打开
GetMap链接,绕开前端框架,确认是请求参数问题而非图层问题。
// 1.1.1 正确
...&VERSION=1.1.1&SRS=EPSG:4326&BBOX=116.0,39.7,116.6,40.1
// 1.3.0 正确(EPSG:4326 轴序为 lat,lon)
...&VERSION=1.3.0&CRS=EPSG:4326&BBOX=39.7,116.0,40.1,116.6
// 1.3.0 想继续用 lon,lat,就改用 CRS:84
...&VERSION=1.3.0&CRS=CRS:84&BBOX=116.0,39.7,116.6,40.1
解决方案
优先让库去拼 BBOX。Leaflet 的 L.tileLayer.wms 会自动处理轴序,
自己手拼 URL 才会踩这个坑。
// Leaflet 1.9:version 交给库处理
L.tileLayer.wms('http://localhost:8080/geoserver/gis/wms', {
layers: 'gis:beijing_districts',
format: 'image/png',
transparent: true,
version: '1.3.0',
crs: L.CRS.EPSG4326
}).addTo(map);
// OpenLayers 9:同样由 source 处理
new TileWMS({
url: 'http://localhost:8080/geoserver/gis/wms',
params: { LAYERS: 'gis:beijing_districts', TILED: true },
serverType: 'geoserver',
projection: 'EPSG:4326'
});
手写请求时,把顺序单独封装成一个函数,避免在每个调用点重复判断版本。
function bboxFor(version, crs, ext) {
const [w, s, e, n] = ext; // 统一按 lon,lat
const latFirst = version === '1.3.0' && crs === 'EPSG:4326';
return latFirst ? [s, w, n, e].join(',') : [w, s, e, n].join(',');
}
验证
用同一个范围请求 1.1.1 与 1.3.0,两张影像应完全重合;
取图中心像素经纬度,应落在 116.3, 39.9 附近。
console.assert(bboxFor('1.3.0', 'EPSG:4326', [116.0, 39.7, 116.6, 40.1])
=== '39.7,116.0,40.1,116.6');
console.assert(bboxFor('1.1.1', 'EPSG:4326', [116.0, 39.7, 116.6, 40.1])
=== '116,39.7,116.6,40.1');
适用版本
| 组件 | 版本 | 说明 |
|---|---|---|
| WMS 规范 | 1.3.0(2006) | EPSG:4326 强制 lat,lon |
| GeoServer | 2.20 及以上 | 严格按规范,1.3.0 不做兼容 |
| Leaflet | 1.9.x | L.tileLayer.wms 自动处理轴序 |
| OpenLayers | 9.x | TileWMS 同样自动处理 |
经纬志(2026)。《WMS 1.3.0 的 BBOX 是纬度在前,图层整个错位》。https://www.jingweizhi.com/cookbook/wms-130-axis-order.html(访问日期 2026-11-03)。