微信小程序地图定位GPS转腾讯地图的坐标系
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,参考:http://www.qchcloud.cn/tn/article/23参考//svar GPS = {PI: 3.14159265358979324,x_pi: 3.1415926535897
千家信息网最后更新 2025年02月03日微信小程序地图定位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安全错误
数据库的锁怎样保障安全
网络安全公开课观后感1000
风云5区玄夜是哪个地方服务器
服务器机箱1u的高度是多少
网络安全入门教学
hmi软件开发有哪些方面
使用向导创建数据库
网络安全与文明高中黑板报
12306软件开发多少钱
快手游戏服务器在哪
内置打印服务器 路由器
数据库导入 数据库
网络安全找key
网络安全面临的问题有
中国公安大学举办网络安全大赛
sql如何建服务器
三级网络技术应用题视频
南通专业服务器厂商
服务器管理推荐什么软件
兴华实时数据库
mongo数据库表结构
网页游戏软件开发公司加盟
昌平区网络软件开发
白银市符号互联网科技有限公司
明日之后亚瑟湾服务器在哪
网络安全手抄报文本
软件开发实战指南
vb通过ado连接数据库
网络技术专业职业分析
魔兽世界哪个服务器是网通
网络技术及安全