微信小程序地图定位GPS转腾讯地图的坐标系
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,参考:http://www.qchcloud.cn/tn/article/23参考//svar GPS = {PI: 3.14159265358979324,x_pi: 3.1415926535897
千家信息网最后更新 2026年10月31日微信小程序地图定位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安全错误
数据库的锁怎样保障安全
互联网科技公司简介
中国互联网科技工作委员会毛军
互联网巨头科技公司
互联网科技金融
安徽鑫晟辉互联网科技
深圳天众互联网科技公司
顺玮阁互联网科技
苏州大垚互联网科技
科技伦理 互联网公司
互联网科技生活的内容
互联网教育科技公司vipkid
互联网科技寓意
小米互联网科技园设置
汽车互联网创新科技园
爱医互联网络科技
合肥互联网科技公司公章图片
银行科技岗属于互联网吗
上海创道互联网络科技有限公司
互联网高科技绘画
株洲百竞科技的互联网营销顾问
咖啡
科技互联网龙头
互联网科技集团
互联网科技大会
互联网科技生活的内容
深圳艾果互联网通讯科技
朱啸虎曾投资哪些互联网科技企业
互联网科技快讯热点
工业互联网科技成果转化
东风日产互联网科技公司叫什么