概述
Leaflet 中的 LatLng
类是用于表示地理坐标点的核心工具,常见于地图应用中,用于定位和操作地图上的位置。
源码分析
源码实现
LatLng.js
源码实现和介绍如下:
// `LatLng`构造函数,表示一个地理坐标点(纬度、经度、可选海拔)
export function LatLng(lat, lng, alt) {
// alt单位一般是米
if (isNaN(lat) || isNaN(lng)) {
throw new Error("Invalid LatLng object: (" + lat + ", " + lng + ")");
}
this.lat = +lat;
this.lng = +lng;
if (alt !== undefined) {
this.alt = +alt;
}
}
// LatLng原型上定义方法
LatLng.prototype = {
// 判断两个坐标是否相等,可设置最大误差范围
equals: function (obj, maxMargin) {
if (!obj) {
return false;
}
obj = toLatLng(obj);
var margin = Math.max(
Math.abs(this.lat - obj.lat),
Math.abs(this.lng - obj.lng)
);
return margin <= (maxMargin === undefined ? 1.0e-9 : maxMargin);
},
// 格式化坐标字符串,可选小数点精度,默认全部显示
toString: function (precision) {
return (
"LatLng(" +
Util.formatNum(this.lat, precision) +
", " +
Util.formatNum(this.lng, precision) +
")"
);
},
// 计算两坐标间的地球表面距离(基于`Earth`模块)
distanceTo: function (other) {
return Earth.distance(this, toLatLng(other));
},
// 生成以当前点为中心,边长为sizeInMeters 米的正方形地理近似范围
wrap: function (sizeInMeters) {
var latAccuracy = (180 * sizeInMeters) / 40075017, // 40075017米是地球赤道的长度
lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);
return toLatLngBounds(
[this.lat - latAccuracy, this.lng - lngAccuracy],
[this.lat + latAccuracy, this.lng + lngAccuracy]
);
},
// 拷贝当前坐标对象
clone: function () {
return new LatLng(this.lat, this.lng, this.alt);
},
};
// 灵活构造`LatLng`对象,将多种输入格式统一转换为`LatLng`实例
export function toLatLng(a, b, c) {
if (a instanceof LatLng) {
return a;
}
if (Util.isArray(a) && typeof a[0] !== "object") {
if (a.length === 3) {
return new LatLng(a[0], a[1], a[2]);
}
if (a.length === 2) {
return new LatLng(a[0], a[1]);
}
return null;
}
if (a === undefined || a === null) {
return a;
}
if (typeof a === "object" && "lat" in a) {
return new LatLng(a.lat, "lng" in a ? a.lng : a.lon, a.alt);
}
if (b === undefined) {
return null;
}
return new LatLng(a, b, c);
}
总结
LatLng
类在 Leaflet 中是一个重要的基础类,用于表示和操作地理坐标点。它提供了一系列方法来处理坐标的加减乘除、取整、距离计算等操作,使得在地图应用中进行坐标计算和布局变得更加方便和高效。