地图工具类:地图坐标系转换、获取点位经纬度信息
transform.js
function transformLat(x, y) {
let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += ((20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0) / 3.0;
ret += ((20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin((y / 3.0) * Math.PI)) * 2.0) / 3.0;
ret += ((160.0 * Math.sin((y / 12.0) * Math.PI) + 320 * Math.sin((y * Math.PI) / 30.0)) * 2.0) / 3.0;
return ret;
}
function transformLng(x, y) {
let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += ((20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0) / 3.0;
ret += ((20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin((x / 3.0) * Math.PI)) * 2.0) / 3.0;
ret += ((150.0 * Math.sin((x / 12.0) * Math.PI) + 300.0 * Math.sin((x / 30.0) * Math.PI)) * 2.0) / 3.0;
return ret;
}
export function wgs84ToGcj02(lng, lat) {
if (outOfChina(lng, lat)) {
return [lng, lat];
}
let dLat = transformLat(lng - 105.0, lat - 35.0);
let dLng = transformLng(lng - 105.0, lat - 35.0);
const radLat = (lat / 180.0) * Math.PI;
let magic = Math.sin(radLat);
magic = 1 - 0.00669342162296594323 * magic * magic;
const sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / (((6378245 * (1 - 0.00669342162296594323)) / (magic * sqrtMagic)) * Math.PI);
dLng = (dLng * 180.0) / ((6378245 / sqrtMagic) * Math.cos(radLat) * Math.PI);
const mgLat = lat + dLat;
const mgLng = lng + dLng;
return [mgLng, mgLat];
}
export function gcj02ToWgs84(lng, lat) {
if (outOfChina(lng, lat)) {
return [lng, lat];
}
let dLat = transformLat(lng - 105.0, lat - 35.0);
let dLng = transformLng(lng - 105.0, lat - 35.0);
const radLat = (lat / 180.0) * Math.PI;
let magic = Math.sin(radLat);
magic = 1 - 0.00669342162296594323 * magic * magic;
const sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / (((6378245 * (1 - 0.00669342162296594323)) / (magic * sqrtMagic)) * Math.PI);
dLng = (dLng * 180.0) / ((6378245 / sqrtMagic) * Math.cos(radLat) * Math.PI);
const mgLat = lat - dLat;
const mgLng = lng - dLng;
return [mgLng, mgLat];
}
function outOfChina(lng, lat) {
return !(lng > 72.004 && lng < 137.8347 && lat > 0.8293 && lat < 55.8271);
}
/* 递归处理数组:WGS84 转 GCJ02 */
export function deepWgs84ToGcj02(arr) {
return arr.map((item) => {
if (Array.isArray(item)) {
if (item.length === 2) {
// 处理长度为2的数组 [lng, lat]
const [lng, lat] = wgs84ToGcj02(item[0], item[1]);
return [lng, lat];
} else {
// 递归处理其他数组
return deepWgs84ToGcj02(item);
}
} else if (typeof item === 'object' && item !== null && 'lng' in item && 'lat' in item) {
// 处理对象 { lng, lat }
const [lng, lat] = wgs84ToGcj02(item.lng, item.lat);
return { ...item, lng, lat };
} else if (typeof item === 'object' && item !== null && Array.isArray(item.coordinates)) {
// 处理包含 coordinates 属性的对象
return { ...item, coordinates: deepWgs84ToGcj02(item.coordinates) };
}
return item;
});
}
/* 递归处理数组:GCJ02 转 WGS84 */
export function deepGcj02ToWgs84(arr) {
return arr.map((item) => {
if (Array.isArray(item)) {
if (item.length === 2) {
// 处理长度为2的数组 [lng, lat]
const [lng, lat] = gcj02ToWgs84(item[0], item[1]);
return [lng, lat];
} else {
// 递归处理其他数组
return deepGcj02ToWgs84(item);
}
} else if (typeof item === 'object' && item !== null && 'lng' in item && 'lat' in item) {
// 处理对象 { lng, lat }
const [lng, lat] = gcj02ToWgs84(item.lng, item.lat);
return { ...item, lng, lat };
} else if (typeof item === 'object' && item !== null && Array.isArray(item.coordinates)) {
// 处理包含 coordinates 属性的对象
return { ...item, coordinates: deepGcj02ToWgs84(item.coordinates) };
}
return item;
});
}
/* 获取经纬度 */
export const getLngLatOfPoint = (item) => {
if (Array.isArray(item) && item.length === 2) return item;
if (typeof item === 'object' && item !== null && 'lng' in item && 'lat' in item) {
return [item.lng, item.lat];
}
if (typeof item === 'object' && item !== null && Array.isArray(item.coordinates)) {
return getLngLatOfPoint(item.coordinates);
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类