首页 / MapLibre / API 文档
project
先看结论
经纬度到容器像素的换算:给定一个地理位置,返回它此刻在画布上的 x、y。
map.project(lnglat) → Point
返回的 Point 以地图容器左上角为原点,单位是 CSS 像素。
参数与返回
| 项 | 说明 |
|---|---|
lnglat | 经纬度,可为 [lng, lat]、LngLat 或带 lng/lat 的对象 |
返回 Point.x | 距容器左边的像素数 |
返回 Point.y | 距容器顶部的像素数 |
结果随视图实时变化:平移、缩放、旋转、改倾斜都会改变它。 任何缓存过的像素值都必须在地图变化后重新计算。
给 HTML 元素定位
var label = document.createElement('div');
label.className = 'site-label';
label.textContent = '站点 A';
map.getContainer().appendChild(label);
var lnglat = [116.391263, 39.907359];
function placeLabel() {
var p = map.project(lnglat);
label.style.transform =
'translate(-50%, -100%) translate(' + p.x + 'px, ' + p.y + 'px)';
}
placeLabel();
map.on('move', placeLabel);
move 在拖动与动画期间持续触发,跟着它更新位置能与地图保持同步。
元素本身要设 position: absolute 并位于容器内。
判断是否在视野内
function isVisible(lnglat) {
var p = map.project(lnglat);
var w = map.getContainer().clientWidth;
var h = map.getContainer().clientHeight;
return p.x >= 0 && p.x <= w && p.y >= 0 && p.y <= h;
}
地图旋转后视野是倾斜的四边形,用上面的矩形判断会把角落误判为可见。
需要严格判断时改用 map.getBounds().contains(lnglat)。
与相关方法的关系
| 方法 | 方向 | 用途 |
|---|---|---|
map.project(lnglat) | 经纬度 → 像素 | 覆盖物定位 |
map.unproject(point) | 像素 → 经纬度 | 鼠标位置换算 |
map.getBounds() | — | 当前视口的地理范围 |
不要与瓦片坐标混用
project 给的是屏幕像素,不是瓦片坐标,也不是墨卡托米。
需要世界坐标时用 map.transform 内部的换算或 MercatorCoordinate,
后者常用于自定义 WebGL 图层。
倾斜视角下同一经纬度只有一个投影点。
但不同高度的物体(例如拉伸的三维建筑)在屏幕上会偏移,
project 只按地表计算,不考虑高程。三维标注要自己做高程补偿。
经纬志(2026)。《project》。https://www.jingweizhi.com/maplibre/api/project.html(访问日期 2026-11-03)。