Loading... > 一入前端深似海,从此晨昏是路人。 地球上同一个地理位置的经纬度,在不同的坐标系中,会有少许偏移,国内目前常见的坐标系主要分为三种: 1. 地球坐标系——WGS84:常见于 GPS 设备,Google 地图等国际标准的坐标体系。 2. 火星坐标系——GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系。 3. 百度坐标系——BD-09:百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理。 ```javascript /** * @name gcjToBd * @desc 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 即谷歌、高德 转 百度 * @param {Num} lat 火星坐标系经度 * @param {Num} lng 火星坐标系纬度 * @return {Array} [bd_lat, bd_lng] 百度坐标系 (BD-09) 经纬度 */ function gcjToBd(lat,lng){ let x_pi = Math.PI * 3000.0 / 180.0; let z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat* x_pi); let temp = Math.atan2(lat, lnglng) + 0.000003 * Math.cos(lng * x_pi); let bd_lng = z * Math.cos(temp) + 0.0065; let bd_lat = z * Math.sin(temp) + 0.006; return [bd_lat, bd_lng] } /** * @name bdToGcj * @desc 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 即 百度 转 谷歌、高德 * @param {Num} lat 百度坐标系经度 * @param {Num} lng 百度坐标系纬度 * @return {Array} [gcj_lat, gcj_lng] 火星坐标系 (GCJ-02) 经纬度 */ function bdToGcj(lat,lng){ let x_pi = Math.PI * 3000.0 / 180.0; let x = lng - 0.0065; let y = lat - 0.006; let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); let temp = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); let gcj_lng = z * Math.cos(temp); let gcj_lat = z * Math.sin(temp); // gcj_lng = Number(gcj_lng.toString().substring(0,9)); // 坐标位数格式化(如对位数有限制可使用) // gcj_lat = Number(gcj_lat.toString().substring(0,9)); return [gcj_lat, gcj_lng]; } ``` **坐标转换存在误差,建议使用官方的转换API,上述为一种解决方案但并非最优** **经纬度的数据类型尽量保证为Number类型,不然在很多场景会有问题,虽然js是弱类型语言,但大多数的框架,其内部对数据类型都有严格的控制,比如第三方地图导航、echarts图表之类,所以养成一个良好的变量构建习惯还是很重要的** 最后修改:2021 年 01 月 28 日 04 : 46 PM © 允许规范转载 赞赏 你的每一次赞赏都是我继续创作下去的动力,ღ( ´・ᴗ・` )比心 ×Close 赞赏作者 扫一扫支付 支付宝支付 微信支付
|´・ω・)ノ
这恒河里