Commit 46ed921a6622beab10ad110caa033c89d438af04

Authored by 王通
1 parent 21fda9e1

1.国外坐标用百度地图不需要偏移

src/main/resources/static/assets/js/TransGPS.js
1   -/** GCJ WGS BD 等坐标转换算法,从 TransGPS.java 代码转换而来*/
2   -var TransGPS = (function(){
3   - var pi = 3.14159265358979324
4   - ,a = 6378245.0
5   - ,ee = 0.00669342162296594323;
6   -
7   -
8   - function outOfChina(lat, lon){
9   - if (lon < 72.004 || lon > 137.8347)
10   - return 1;
11   - if (lat < 0.8293 || lat > 55.8271)
12   - return 1;
13   - return 0;
14   - }
15   -
16   - function transformLat(x, y){
17   - var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(x > 0 ? x : -x);
18   - ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
19   - ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
20   - ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
21   - return ret;
22   - }
23   -
24   - function transformLon(x, y){
25   - var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(x > 0 ? x : -x);
26   - ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
27   - ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
28   - ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
29   - return ret;
30   - }
31   -
32   - function transformFromWGSToGCJ(lat, lng){
33   - var mgLoc = {};
34   - if(1 == outOfChina(lat, lng)){
35   - mgLoc = {lat: lat, lng: lng};
36   - return mgLoc;
37   - }
38   -
39   - var dLat = transformLat(lng - 105.0, lat - 35.0);
40   - var dLon = transformLon(lng - 105.0, lat - 35.0);
41   - var radLat = lat / 180.0 * pi;
42   - var magic = Math.sin(radLat);
43   - magic = 1 - ee * magic * magic;
44   -
45   - var sqrtMagic = Math.sqrt(magic);
46   -
47   - dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
48   - dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
49   -
50   - mgLoc['lat'] = lat + dLat;
51   - mgLoc['lng'] = lng + dLon;
52   -
53   - return mgLoc;
54   - }
55   -
56   - function transformFromGCJToWGS(lat, lng){
57   - var wgLoc = {lat: lat, lng: lng}
58   - ,currGcLoc = {}, dLoc = {};
59   -
60   - while (true) {
61   - currGcLoc = transformFromWGSToGCJ(lat, lng);
62   - dLoc.lat = lat - currGcLoc.lat;
63   - dLoc.lng = lng - currGcLoc.lng;
64   - if (Math.abs(dLoc.lat) < 1e-7 && Math.abs(dLoc.lng) < 1e-7) {
65   - return wgLoc;
66   - }
67   - wgLoc.lat += dLoc.lat;
68   - wgLoc.lng += dLoc.lng;
69   - }
70   - }
71   -
72   - var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
73   -
74   - function bd_encrypt(lat, lng){
75   - var x = lng, y = lat;
76   - var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
77   - var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
78   -
79   - return {lng: z * Math.cos(theta) + 0.0065, lat: z * Math.sin(theta) + 0.006};
80   - }
81   -
82   - function bd_decrypt(lat, lng){
83   - var x = lng - 0.0065, y = lat - 0.006;
84   - var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
85   - var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
86   -
87   - return {lng: z * Math.cos(theta), lat: z * Math.sin(theta)};
88   - }
89   -
90   - var transGPS = {
91   - wgsToBD: function(lat, lng){
92   - var gcj = transformFromWGSToGCJ(lat, lng);
93   - return bd_encrypt(gcj.lat, gcj.lng);
94   - },
95   - transformFromWGSToGCJ: transformFromWGSToGCJ,
96   - bdToWgs: function (lat, lng) {
97   - var gcj = bd_decrypt(lat, lng);
98   - return transformFromGCJToWGS(gcj.lat, gcj.lng);
99   - }
100   - };
101   -
102   - return transGPS;
  1 +/** GCJ WGS BD 等坐标转换算法,从 TransGPS.java 代码转换而来*/
  2 +var TransGPS = (function(){
  3 + var pi = 3.14159265358979324
  4 + ,a = 6378245.0
  5 + ,ee = 0.00669342162296594323;
  6 +
  7 +
  8 + function outOfChina(lat, lon){
  9 + if (lon < 72.004 || lon > 137.8347)
  10 + return 1;
  11 + if (lat < 0.8293 || lat > 55.8271)
  12 + return 1;
  13 + return 0;
  14 + }
  15 +
  16 + function transformLat(x, y){
  17 + var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(x > 0 ? x : -x);
  18 + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  19 + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
  20 + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
  21 + return ret;
  22 + }
  23 +
  24 + function transformLon(x, y){
  25 + var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(x > 0 ? x : -x);
  26 + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  27 + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
  28 + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
  29 + return ret;
  30 + }
  31 +
  32 + function transformFromWGSToGCJ(lat, lng){
  33 + var mgLoc = {};
  34 + if(1 == outOfChina(lat, lng)){
  35 + mgLoc = {lat: lat, lng: lng};
  36 + return mgLoc;
  37 + }
  38 +
  39 + var dLat = transformLat(lng - 105.0, lat - 35.0);
  40 + var dLon = transformLon(lng - 105.0, lat - 35.0);
  41 + var radLat = lat / 180.0 * pi;
  42 + var magic = Math.sin(radLat);
  43 + magic = 1 - ee * magic * magic;
  44 +
  45 + var sqrtMagic = Math.sqrt(magic);
  46 +
  47 + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  48 + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  49 +
  50 + mgLoc['lat'] = lat + dLat;
  51 + mgLoc['lng'] = lng + dLon;
  52 +
  53 + return mgLoc;
  54 + }
  55 +
  56 + function transformFromGCJToWGS(lat, lng){
  57 + var wgLoc = {lat: lat, lng: lng}
  58 + ,currGcLoc = {}, dLoc = {};
  59 +
  60 + while (true) {
  61 + currGcLoc = transformFromWGSToGCJ(lat, lng);
  62 + dLoc.lat = lat - currGcLoc.lat;
  63 + dLoc.lng = lng - currGcLoc.lng;
  64 + if (Math.abs(dLoc.lat) < 1e-7 && Math.abs(dLoc.lng) < 1e-7) {
  65 + return wgLoc;
  66 + }
  67 + wgLoc.lat += dLoc.lat;
  68 + wgLoc.lng += dLoc.lng;
  69 + }
  70 + }
  71 +
  72 + var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  73 +
  74 + function bd_encrypt(lat, lng){
  75 + var x = lng, y = lat;
  76 + var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
  77 + var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
  78 +
  79 + return {lng: z * Math.cos(theta) + 0.0065, lat: z * Math.sin(theta) + 0.006};
  80 + }
  81 +
  82 + function bd_decrypt(lat, lng){
  83 + var x = lng - 0.0065, y = lat - 0.006;
  84 + var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
  85 + var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
  86 +
  87 + return {lng: z * Math.cos(theta), lat: z * Math.sin(theta)};
  88 + }
  89 +
  90 + var transGPS = {
  91 + wgsToBD: function(lat, lng){
  92 + /*var gcj = transformFromWGSToGCJ(lat, lng);
  93 + return bd_encrypt(gcj.lat, gcj.lng);*/
  94 + return {lng: lng, lat: lat}
  95 + },
  96 + transformFromWGSToGCJ: transformFromWGSToGCJ,
  97 + bdToWgs: function (lat, lng) {
  98 + var gcj = bd_decrypt(lat, lng);
  99 + return transformFromGCJToWGS(gcj.lat, gcj.lng);
  100 + }
  101 + };
  102 +
  103 + return transGPS;
103 104 })();
104 105 \ No newline at end of file
... ...