-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtransform.js
150 lines (131 loc) · 4.25 KB
/
transform.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//调整位置偏移
var earthR = 6378137.0;
var transformMapName = "amap"// "googlemaps"
function outOfChina(lat, lng) {
if ((lng < 72.004) || (lng > 137.8347)) {
return true;
}
if ((lat < 0.8293) || (lat > 55.8271)) {
return true;
}
return false;
}
function transform(x, y) {
var xy = x * y;
var absX = Math.sqrt(Math.abs(x));
var xPi = x * Math.PI;
var yPi = y * Math.PI;
var d = 20.0*Math.sin(6.0*xPi) + 20.0*Math.sin(2.0*xPi);
var lat = d;
var lng = d;
lat += 20.0*Math.sin(yPi) + 40.0*Math.sin(yPi/3.0);
lng += 20.0*Math.sin(xPi) + 40.0*Math.sin(xPi/3.0);
lat += 160.0*Math.sin(yPi/12.0) + 320*Math.sin(yPi/30.0);
lng += 150.0*Math.sin(xPi/12.0) + 300.0*Math.sin(xPi/30.0);
lat *= 2.0 / 3.0;
lng *= 2.0 / 3.0;
lat += -100.0 + 2.0*x + 3.0*y + 0.2*y*y + 0.1*xy + 0.2*absX;
lng += 300.0 + x + 2.0*y + 0.1*x*x + 0.1*xy + 0.1*absX;
return {lat: lat, lng: lng}
}
function delta(lat, lng) {
var ee = 0.00669342162296594323;
var d = transform(lng-105.0, lat-35.0);
var radLat = lat / 180.0 * Math.PI;
var magic = Math.sin(radLat);
magic = 1 - ee*magic*magic;
var sqrtMagic = Math.sqrt(magic);
d.lat = (d.lat * 180.0) / ((earthR * (1 - ee)) / (magic * sqrtMagic) * Math.PI);
d.lng = (d.lng * 180.0) / (earthR / sqrtMagic * Math.cos(radLat) * Math.PI);
return d;
}
function wgs2gcj(wgsLat, wgsLng) {
if (outOfChina(wgsLat, wgsLng)) {
return {lat: wgsLat, lng: wgsLng};
}
var d = delta(wgsLat, wgsLng);
return {lat: wgsLat + d.lat, lon: wgsLng + d.lng};
}
//exports.wgs2gcj = wgs2gcj;
function gcj2wgs(gcjLat, gcjLng) {
if (outOfChina(gcjLat, gcjLng)) {
return {lat: gcjLat, lng: gcjLng};
}
var d = delta(gcjLat, gcjLng);
return {lat: gcjLat - d.lat, lng: gcjLng - d.lng};
}
//exports.gcj2wgs = gcj2wgs;
function gcj2wgs_exact(gcjLat, gcjLng) {
// newCoord = oldCoord = gcjCoord
var newLat = gcjLat, newLng = gcjLng;
var oldLat = newLat, oldLng = newLng;
var threshold = 1e-6; // ~0.55 m equator & latitude
for (var i = 0; i < 30; i++) {
// oldCoord = newCoord
oldLat = newLat;
oldLng = newLng;
// newCoord = gcjCoord - wgs_to_gcj_delta(newCoord)
var tmp = wgs2gcj(newLat, newLng);
// approx difference using gcj-space difference
newLat -= gcjLat - tmp.lat;
newLng -= gcjLng - tmp.lng;
// diffchk
if (Math.max(Math.abs(oldLat - newLat), Math.abs(oldLng - newLng)) < threshold) {
break;
}
}
return {lat: newLat, lng: newLng};
}
//exports.gcj2wgs_exact = gcj2wgs_exact;
function distance(latA, lngA, latB, lngB) {
var pi180 = Math.PI / 180;
var arcLatA = latA * pi180;
var arcLatB = latB * pi180;
var x = Math.cos(arcLatA) * Math.cos(arcLatB) * Math.cos((lngA-lngB)*pi180);
var y = Math.sin(arcLatA) * Math.sin(arcLatB);
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;
}
//exports.distance = distance;
function gcj2bd(gcjLat, gcjLng) {
if (outOfChina(gcjLat, gcjLng)) {
return {lat: gcjLat, lng: gcjLng};
}
var x = gcjLng, y = gcjLat;
var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * Math.PI);
var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * Math.PI);
var bdLng = z * Math.cos(theta) + 0.0065;
var bdLat = z * Math.sin(theta) + 0.006;
return {lat: bdLat, lng: bdLng};
}
//exports.gcj2bd = gcj2bd;
function bd2gcj(bdLat, bdLng) {
if (outOfChina(bdLat, bdLng)) {
return {lat: bdLat, lng: bdLng};
}
var x = bdLng - 0.0065, y = bdLat - 0.006;
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * Math.PI);
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * Math.PI);
var gcjLng = z * Math.cos(theta);
var gcjLat = z * Math.sin(theta);
return {lat: gcjLat, lng: gcjLng};
}
//exports.bd2gcj = bd2gcj;
function wgs2bd(wgsLat, wgsLng) {
var gcj = wgs2gcj(wgsLat, wgsLng);
return gcj2bd(gcj.lat, gcj.lng);
}
//exports.wgs2bd = wgs2bd;
function bd2wgs(bdLat, bdLng) {
var gcj = bd2gcj(bdLat, bdLng);
return gcj2wgs(gcj.lat, gcj.lng);
}
//exports.bd2wgs = bd2wgs;