vue 腾讯地图经纬度转高德地图经纬度

ai写的记录一下

使用方法

javascript 复制代码
const gcj = await this.wgs84ToGcj02(info.latitude, info.longitude);
				// console.log(gcj.lng, gcj.lat,'gcj');

函数

javascript 复制代码
/**
			 * 判断是否在国内,不在国内则不做偏移
			 * @param {Number} lng 经度
			 * @param {Number} lat 纬度
			 * @returns {Boolean}
			 */
			isInChina(lng, lat) {
				return (
					lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55
				);
			},
			
			/**
			 * 计算偏移量
			 * @param {Number} lng 经度
			 * @param {Number} lat 纬度
			 * @returns {Object} 偏移后的经纬度
			 */
			calOffset(lng, lat) {
				const pi = Math.PI;
				const a = 6378245.0; // 长半轴
				const ee = 0.00669342162296594323; // 偏心率平方
				let dLat = this.transformLat(lng - 105.0, lat - 35.0);
				let dLng = this.transformLng(lng - 105.0, lat - 35.0);
				const radLat = lat / 180.0 * pi;
				let magic = Math.sin(radLat);
				magic = 1 - ee * magic * magic;
				const sqrtMagic = Math.sqrt(magic);
				dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
				dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
				return {
					lat: dLat,
					lng: dLng
				};
			},
			
			/**
			 * 纬度转换
			 * @param {Number} lng 经度
			 * @param {Number} lat 纬度
			 * @returns {Number} 转换后的纬度
			 */
			transformLat(lng, lat) {
				let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(
					lng));
				ret += (20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0;
				ret += (20.0 * Math.sin(lat * Math.PI) + 40.0 * Math.sin(lat / 3.0 * Math.PI)) * 2.0 / 3.0;
				ret += (160.0 * Math.sin(lat / 12.0 * Math.PI) + 320 * Math.sin(lat * Math.PI / 30.0)) * 2.0 / 3.0;
				return ret;
			},
			
			/**
			 * 经度转换
			 * @param {Number} lng 经度
			 * @param {Number} lat 纬度
			 * @returns {Number} 转换后的经度
			 */
			transformLng(lng, lat) {
				let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
				ret += (20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0;
				ret += (20.0 * Math.sin(lng * Math.PI) + 40.0 * Math.sin(lng / 3.0 * Math.PI)) * 2.0 / 3.0;
				ret += (150.0 * Math.sin(lng / 12.0 * Math.PI) + 300.0 * Math.sin(lng / 30.0 * Math.PI)) * 2.0 / 3.0;
				return ret;
			},
			
			/**
			 * WGS84 转 GCJ02(腾讯WGS84 → 高德GCJ02)
			 * @param {Number} wgsLat WGS84纬度
			 * @param {Number} wgsLng WGS84经度
			 * @returns {Object} GCJ02经纬度
			 */
			wgs84ToGcj02(wgsLat, wgsLng) {
				// 非中国区域不转换
				if (!this.isInChina(wgsLng, wgsLat)) {
					return {
						lat: wgsLat,
						lng: wgsLng
					};
				}
				const offset = this.calOffset(wgsLng, wgsLat);
				return {
					lat: wgsLat + offset.lat,
					lng: wgsLng + offset.lng
				};
			},
相关推荐
万少21 分钟前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
橙序员小站3 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名5 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫5 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊5 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter5 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折6 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_6 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
不会敲代码16 小时前
前端组件化样式隔离实战:React CSS Modules、styled-components 与 Vue scoped 对比
css·vue.js·react.js
Angelial6 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js