经纬志
首页 / MapLibre / API 文档

LngLat

先看结论

经度与纬度的组合,MapLibre 里所有坐标参数的统一类型。

最后验证 2026-11-03 · MapLibre GL JS 4.x · 更新 2026-10-27 · 引用本文
new maplibregl.LngLat(lng, lat) → LngLat

构造与转换

写法结果
new maplibregl.LngLat(116.39, 39.90)直接构造,只接受两个参数
maplibregl.LngLat.convert([116.39, 39.90])数组转 LngLat
maplibregl.LngLat.convert({lng: 116.39, lat: 39.90})对象转 LngLat,lon 也可作键名
maplibregl.LngLat.convert(existing)已是 LngLat 时原样返回,不复制

构造函数参数顺序固定为经度在前。写成 (39.90, 116.39) 不会报错,但会得到赤道附近的一个点。

多数接收坐标的方法同时接受数组与 LngLat 对象,内部自动转换。 需要显式判断类型或做运算时,再用 LngLat.convert 统一。

常用方法

方法返回值说明
toArray()[lng, lat]转成数组,便于交给不接收 LngLat 的函数
toString()字符串格式为 "LngLat(lng, lat)",不是纯数字串
distanceTo(other)数字haversine 距离,单位米
wrap()LngLat把经度归一化到 -180–180,返回新对象

示例

var a = new maplibregl.LngLat(116.391263, 39.907359);
var b = new maplibregl.LngLat(121.473701, 31.230416);

console.log(a.toArray());       // [116.391263, 39.907359]
console.log(a.distanceTo(b));   // 约 1 067 000,单位米
console.log(a.toString());      // "LngLat(116.391263, 39.907359)"

var wrapped = new maplibregl.LngLat(286.0251, 39.9).wrap();
console.log(wrapped.lng);       // -73.9749

distanceTo 与 Turf 的差异

distanceTo 返回米,使用球面公式; turf.distance 默认返回公里。两者数值接近, 但不要在同一条链路里混用单位。 批量计算距离时用 Turf 更灵活,单个交互反馈用 distanceTo 更省依赖。

范围用 LngLatBounds

矩形范围由 maplibregl.LngLatBounds 表示, 构造时接受 [[西, 南], [东, 北]], 与 turf.bbox 的输出顺序一致,重排一层即可互转。

var bounds = new maplibregl.LngLatBounds([116.2, 39.8], [116.6, 40.1]);

console.log(bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth());
map.fitBounds(bounds, { padding: 40 });

map.getBounds() 返回的也是这个类型, 用 toArray() 得到两个角点,写入接口或与后端比对都方便。

经度可以不归一化。为了跨 180 度经线连续显示, MapLibre 内部允许超过 ±180 的经度值,用 wrap() 可以得到标准区间。判断位置是否越界时,先 wrap 再比较。

引用本文

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