LngLat
经度与纬度的组合,MapLibre 里所有坐标参数的统一类型。
构造与转换
| 写法 | 结果 |
|---|---|
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)。