首页 / Leaflet / API 文档
Transformation
先看结论
投影坐标到像素坐标的线性映射,用四个系数描述缩放、翻转与平移。
new L.Transformation(a, b, c, d) → Transformation
映射规则固定为 x' = a·x + b、y' = c·y + d,先不乘缩放。
构造参数
| 参数 | 作用 |
|---|---|
a | 横坐标的缩放系数 |
b | 横坐标的平移量 |
c | 纵坐标的缩放系数,通常为负值,用来翻转 y 轴方向 |
d | 纵坐标的平移量 |
方法
| 方法 | 返回 | 说明 |
|---|---|---|
transform(point, scale?) | Point | 把投影坐标换算为像素坐标;给出 scale 时结果整体乘上该系数 |
untransform(point, scale?) | Point | 反向换算,把像素坐标还原成投影坐标 |
scale 就是某一缩放级别下的像素比例,通常写成 crs.scale(zoom)。
省略时按 1 处理,得到的是未缩放的归一化像素值。
Web 墨卡托的四个系数
L.CRS.EPSG3857 的变换把投影平面上的米映射到 0–1 的像素空间:
横向除以世界宽度,纵向翻转后同样归一。系数是 0.5 / (π · R) 与 -0.5 / (π · R),
R 取球面墨卡托的长半轴。
var t = L.CRS.EPSG3857.transformation;
/* 投影原点的归一化像素值 */
var p0 = t.transform(L.point(0, 0));
console.log(p0.x, p0.y); // 0.5 0.5
/* 缩放级别 0 时世界宽度 256 像素 */
var p1 = t.transform(L.point(0, 0), L.CRS.EPSG3857.scale(0));
console.log(p1.x, p1.y); // 128 128
与 CRS 的调用链
一次经纬度到像素的换算由三步组成,Transformation 只负责最后一步:
function toPixel(crs, latlng, zoom) {
var projected = crs.projection.project(latlng); // 度 → 米
return crs.transformation.transform(projected, crs.scale(zoom));
}
var zoom = map.getZoom();
var px = toPixel(L.CRS.EPSG3857, L.latLng(39.907359, 116.391263), zoom);
Leaflet 内部即通过 crs.latLngToPoint 完成同样的事情,
再减去像素原点得到图层坐标。自己拼这条链时,别漏掉缩放系数。
自定义 CRS 里的典型写法
/* 以米为单位、y 轴向上的平面坐标系 */
var MeterCRS = L.Util.extend({}, L.CRS.Simple, {
transformation: new L.Transformation(1, 0, -1, 0),
scale: function (zoom) {
return Math.pow(2, zoom);
}
});
Simple 投影把经纬度数值直接当作平面坐标,
所以这里的 a 与 c 决定一个坐标单位对应多少像素。
系数与投影必须成对出现。
把 EPSG3857 的变换配到 LonLat 投影上,坐标会落在完全错误的位置。
自定义 CRS 时先确认投影输出的单位,再决定 a 与 c 的量级。
经纬志(2026)。《Transformation》。https://www.jingweizhi.com/leaflet/api/transformation.html(访问日期 2026-11-03)。