WeChat Mini Programs Map Positioning GPS to Tencent Map coordinate system
Reference:
Http://www.qchcloud.cn/tn/article/23
Referenc
/ / s
Var GPS = {
PI: 3.14159265358979324
X_pi: 3.14159265358979324 3000.0 / 180.0
Delta: function (lat, lon) {
/ / Krasovsky 1940
/ /
/ / a = 6378245.0, 1max f = 298.3
/ / b = a (1-f)
/ / ee = (a ^ 2-b ^ 2) / a ^ 2
Var a = 6378245.0; / / a: the projection factor from the satellite ellipsoid coordinate system to the plane map coordinate system.
Var ee = 0.00669342162296594323; / / ee: eccentricity of the ellipsoid.
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 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 ((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.0x + 3.0y + 0.2y * y + 0.1x * y + 0.2 * Math.sqrt (Math.abs (x)); ret + = (100.0 * Math.sin (* x * this.PI) + 20.0 * Math.sin (2.0x * 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