| | |
| | | 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 } |
| | | 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 } } |
| | | 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 } |
| | | 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 } } |
| | | 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 } |
| | | return { lat: gcjLat - d.lat, lon: gcjLon - d.lon } |
| | | }, |
| | | // GCJ-02 to WGS-84 exactly |
| | | gcj_decrypt_exact: function(gcjLat, gcjLon) { |
| | | let initDelta = 0.01 |
| | | let threshold = 0.000000001 |
| | | const initDelta = 0.01 |
| | | const threshold = 0.000000001 |
| | | let dLat = initDelta |
| | | let dLon = initDelta |
| | | let mLat = gcjLat - dLat |
| | |
| | | if (++i > 10000) break |
| | | } |
| | | // console.log(i); |
| | | return { 'lat': wgsLat, 'lon': wgsLon } |
| | | return { lat: wgsLat, lon: wgsLon } |
| | | }, |
| | | // GCJ-02 to BD-09 |
| | | bd_encrypt: function(gcjLat, gcjLon) { |
| | | let x = gcjLon |
| | | let y = gcjLat |
| | | let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi) |
| | | let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi) |
| | | let bdLon = z * Math.cos(theta) + 0.0065 |
| | | let bdLat = z * Math.sin(theta) + 0.006 |
| | | return { 'lat': bdLat, 'lon': bdLon } |
| | | const x = gcjLon |
| | | const y = gcjLat |
| | | const z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi) |
| | | const theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi) |
| | | const bdLon = z * Math.cos(theta) + 0.0065 |
| | | const bdLat = z * Math.sin(theta) + 0.006 |
| | | return { lat: bdLat, lon: bdLon } |
| | | }, |
| | | // BD-09 to GCJ-02 |
| | | bd_decrypt: function(bdLat, bdLon) { |
| | | let x = bdLon - 0.0065 |
| | | let y = bdLat - 0.006 |
| | | let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi) |
| | | let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi) |
| | | let gcjLon = z * Math.cos(theta) |
| | | let gcjLat = z * Math.sin(theta) |
| | | return { 'lat': gcjLat, 'lon': gcjLon } |
| | | const x = bdLon - 0.0065 |
| | | const y = bdLat - 0.006 |
| | | const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi) |
| | | const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi) |
| | | const gcjLon = z * Math.cos(theta) |
| | | const gcjLat = z * Math.sin(theta) |
| | | return { lat: gcjLat, lon: gcjLon } |
| | | }, |
| | | // WGS-84 to Web mercator |
| | | // mercatorLat -> y mercatorLon -> x |
| | | mercator_encrypt: function(wgsLat, wgsLon) { |
| | | let x = wgsLon * 20037508.34 / 180.0 |
| | | const x = wgsLon * 20037508.34 / 180.0 |
| | | let y = Math.log(Math.tan((90.0 + wgsLat) * this.PI / 360.0)) / (this.PI / 180.0) |
| | | y = y * 20037508.34 / 180.0 |
| | | return { 'lat': y, 'lon': x } |
| | | return { lat: y, lon: x } |
| | | /* |
| | | if ((Math.abs(wgsLon) > 180 || Math.abs(wgsLat) > 90)) |
| | | return null; |
| | |
| | | var x = mercatorLon / 20037508.34 * 180.0 |
| | | var y = mercatorLat / 20037508.34 * 180.0 |
| | | y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.0)) - this.PI / 2) |
| | | return { 'lat': y, 'lon': x } |
| | | return { lat: y, lon: x } |
| | | /* |
| | | if (Math.abs(mercatorLon) < 180 && Math.abs(mercatorLat) < 90) |
| | | return null; |