微信小程序地图定位GPS转腾讯地图的坐标系
发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,参考:http://www.qchcloud.cn/tn/article/23参考//svar GPS = {PI: 3.14159265358979324,x_pi: 3.1415926535897
千家信息网最后更新 2025年12月04日微信小程序地图定位GPS转腾讯地图的坐标系
参考:
http://www.qchcloud.cn/tn/article/23
参考
//s
var GPS = {
PI: 3.14159265358979324,
x_pi: 3.14159265358979324 3000.0 / 180.0,
delta: function (lat, lon) {
// Krasovsky 1940
//
// a = 6378245.0, 1/f = 298.3
// b = a (1 - f)
// ee = (a^2 - b^2) / a^2;
var a = 6378245.0; // a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
var ee = 0.00669342162296594323; // ee: 椭球的偏心率。
var dLat = this.transformLat(lon - 105.0, lat - 35.0);
var dLon = this.transformLon(lon - 105.0, lat - 35.0);
var radLat = lat / 180.0 this.PI;
var magic = Math.sin(radLat);
magic = 1 - ee magic magic;
var sqrtMagic = Math.sqrt(magic);
dLat = (dLat 180.0) / ((a (1 - ee)) / (magic sqrtMagic) this.PI);
dLon = (dLon 180.0) / (a / sqrtMagic Math.cos(radLat) this.PI);
return { 'lat': dLat, 'lon': dLon };
},
//WGS-84 to GCJ-02 gcj_encrypt: function (wgsLat, wgsLon) { if (this.outOfChina(wgsLat, wgsLon)) return { 'lat': wgsLat, 'lon': wgsLon }; var d = this.delta(wgsLat, wgsLon); return { 'lat': wgsLat + d.lat, 'lon': wgsLon + d.lon }; }, //GCJ-02 to WGS-84 gcj_decrypt: function (gcjLat, gcjLon) { if (this.outOfChina(gcjLat, gcjLon)) return { 'lat': gcjLat, 'lon': gcjLon }; var d = this.delta(gcjLat, gcjLon); return { 'lat': gcjLat - d.lat, 'lon': gcjLon - d.lon }; }, //GCJ-02 to WGS-84 exactly gcj_decrypt_exact: function (gcjLat, gcjLon) { var initDelta = 0.01; var threshold = 0.000000001; var dLat = initDelta, dLon = initDelta; var mLat = gcjLat - dLat, mLon = gcjLon - dLon; var pLat = gcjLat + dLat, pLon = gcjLon + dLon; var wgsLat, wgsLon, i = 0; while (1) { wgsLat = (mLat + pLat) / 2; wgsLon = (mLon + pLon) / 2; var tmp = this.gcj_encrypt(wgsLat, wgsLon) dLat = tmp.lat - gcjLat; dLon = tmp.lon - gcjLon; if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold)) break; if (dLat > 0) pLat = wgsLat; else mLat = wgsLat; if (dLon > 0) pLon = wgsLon; else mLon = wgsLon; if (++i > 10000) break; } //console.log(i); return { 'lat': wgsLat, 'lon': wgsLon }; }, //GCJ-02 to BD-09 bd_encrypt: function (gcjLat, gcjLon) { var x = gcjLon, y = gcjLat; var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi); var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi); bdLon = z * Math.cos(theta) + 0.0065; bdLat = z * Math.sin(theta) + 0.006; return { 'lat': bdLat, 'lon': bdLon }; }, //BD-09 to GCJ-02 bd_decrypt: function (bdLat, bdLon) { var x = bdLon - 0.0065, y = bdLat - 0.006; var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi); var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi); var gcjLon = z * Math.cos(theta); var gcjLat = z * Math.sin(theta); return { 'lat': gcjLat, 'lon': gcjLon }; }, //WGS-84 to Web mercator //mercatorLat -> y mercatorLon -> x mercator_encrypt: function (wgsLat, wgsLon) { var x = wgsLon * 20037508.34 / 180.; var y = Math.log(Math.tan((90. + wgsLat) * this.PI / 360.)) / (this.PI / 180.); y = y * 20037508.34 / 180.; return { 'lat': y, 'lon': x }; /* if ((Math.abs(wgsLon) > 180 || Math.abs(wgsLat) > 90)) return null; var x = 6378137.0 * wgsLon * 0.017453292519943295; var a = wgsLat * 0.017453292519943295; var y = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a))); return {'lat' : y, 'lon' : x}; //*/ }, // Web mercator to WGS-84 // mercatorLat -> y mercatorLon -> x mercator_decrypt: function (mercatorLat, mercatorLon) { var x = mercatorLon / 20037508.34 * 180.; var y = mercatorLat / 20037508.34 * 180.; y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.)) - this.PI / 2); return { 'lat': y, 'lon': x }; /* if (Math.abs(mercatorLon) < 180 && Math.abs(mercatorLat) < 90) return null; if ((Math.abs(mercatorLon) > 20037508.3427892) || (Math.abs(mercatorLat) > 20037508.3427892)) return null; var a = mercatorLon / 6378137.0 * 57.295779513082323; var x = a - (Math.floor(((a + 180.0) / 360.0)) * 360.0); var y = (1.5707963267948966 - (2.0 * Math.atan(Math.exp((-1.0 * mercatorLat) / 6378137.0)))) * 57.295779513082323; return {'lat' : y, 'lon' : x}; //*/ }, // two point's distance distance: function (latA, lonA, latB, lonB) { var earthR = 6371000.; var x = Math.cos(latA * this.PI / 180.) * Math.cos(latB * this.PI / 180.) * Math.cos((lonA - lonB) * this.PI / 180); var y = Math.sin(latA * this.PI / 180.) * Math.sin(latB * this.PI / 180.); var s = x + y; if (s > 1) s = 1; if (s < -1) s = -1; var alpha = Math.acos(s); var distance = alpha * earthR; return distance; }, outOfChina: function (lat, lon) { if (lon < 72.004 || lon > 137.8347) return true; if (lat < 0.8293 || lat > 55.8271) return true; return false; }, transformLat: function (x, y) { var 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 * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0; ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0; return ret; }, transformLon: function (x, y) { var 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 * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0; ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0; return ret; }};
//e
坐标
椭球
参考
投影
地图
坐标系
偏心
偏心率
卫星
因子
平面
程序
腾讯
定位
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
梅州市赤兔互联网科技有限公司
制作网络安全教育日短视频
流媒体服务器vs8000h
oracle数据库提交方式
检查服务器是为了什么
深圳宸信软件开发
基本网络安全策略
法院网络安全视频
广州万户网络安全教育
软件开发硬盘需要多大
vue下拉框获取数据库展示
云服务器密码技术
云南中汐互联网科技有限公司
华为驱动软件开发
报考农行软件开发中心的人多吗
国家网络安全基地名单
信息与网络安全事业单位招聘公告
如何实现网络安全防御
40台电脑网吧需要几个服务器
软件开发工作量评估器
数据库服务无法停止
管理员对服务器的要求
对外贸易全球价值链数据库怎么用
e城e家燃气缴费服务器错误
网络安全攻防演练插旗
网络安全电话是多少
数据库设计的内模型
邮件服务器的数据库
软件开发环境指的是
重庆网络软件开发诚信服务