经纬志
首页 / Leaflet / API 文档

CRS

先看结论

坐标参考系统:把「经纬度 → 平面 → 像素」这条链封装成一个可替换对象,地图初始化时通过 crs 选项指定。

最后验证 2026-11-03 · Leaflet 1.9.4 · 更新 2026-10-29 · 引用本文
L.map(id, { crs: L.CRS.EPSG4326 }) → Map

不传时使用 L.CRS.EPSG3857,即绝大多数在线瓦片底图所用的 Web 墨卡托。

内置实例

CRScode投影适用场景
L.CRS.EPSG3857EPSG:3857SphericalMercatorOSM 及多数在线瓦片,默认值
L.CRS.EPSG4326EPSG:4326LonLat经纬度直接出图,WMS 1.3.0 常见
L.CRS.EPSG3395EPSG:3395Mercator椭球墨卡托数据源
L.CRS.Simple—LonLat游戏地图、平面示意图、图片坐标
L.CRS.Earth—无只提供球面距离的基础实现,半径取 6371000
L.CRS—无基础对象,提供缩放、环绕与像素换算的通用逻辑

属性

属性说明
code坐标系标识,如 'EPSG:3857',用于 WMS 请求参数
projection投影对象,负责经纬度与平面坐标互换
transformation平面坐标到像素坐标的线性变换
infinite是否允许无限平移;Web 墨卡托为 true
wrapLng / wrapLat经度与纬度的环绕区间,决定地图能否横向循环

方法

方法返回说明
latLngToPoint(latlng, zoom)Point经纬度 → 世界像素坐标,原点在投影左上角
pointToLatLng(point, zoom)LatLng世界像素坐标 → 经纬度
project(latlng)Point仅做投影,输出平面坐标;由 projection 提供
unproject(point)LatLng平面坐标还原为经纬度
getProjectedBounds(zoom)Bounds | null投影范围在该缩放下的像素包围盒,无限 CRS 返回 null
scale(zoom)number该缩放级别下整个世界的像素宽度,基础实现为 256 × 2^zoom
zoom(scale)number上式的反函数
distance(latlng1, latlng2)number球面距离,单位米;来自 Earth,半径取 6371000
wrapLatLng(latlng)LatLng把超出范围的经纬度折回可显示区间
wrapLatLngBounds(bounds)LatLngBounds环绕后得到的最小范围

换用经纬度坐标系

WMS 1.3.0 的 EPSG:4326 轴顺序与瓦片网格跟 Web 墨卡托不同, 用错 CRS 的表现是图层整体偏移或上下颠倒。

var map4326 = L.map('map', {
  crs: L.CRS.EPSG4326,
  center: [39.907, 116.391],
  zoom: 4
});

L.tileLayer.wms('https://example.com/geoserver/wms', {
  layers: 'demo:province',
  format: 'image/png',
  transparent: true,
  crs: L.CRS.EPSG4326
}).addTo(map4326);

自定义 CRS

自定义坐标系至少要给出 projection 与 transformation。 下面的例子以米为平面单位,一个坐标单位对应一个像素:

var MeterCRS = L.Util.extend({}, L.CRS.Simple, {
  code: 'LOCAL:METER',
  transformation: new L.Transformation(1, 0, -1, 0)
});

var indoor = L.map('map', {
  crs: MeterCRS,
  minZoom: -2,
  maxZoom: 4
});

indoor.setView([0, 0], 0);

L.CRS.Simple 接受任意数值作为坐标,不做经纬度校验, 适合室内平面图与图片切片。换成米制平面数据时,把 transformation 的系数按实际比例调整。

距离计算用哪一个

crs.distance 只在 Earth 及其派生对象上存在。 L.CRS.Simple 没有球面距离概念,调用会得到 undefined。 业务里算地理距离更稳妥的做法是 latlng1.distanceTo(latlng2), 它固定使用 Leaflet 的球面公式,与当前地图 CRS 无关。

CRS 在地图创建时固定,运行期不能替换。 需要同时展示两种坐标系时创建两个 L.Map 实例, 不要把瓦片、要素混在同一个地图里指望 Leaflet 自动换算。

引用本文

经纬志(2026)。《CRS》。https://www.jingweizhi.com/leaflet/api/crs.html(访问日期 2026-11-03)。