1 | import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
2 | import { degreesToRadians, radiansToLength } from '@turf/helpers';
|
3 | var originShift = 2 * Math.PI * 6378137 / 2.0;
|
4 | export function extent(data) {
|
5 | var dataExtent = [Infinity, Infinity, -Infinity, -Infinity];
|
6 | data.forEach(function (item) {
|
7 | var coordinates = item.coordinates;
|
8 | caculExtent(dataExtent, coordinates);
|
9 | });
|
10 | return dataExtent;
|
11 | }
|
12 |
|
13 | function caculExtent(dataExtent, coords) {
|
14 | if (Array.isArray(coords[0])) {
|
15 | coords.forEach(function (coord) {
|
16 | caculExtent(dataExtent, coord);
|
17 | });
|
18 | } else {
|
19 | if (dataExtent[0] > coords[0]) {
|
20 | dataExtent[0] = coords[0];
|
21 | }
|
22 |
|
23 | if (dataExtent[1] > coords[1]) {
|
24 | dataExtent[1] = coords[1];
|
25 | }
|
26 |
|
27 | if (dataExtent[2] < coords[0]) {
|
28 | dataExtent[2] = coords[0];
|
29 | }
|
30 |
|
31 | if (dataExtent[3] < coords[1]) {
|
32 | dataExtent[3] = coords[1];
|
33 | }
|
34 | }
|
35 |
|
36 | return dataExtent;
|
37 | }
|
38 |
|
39 | export function tranfrormCoord(data, cb) {
|
40 | return transform(data, cb);
|
41 | }
|
42 |
|
43 | function transform(item, cb) {
|
44 | if (Array.isArray(item[0])) {
|
45 | return item.map(function (coord) {
|
46 | return transform(coord, cb);
|
47 | });
|
48 | }
|
49 |
|
50 | return cb(item);
|
51 | }
|
52 |
|
53 | export function lngLatToMeters(lnglat) {
|
54 | var validate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
55 | var accuracy = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
56 | enable: true,
|
57 | decimal: 1
|
58 | };
|
59 | lnglat = validateLngLat(lnglat, validate);
|
60 | var lng = lnglat[0];
|
61 | var lat = lnglat[1];
|
62 | var x = lng * originShift / 180.0;
|
63 | var y = Math.log(Math.tan((90 + lat) * Math.PI / 360.0)) / (Math.PI / 180.0);
|
64 | y = y * originShift / 180.0;
|
65 |
|
66 | if (accuracy.enable) {
|
67 | x = Number(x.toFixed(accuracy.decimal));
|
68 | y = Number(y.toFixed(accuracy.decimal));
|
69 | }
|
70 |
|
71 | return lnglat.length === 3 ? [x, y, lnglat[2]] : [x, y];
|
72 | }
|
73 | export function metersToLngLat(meters) {
|
74 | var decimal = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
|
75 | var x = meters[0];
|
76 | var y = meters[1];
|
77 | var lng = x / originShift * 180.0;
|
78 | var lat = y / originShift * 180.0;
|
79 | lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - Math.PI / 2.0);
|
80 |
|
81 | if (decimal !== undefined && decimal !== null) {
|
82 | lng = Number(lng.toFixed(decimal));
|
83 | lat = Number(lat.toFixed(decimal));
|
84 | }
|
85 |
|
86 | return meters.length === 3 ? [lng, lat, meters[2]] : [lng, lat];
|
87 | }
|
88 | export function longitude(lng) {
|
89 | if (lng === undefined || lng === null) {
|
90 | throw new Error('lng is required');
|
91 | }
|
92 |
|
93 | if (lng > 180 || lng < -180) {
|
94 | lng = lng % 360;
|
95 |
|
96 | if (lng > 180) {
|
97 | lng = -360 + lng;
|
98 | }
|
99 |
|
100 | if (lng < -180) {
|
101 | lng = 360 + lng;
|
102 | }
|
103 |
|
104 | if (lng === 0) {
|
105 | lng = 0;
|
106 | }
|
107 | }
|
108 |
|
109 | return lng;
|
110 | }
|
111 | export function latitude(lat) {
|
112 | if (lat === undefined || lat === null) {
|
113 | throw new Error('lat is required');
|
114 | }
|
115 |
|
116 | if (lat > 90 || lat < -90) {
|
117 | lat = lat % 180;
|
118 |
|
119 | if (lat > 90) {
|
120 | lat = -180 + lat;
|
121 | }
|
122 |
|
123 | if (lat < -90) {
|
124 | lat = 180 + lat;
|
125 | }
|
126 |
|
127 | if (lat === 0) {
|
128 | lat = 0;
|
129 | }
|
130 | }
|
131 |
|
132 | return lat;
|
133 | }
|
134 | export function validateLngLat(lnglat, validate) {
|
135 | if (validate === false) {
|
136 | return lnglat;
|
137 | }
|
138 |
|
139 | var lng = longitude(lnglat[0]);
|
140 | var lat = latitude(lnglat[1]);
|
141 |
|
142 | if (lat > 85) {
|
143 | lat = 85;
|
144 | }
|
145 |
|
146 | if (lat < -85) {
|
147 | lat = -85;
|
148 | }
|
149 |
|
150 | return lnglat.length === 3 ? [lng, lat, lnglat[2]] : [lng, lat];
|
151 | }
|
152 | export function aProjectFlat(lnglat) {
|
153 | var maxs = 85.0511287798;
|
154 | var lat = Math.max(Math.min(maxs, lnglat[1]), -maxs);
|
155 | var scale = 256 << 20;
|
156 | var d = Math.PI / 180;
|
157 | var x = lnglat[0] * d;
|
158 | var y = lat * d;
|
159 | y = Math.log(Math.tan(Math.PI / 4 + y / 2));
|
160 | var a = 0.5 / Math.PI;
|
161 | var b = 0.5;
|
162 | var c = -0.5 / Math.PI;
|
163 | d = 0.5;
|
164 | x = scale * (a * x + b);
|
165 | y = scale * (c * y + d);
|
166 | return [Math.floor(x), Math.floor(y)];
|
167 | }
|
168 | export function unProjectFlat(px) {
|
169 | var a = 0.5 / Math.PI;
|
170 | var b = 0.5;
|
171 | var c = -0.5 / Math.PI;
|
172 | var d = 0.5;
|
173 | var scale = 256 << 20;
|
174 |
|
175 | var _px = _slicedToArray(px, 2),
|
176 | x = _px[0],
|
177 | y = _px[1];
|
178 |
|
179 | x = (x / scale - b) / a;
|
180 | y = (y / scale - d) / c;
|
181 | y = (Math.atan(Math.pow(Math.E, y)) - Math.PI / 4) * 2;
|
182 | d = Math.PI / 180;
|
183 | var lat = y / d;
|
184 | var lng = x / d;
|
185 | return [lng, lat];
|
186 | }
|
187 | export function lnglatDistance(coordinates1, coordinates2, units) {
|
188 | var dLat = degreesToRadians(coordinates2[1] - coordinates1[1]);
|
189 | var dLon = degreesToRadians(coordinates2[0] - coordinates1[0]);
|
190 | var lat1 = degreesToRadians(coordinates1[1]);
|
191 | var lat2 = degreesToRadians(coordinates2[1]);
|
192 | var a = Math.pow(Math.sin(dLat / 2), 2) + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
|
193 | return radiansToLength(2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)), units = 'meters');
|
194 | }
|
195 | export function project(lnglat) {
|
196 | var d = Math.PI / 180;
|
197 | var max = 85.0511287798;
|
198 | var earthRadius = 6378137;
|
199 | var lat = Math.max(Math.min(max, lnglat[1]), -max);
|
200 | var sin = Math.sin(lat * d);
|
201 | var x = earthRadius * lnglat[0] * d;
|
202 | var y = earthRadius * Math.log((1 + sin) / (1 - sin)) / 2;
|
203 | return [x, y];
|
204 | }
|
205 | export function padBounds(b, bufferRatio) {
|
206 | var heightBuffer = Math.abs(b[1][1] - b[0][1]) * bufferRatio;
|
207 | var widthBuffer = Math.abs(b[1][0] - b[0][0]) * bufferRatio;
|
208 | return [[b[0][0] - widthBuffer, b[0][1] - heightBuffer], [b[1][0] + widthBuffer, b[1][1] + heightBuffer]];
|
209 | }
|
210 | export function boundsContains(b1, b2) {
|
211 | return b1[0][0] <= b2[0][0] && b1[0][1] <= b2[0][1] && b1[1][0] >= b2[1][0] && b1[1][1] >= b2[1][1];
|
212 | }
|
213 | export function bBoxToBounds(b1) {
|
214 | return [[b1[0], b1[1]], [b1[2], b1[3]]];
|
215 | }
|
216 |
|
\ | No newline at end of file |