CRS
坐标参考系统:把「经纬度 → 平面 → 像素」这条链封装成一个可替换对象,地图初始化时通过 crs 选项指定。
不传时使用 L.CRS.EPSG3857,即绝大多数在线瓦片底图所用的 Web 墨卡托。
内置实例
| CRS | code | 投影 | 适用场景 |
|---|---|---|---|
L.CRS.EPSG3857 | EPSG:3857 | SphericalMercator | OSM 及多数在线瓦片,默认值 |
L.CRS.EPSG4326 | EPSG:4326 | LonLat | 经纬度直接出图,WMS 1.3.0 常见 |
L.CRS.EPSG3395 | EPSG:3395 | Mercator | 椭球墨卡托数据源 |
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)。