经纬志
首页 / MapLibre / API 文档

project

先看结论

经纬度到容器像素的换算:给定一个地理位置,返回它此刻在画布上的 x、y。

最后验证 2026-11-03 · MapLibre GL JS 4.x · 更新 2026-10-29 · 引用本文
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)。