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 \ No newline at end of file 105 \ No newline at end of file