经纬志
首页 / 实战手册 / 坐标与投影

WMS 1.3.0 的 BBOX 是纬度在前,图层整个错位

先看结论

从 GeoServer 取同一块范围,1.1.1 正常,1.3.0 返回空白图或上下颠倒的图。

最后验证 2026-11-03 · 多技术栈 · 更新 2026-10-29 · 引用本文

现象

请求 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.1SRSminLon, minLat, maxLon, maxLat
WMS 1.3.0CRSminLat, minLon, maxLat, maxLon
WMS 1.3.0CRS=CRS:84minLon, minLat, maxLon, maxLat

排查过程

  1. 看请求 URL 里的 VERSION,1.1.1 和 1.3.0 的轴向规则不同。
  2. 把 BBOX 四个数取绝对值,若第三个大于 90,说明纬度被写到了经度的位置。
  3. 用 GetCapabilities 查该图层的 <CRS> 列表,确认是否支持 CRS:84。
  4. 在浏览器直接打开 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
GeoServer2.20 及以上严格按规范,1.3.0 不做兼容
Leaflet1.9.xL.tileLayer.wms 自动处理轴序
OpenLayers9.xTileWMS 同样自动处理
引用本文

经纬志(2026)。《WMS 1.3.0 的 BBOX 是纬度在前,图层整个错位》。https://www.jingweizhi.com/cookbook/wms-130-axis-order.html(访问日期 2026-11-03)。