efront 3.18.0 → 3.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pivot/link/chat.js +2 -5
- package/apps/pivot/link/list.html +2 -4
- package/apps/pivot/link/list.js +1 -1
- package/apps/pivot/link/list.less +7 -2
- package/coms/basic/cross_.js +8 -1
- package/coms/frame/chat.html +12 -6
- package/coms/frame/chat.js +48 -15
- package/coms/frame/chat.less +61 -9
- package/coms/frame/list.js +13 -4
- package/coms/maps/baidu.js +6 -1
- package/coms/maps/gaode.js +3 -0
- package/coms/maps/google.js +2 -2
- package/coms/maps/osm.js +1 -1
- package/coms/pivot/pedit.less +3 -0
- package/coms/pivot/plist.js +7 -1
- package/coms/random/sfz.js +154 -0
- package/coms/reptile/cross.js +9 -4
- package/coms/zimoli/HexEditor.js +1 -0
- package/coms/zimoli/HexEditor.less +2 -2
- package/coms/zimoli/Item.js +5 -0
- package/coms/zimoli/container.js +13 -7
- package/coms/zimoli/contextmenu.js +1 -19
- package/coms/zimoli/createItemTarget.js +8 -2
- package/coms/zimoli/grid.js +69 -19
- package/coms/zimoli/list.js +1 -1
- package/coms/zimoli/maps.js +323 -144
- package/coms/zimoli/maps.less +8 -0
- package/coms/zimoli/maps_test.html +2 -0
- package/coms/zimoli/maps_test.js +37 -28
- package/coms/zimoli/maps_test.less +4 -6
- package/coms/zimoli/menu.js +8 -7
- package/coms/zimoli/menuItem.js +1 -1
- package/coms/zimoli/menuList.js +5 -3
- package/coms/zimoli/onmousewheel.js +1 -0
- package/coms/zimoli/popup.js +2 -1
- package/coms/zimoli/render.js +25 -9
- package/coms/zimoli/tree.js +1 -1
- package/coms/zimoli/zimoli.js +12 -2
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/zimoli/maps.js
CHANGED
|
@@ -27,8 +27,43 @@ class Vector extends Array {
|
|
|
27
27
|
length = 3;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
var defaultImage = function (ratio = 2) {
|
|
31
|
+
var image = document.createElement('canvas');
|
|
32
|
+
image.width = 256 * ratio;
|
|
33
|
+
image.height = 256 * ratio;
|
|
34
|
+
image.src = true;
|
|
35
|
+
var { width, height } = image;
|
|
36
|
+
var w = width / 14;
|
|
37
|
+
var h = height / 8;
|
|
38
|
+
var ctx = image.getContext("2d");
|
|
39
|
+
ctx.beginPath();
|
|
40
|
+
for (var cx = 0, dx = width; cx < dx; cx += w) {
|
|
41
|
+
for (var cy = 0, dy = height; cy < dy; cy += h) {
|
|
42
|
+
ctx.moveTo(cx, cy);
|
|
43
|
+
ctx.lineTo(cx, cy + h / 6);
|
|
44
|
+
ctx.lineTo(cx + w / 2, cy + h / 3);
|
|
45
|
+
ctx.lineTo(cx + w / 2, cy + h * 2 / 3);
|
|
46
|
+
ctx.lineTo(cx, cy + h * 5 / 6);
|
|
47
|
+
ctx.lineTo(cx, cy + h);
|
|
48
|
+
ctx.moveTo(cx + w / 2, cy + h / 3);
|
|
49
|
+
ctx.lineTo(cx + w, cy + h / 6);
|
|
50
|
+
ctx.moveTo(cx + w / 2, cy + h * 2 / 3);
|
|
51
|
+
ctx.lineTo(cx + w, cy + h * 5 / 6);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
ctx.strokeStyle = "rgba(255,255,255,.2)";
|
|
55
|
+
ctx.lineWidth = ratio;
|
|
56
|
+
ctx.stroke();
|
|
57
|
+
ctx.beginPath();
|
|
58
|
+
ctx.moveTo(0, 0);
|
|
59
|
+
ctx.lineTo(width, 0);
|
|
60
|
+
ctx.lineTo(width, height);
|
|
61
|
+
ctx.strokeStyle = "rgba(255,255,255,.8)";
|
|
62
|
+
ctx.lineWidth = ratio * 2;
|
|
63
|
+
ctx.stroke();
|
|
64
|
+
image.complete = true;
|
|
65
|
+
return image;
|
|
66
|
+
}
|
|
32
67
|
var rotate = function (vector, theta, points) {
|
|
33
68
|
|
|
34
69
|
};
|
|
@@ -46,7 +81,7 @@ class EarthAxis {
|
|
|
46
81
|
[0, 0, 1, 0],
|
|
47
82
|
[0, 0, 0, 1]
|
|
48
83
|
];
|
|
49
|
-
rotate(direction,
|
|
84
|
+
rotate(direction,) {
|
|
50
85
|
}
|
|
51
86
|
to2d(Points) {
|
|
52
87
|
return []
|
|
@@ -76,7 +111,7 @@ function maps(config = {}) {
|
|
|
76
111
|
canvas.width = 800;
|
|
77
112
|
canvas.height = 600;
|
|
78
113
|
this.canvas = canvas;
|
|
79
|
-
|
|
114
|
+
this.context = canvas.getContext("2d");
|
|
80
115
|
this.loadings = [];
|
|
81
116
|
if (isObject(config)) {
|
|
82
117
|
for (var k in config) {
|
|
@@ -85,137 +120,235 @@ function maps(config = {}) {
|
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
122
|
}
|
|
88
|
-
onappend(canvas, () => this.refresh());
|
|
89
123
|
var map = canvas.map = this;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
124
|
+
var move = map.move;
|
|
125
|
+
var saved_event;
|
|
126
|
+
moveupon(canvas, {
|
|
127
|
+
start(event) {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
move.reset();
|
|
130
|
+
saved_event = event;
|
|
131
|
+
},
|
|
132
|
+
move(event) {
|
|
133
|
+
if (event.moveLocked) return;
|
|
134
|
+
if (!onclick.preventClick) return;
|
|
135
|
+
if (event.touches && saved_event.touches) {
|
|
136
|
+
if (event.touches.length !== saved_event.touches.length) {
|
|
137
|
+
event.moveLocked = true;
|
|
138
|
+
saved_event = event;
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
switch (event.touches.length) {
|
|
143
|
+
case 1:
|
|
144
|
+
break;
|
|
145
|
+
case 2:
|
|
146
|
+
default:
|
|
147
|
+
event.moveLocked = true;
|
|
148
|
+
var [xy1, xy2] = saved_event.touches;
|
|
149
|
+
var [mn1, mn2] = event.touches;
|
|
150
|
+
var { left, top } = getScreenPosition(canvas);
|
|
151
|
+
top += canvas.clientTop;
|
|
152
|
+
left += canvas.clientLeft;
|
|
153
|
+
map.touch(
|
|
154
|
+
[xy1.clientX - left, xy1.clientY - top, xy2.clientX - left, xy2.clientY - top],
|
|
155
|
+
[mn1.clientX - left, mn1.clientY - top, mn2.clientX - left, mn2.clientY - top]
|
|
156
|
+
);
|
|
157
|
+
saved_event = event;
|
|
158
|
+
return;
|
|
159
|
+
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
var deltax = event.clientX - saved_event.clientX,
|
|
163
|
+
deltay = event.clientY - saved_event.clientY;
|
|
164
|
+
event.moveLocked = true;
|
|
165
|
+
move.call(this.map, deltax, deltay);
|
|
166
|
+
saved_event = event;
|
|
167
|
+
},
|
|
168
|
+
end() {
|
|
169
|
+
move.smooth();
|
|
170
|
+
saved_event = null;
|
|
171
|
+
},
|
|
172
|
+
})
|
|
109
173
|
onmousewheel(canvas, function (event) {
|
|
174
|
+
event.preventDefault();
|
|
110
175
|
var hwidth = this.width / 2;
|
|
111
176
|
var hheight = this.height / 2;
|
|
112
177
|
var layerx = event.layerX || event.offsetX || hwidth;
|
|
113
178
|
var layery = event.layerY || event.offsetY || hheight;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
scale += 0.125;
|
|
117
|
-
} else {
|
|
118
|
-
scale -= 0.125;
|
|
119
|
-
}
|
|
120
|
-
map.Scale(scale, layerx, layery);
|
|
179
|
+
map.Scale(Math.pow(0.99, 20 * Math.atan(event.deltaY / 20)), layerx, layery);
|
|
180
|
+
map.refresh();
|
|
121
181
|
});
|
|
182
|
+
var reshape = function () {
|
|
183
|
+
canvas.width = canvas.offsetWidth;
|
|
184
|
+
canvas.height = canvas.offsetHeight;
|
|
185
|
+
console.log(canvas.map)
|
|
186
|
+
canvas.map.refresh();
|
|
187
|
+
canvas._default = canvas.map.defaultImage();
|
|
188
|
+
};
|
|
189
|
+
if (canvas.isMounted) reshape();
|
|
190
|
+
else once("append")(canvas, reshape);
|
|
191
|
+
bind('resize')(canvas, reshape);
|
|
122
192
|
|
|
123
193
|
return canvas;
|
|
124
194
|
};
|
|
125
195
|
maps.prototype = {
|
|
126
|
-
url: "
|
|
196
|
+
url: "https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png",
|
|
127
197
|
direction: 1,
|
|
128
198
|
zoom: 10,
|
|
129
199
|
scale: 1,
|
|
200
|
+
maxZoom: 19,
|
|
201
|
+
minZoom: 3,
|
|
130
202
|
center: [0, 0],
|
|
203
|
+
maxLat: 85.05112877980659646937,
|
|
204
|
+
minLat: -85.05112877980659646937,
|
|
205
|
+
maxLng: 180,
|
|
206
|
+
minLng: -180,
|
|
131
207
|
canvas: null,
|
|
132
208
|
context: null,
|
|
209
|
+
_default: null,
|
|
210
|
+
defaultImage() {
|
|
211
|
+
if (this._default) return this._default;
|
|
212
|
+
return this._default = defaultImage();
|
|
213
|
+
},
|
|
214
|
+
pattern: null,
|
|
215
|
+
cache: [],
|
|
216
|
+
move: inertia(function (a, b) {
|
|
217
|
+
this.Move(a, b);
|
|
218
|
+
this.refresh();
|
|
219
|
+
}),
|
|
220
|
+
touch([x1, y1, x2, y2], [m1, n1, m2, n2]) {
|
|
221
|
+
var l1 = Math.sqrt(Math.pow(m1 - m2, 2) + Math.pow(n1 - n2, 2));
|
|
222
|
+
var l2 = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
|
|
223
|
+
var scale = l1 / l2;
|
|
224
|
+
this.Scale(scale, (m1 + m2) / 2, (n1 + n2) / 2);
|
|
225
|
+
this.refresh();
|
|
226
|
+
},
|
|
133
227
|
Move(deltaX, deltaY) {
|
|
134
|
-
var
|
|
135
|
-
var
|
|
136
|
-
|
|
228
|
+
var map = this;
|
|
229
|
+
var { canvas, context, minLat, maxLat, minLng, maxLng } = this;
|
|
230
|
+
var zoom = map.Zoom();
|
|
231
|
+
var scale = map.Scale();
|
|
232
|
+
var [lng, lat] = map.Center();
|
|
233
|
+
var [x, y] = [this.lng2x(lng, zoom) * 256 * scale, this.lat2y(lat, zoom) * 256 * scale];
|
|
234
|
+
deltaX = Math.round(deltaX);
|
|
235
|
+
deltaY = Math.round(deltaY);
|
|
236
|
+
if (this.direction < 0) deltaY = -deltaY;
|
|
237
|
+
var x0 = x, y0 = y;
|
|
238
|
+
x -= deltaX;
|
|
239
|
+
y -= deltaY;
|
|
240
|
+
var y1 = this.lat2y(minLat, zoom) * 256 * scale;
|
|
241
|
+
var y2 = this.lat2y(maxLat, zoom) * 256 * scale;
|
|
242
|
+
if (y1 > y2) [y1, y2] = [y2, y1];
|
|
243
|
+
var hh = canvas.height / 2;
|
|
244
|
+
y1 += hh;
|
|
245
|
+
y2 -= hh;
|
|
246
|
+
if (y < y1) {
|
|
247
|
+
deltaY = y0 - y1;
|
|
248
|
+
y = y1;
|
|
249
|
+
}
|
|
250
|
+
if (y > y2) {
|
|
251
|
+
deltaY = y0 - y2;
|
|
252
|
+
y = y2;
|
|
253
|
+
}
|
|
254
|
+
var hw = canvas.width / 2;
|
|
255
|
+
if (maxLng - minLng !== 360) {
|
|
256
|
+
var x1 = this.lng2x(minLng, zoom) * 256 * scale;
|
|
257
|
+
var x2 = this.lng2x(maxLng, zoom) * 256 * scale;
|
|
258
|
+
if (x1 > x2) [x1, x2] = [x2, x1];
|
|
259
|
+
x1 += hw;
|
|
260
|
+
x2 -= hw;
|
|
261
|
+
if (x <= x1) {
|
|
262
|
+
deltaX = x0 - x1;
|
|
263
|
+
x = x1;
|
|
264
|
+
}
|
|
265
|
+
if (x >= x2) {
|
|
266
|
+
deltaX = x0 - x2;
|
|
267
|
+
x = x2;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (!deltaX && !deltaY) return false;
|
|
271
|
+
|
|
272
|
+
var imagedata = context.getImageData(0, 0, canvas.width, canvas.height);
|
|
137
273
|
if (deltaX < 0) {
|
|
138
274
|
var x_empty = -deltaX;
|
|
139
|
-
var x_start = canvas.
|
|
275
|
+
var x_start = canvas.width + deltaX;
|
|
140
276
|
} else {
|
|
141
277
|
x_start = 0;
|
|
142
278
|
x_empty = deltaX;
|
|
143
279
|
}
|
|
144
280
|
if (deltaY < 0) {
|
|
145
281
|
var y_empty = -deltaY;
|
|
146
|
-
var y_start = canvas.
|
|
282
|
+
var y_start = canvas.height + deltaY;
|
|
147
283
|
} else {
|
|
148
284
|
y_start = 0;
|
|
149
285
|
y_empty = deltaY;
|
|
150
286
|
}
|
|
151
|
-
context.clearRect(x_start, 0, x_empty, canvas.
|
|
152
|
-
context.clearRect(0, y_start, canvas.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
var zoom = map.Zoom();
|
|
156
|
-
var scale = map.Scale();
|
|
157
|
-
if (scale === 1) {
|
|
158
|
-
map.Center(x2lng(lng2x(lng, zoom) - deltaX / 256, zoom), y2lat(lat2y(lat, zoom) - deltaY / 256, zoom));
|
|
159
|
-
} else {
|
|
160
|
-
map.Center(x2lng(lng2x(lng, zoom) - (deltaX / 256 / scale).toFixed(6), zoom), y2lat(lat2y(lat, zoom) - (deltaY / 256 / scale).toFixed(6), zoom));
|
|
161
|
-
}
|
|
287
|
+
context.clearRect(x_start, 0, x_empty, canvas.height + 2);
|
|
288
|
+
context.clearRect(0, y_start, canvas.width + 2, y_empty);
|
|
289
|
+
context.putImageData(imagedata, deltaX, deltaY);
|
|
290
|
+
map.Center(this.x2lng(x / 256 / scale, zoom), this.y2lat(y / 256 / scale, zoom));
|
|
162
291
|
},
|
|
163
292
|
Zoom(level) {
|
|
164
293
|
if (isFinite(level)) {
|
|
165
294
|
this.zoom = +level;
|
|
166
|
-
this.refresh();
|
|
167
295
|
}
|
|
168
296
|
return this.zoom;
|
|
169
297
|
},
|
|
170
298
|
Layer() {
|
|
171
299
|
|
|
172
300
|
},
|
|
173
|
-
Scale(
|
|
174
|
-
if (isFinite(
|
|
301
|
+
Scale(deltaS, layerX, layerY) {
|
|
302
|
+
if (isFinite(deltaS)) {
|
|
303
|
+
this.move.reset();
|
|
175
304
|
var map = this;
|
|
176
305
|
var { canvas, context } = map;
|
|
177
306
|
var {
|
|
178
|
-
width,
|
|
179
|
-
height
|
|
307
|
+
offsetWidth: width,
|
|
308
|
+
offsetHeight: height
|
|
180
309
|
} = canvas;
|
|
181
|
-
|
|
182
|
-
|
|
310
|
+
var dw = width / 2;
|
|
311
|
+
var dh = height / 2;
|
|
312
|
+
if (layerX === undefined) {
|
|
313
|
+
layerX = dw;
|
|
183
314
|
}
|
|
184
|
-
if (
|
|
185
|
-
|
|
315
|
+
if (layerY === undefined) {
|
|
316
|
+
layerY = dh;
|
|
186
317
|
}
|
|
187
|
-
|
|
188
318
|
var zoom = map.Zoom();
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
zoom
|
|
195
|
-
scale
|
|
319
|
+
|
|
320
|
+
var deltaScale = deltaS
|
|
321
|
+
var scale = map.scale * deltaS;
|
|
322
|
+
var delta = Math.floor(Math.log2(scale));
|
|
323
|
+
if (delta !== 0) {
|
|
324
|
+
zoom += delta;
|
|
325
|
+
scale /= Math.pow(2, delta);
|
|
196
326
|
}
|
|
197
|
-
if (!zoom || zoom <
|
|
198
|
-
|
|
327
|
+
if (!zoom || zoom <= map.minZoom && deltaScale < 1) {
|
|
328
|
+
deltaScale = Math.pow(2, map.minZoom - map.zoom) / map.scale;
|
|
329
|
+
zoom = map.minZoom;
|
|
199
330
|
scale = 1;
|
|
200
|
-
}
|
|
331
|
+
}
|
|
332
|
+
else if (zoom >= map.maxZoom && deltaScale > 1) {
|
|
333
|
+
deltaScale = Math.pow(2, map.maxZoom - map.zoom) / map.scale;
|
|
334
|
+
zoom = map.maxZoom;
|
|
201
335
|
scale = 1;
|
|
202
|
-
zoom = 23;
|
|
203
336
|
}
|
|
204
|
-
var
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
337
|
+
var deltaS = deltaScale;
|
|
338
|
+
var dwidth = width * deltaS;
|
|
339
|
+
var dheight = height * deltaS;
|
|
340
|
+
var tempCanvas = map.canvas.cloneNode();
|
|
341
|
+
tempCanvas.getContext("2d").putImageData(context.getImageData(0, 0, width, height), 0, 0);
|
|
342
|
+
context.clearRect(0, 0, width, height);
|
|
208
343
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
this.scale = +scale;
|
|
218
|
-
// if (zoom !== saved_value) map.Zoom(zoom);
|
|
344
|
+
var dx = (layerX - dw) * deltaS - (layerX - dw);
|
|
345
|
+
var dy = (layerY - dh) * deltaS - (layerY - dh);
|
|
346
|
+
if (this.direction < 0) dy = -dy;
|
|
347
|
+
context.drawImage(tempCanvas, 0, 0, width, height, layerX - layerX * deltaS, layerY - layerY * deltaS, dwidth, dheight);
|
|
348
|
+
var [lng, lat] = map.center;
|
|
349
|
+
map.center = [this.x2lng(this.lng2x(lng, zoom) + dx / 256 / scale, zoom), this.y2lat(this.lat2y(lat, zoom) + dy / 256 / scale, zoom)];
|
|
350
|
+
map.scale = +scale;
|
|
351
|
+
map.Zoom(zoom);
|
|
219
352
|
}
|
|
220
353
|
return this.scale;
|
|
221
354
|
},
|
|
@@ -225,9 +358,9 @@ maps.prototype = {
|
|
|
225
358
|
var zoom = map.Zoom();
|
|
226
359
|
var centerx = map.lng2x(centerlng, zoom);
|
|
227
360
|
var centery = map.lat2y(centerlat, zoom);
|
|
228
|
-
var {
|
|
229
|
-
var x = centerx + (layerx -
|
|
230
|
-
var y = centery + (layery -
|
|
361
|
+
var { width, height } = this.canvas;
|
|
362
|
+
var x = centerx + (layerx - width / 2) / 256;
|
|
363
|
+
var y = centery + (layery - height / 2) / 256;
|
|
231
364
|
var lng = +map.x2lng(x, zoom).toFixed(6), lat = +map.y2lat(y, zoom).toFixed(6);
|
|
232
365
|
return [lng, lat];
|
|
233
366
|
},
|
|
@@ -237,7 +370,6 @@ maps.prototype = {
|
|
|
237
370
|
Center(lng, lat) {
|
|
238
371
|
if (isFinite(lng) && isFinite(lat)) {
|
|
239
372
|
this.center = [+lng, +lat];
|
|
240
|
-
this.refresh();
|
|
241
373
|
} else if (isObject(lng)) {
|
|
242
374
|
if ("issearching" in lng) return;
|
|
243
375
|
lng.issearching = true;
|
|
@@ -253,6 +385,21 @@ maps.prototype = {
|
|
|
253
385
|
},
|
|
254
386
|
getURL(x, y, z) {
|
|
255
387
|
if (this.url) {
|
|
388
|
+
var minY = this.lat2tile(this.minLat, z);
|
|
389
|
+
var maxY = this.lat2tile(this.maxLat, z);
|
|
390
|
+
var minX = this.lng2tile(this.minLng, z);
|
|
391
|
+
var maxX = this.lng2tile(this.maxLng, z);
|
|
392
|
+
if (minY > maxY) [minY, maxY] = [maxY, minY];
|
|
393
|
+
if (minX > maxX) [minX, maxX] = [maxX, minX];
|
|
394
|
+
if (y > maxY || y < minY) return;
|
|
395
|
+
if (this.maxLng - this.minLng !== 360) {
|
|
396
|
+
if (x >= maxX || x < minX) return;
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
var dx = maxX - minX;
|
|
400
|
+
if (x >= maxX) x = minX + (x - minX) % dx;
|
|
401
|
+
if (x < minX) x = maxX - (minX - x - 1) % dx - 1;
|
|
402
|
+
}
|
|
256
403
|
return String(this.url).replace(/\$?\{([\w\-]+)\}/g, function (m, a) {
|
|
257
404
|
switch (a) {
|
|
258
405
|
case "x": return x;
|
|
@@ -272,109 +419,141 @@ maps.prototype = {
|
|
|
272
419
|
image.src = src;
|
|
273
420
|
},
|
|
274
421
|
getImage(x, y, z) {
|
|
422
|
+
var { cache } = this;
|
|
423
|
+
var id = `${x}-${y}-${z}`;
|
|
424
|
+
var url = this.getURL(x, y, z);
|
|
425
|
+
if (!url) return this.defaultImage();
|
|
426
|
+
if (this.cache[id]) return this.cache[id];
|
|
275
427
|
var image = new Image;
|
|
428
|
+
image._src = url;
|
|
276
429
|
image.crossOrigin = "anonymous";
|
|
277
|
-
this.loadImage(image,
|
|
430
|
+
this.loadImage(image, url);
|
|
431
|
+
var cache = this.cache;
|
|
432
|
+
cache.push(image);
|
|
433
|
+
image._id = id;
|
|
434
|
+
cache[id] = image;
|
|
435
|
+
if (cache.length > 1000) {
|
|
436
|
+
cache.splice(0, 500).forEach(this.destroyImage);
|
|
437
|
+
}
|
|
278
438
|
return image;
|
|
279
439
|
},
|
|
280
|
-
getGrid(
|
|
281
|
-
var [lng, lat] = this.Center();
|
|
282
|
-
var z = this.Zoom();
|
|
283
|
-
var x = this.lng2tile(lng, z);
|
|
284
|
-
var y = this.lat2tile(lat, z);
|
|
285
|
-
var x0 = this.lng2x(lng, z);
|
|
286
|
-
var y0 = this.lat2y(lat, z);
|
|
440
|
+
getGrid(gridMash) {
|
|
287
441
|
var {
|
|
288
|
-
|
|
289
|
-
|
|
442
|
+
width,
|
|
443
|
+
height
|
|
290
444
|
} = this.canvas;
|
|
291
|
-
var halfWidth =
|
|
292
|
-
var halfHeight =
|
|
293
|
-
var
|
|
445
|
+
var halfWidth = width / 2;
|
|
446
|
+
var halfHeight = height / 2;
|
|
447
|
+
var [lng, lat] = this.center;
|
|
448
|
+
var z = this.zoom;
|
|
449
|
+
var startlng = this.x2lng(this.lng2x(lng, z) - halfWidth / 256, z);
|
|
450
|
+
var lng0 = startlng;
|
|
451
|
+
if (this.maxLng - this.minLng === 360) {
|
|
452
|
+
if (lng0 > this.maxLng) lng0 = this.minLng + (lng0 - this.minLng) % (this.maxLng - this.minLng);
|
|
453
|
+
if (lng0 < this.minLng) lng0 = this.maxLng - (this.minLng - lng0) % (this.maxLng - this.minLng);
|
|
454
|
+
}
|
|
455
|
+
var x = this.lng2tile(lng0, z);
|
|
456
|
+
var x0 = this.lng2x(lng0, z);
|
|
457
|
+
var y = this.lat2tile(lat, z);
|
|
458
|
+
var y0 = this.lat2y(lat, z);
|
|
459
|
+
var marginX = (256 * (x + 1 - x0)) % 256 - 256;
|
|
294
460
|
var marginY = (halfHeight + 256 * (y + 1 - y0)) % 256 - 256;
|
|
295
|
-
var countX = Math.ceil((
|
|
296
|
-
var countY = Math.ceil((
|
|
461
|
+
var countX = Math.ceil((width - marginY) / 256) + 1;
|
|
462
|
+
var countY = Math.ceil((height - marginY) / 256);
|
|
297
463
|
var grids = [];
|
|
298
464
|
var startx = Math.round(x0 - (halfWidth - marginX) / 256);
|
|
299
465
|
var starty = Math.round(y0 - (halfHeight - marginY) / 256);
|
|
300
|
-
|
|
301
|
-
|
|
466
|
+
grids.startx = startx;
|
|
467
|
+
grids.starty = starty;
|
|
468
|
+
if (gridMash !== false) {
|
|
469
|
+
var minX = this.lng2tile(this.minLng, z);
|
|
470
|
+
var maxX = this.lng2tile(this.maxLng, z);
|
|
471
|
+
var x1 = this.lng2x(this.minLng, z);
|
|
472
|
+
var x2 = this.lng2x(this.maxLng, z);
|
|
473
|
+
if (minX > maxX) [minX, maxX, x1, x2] = [maxX, minX, x2, x1];
|
|
474
|
+
for (var cx = startx, dx = countX + cx; cx < dx;) {
|
|
302
475
|
for (var cy = starty, dy = cy + countY; cy < dy; cy++) {
|
|
303
|
-
grids.push([
|
|
476
|
+
grids.push([x, cy, cx]);
|
|
477
|
+
}
|
|
478
|
+
if (x + 1 > maxX) {
|
|
479
|
+
cx += x2 - maxX;
|
|
480
|
+
x = minX;
|
|
481
|
+
cx -= x1 - minX;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
x++;
|
|
485
|
+
cx++;
|
|
304
486
|
}
|
|
305
487
|
}
|
|
306
488
|
}
|
|
307
489
|
grids.zoom = z;
|
|
308
|
-
grids.startx = startx;
|
|
309
|
-
grids.starty = starty;
|
|
310
490
|
grids.left = marginX;
|
|
311
491
|
grids.top = marginY;
|
|
312
492
|
return grids;
|
|
313
493
|
},
|
|
314
|
-
|
|
315
|
-
|
|
494
|
+
refreshid: 0,
|
|
495
|
+
async refresh() {
|
|
496
|
+
var id = ++this.refreshid;
|
|
316
497
|
var grid = this.getGrid();
|
|
317
498
|
var { zoom } = grid;
|
|
318
|
-
|
|
319
|
-
this.
|
|
320
|
-
|
|
499
|
+
for (var [x, y, r] of grid) {
|
|
500
|
+
var c = this.cache[`${x}-${y}-${zoom}`];
|
|
501
|
+
this.drawImage(r, y, zoom, c && c.complete ? c : this.defaultImage());
|
|
502
|
+
}
|
|
503
|
+
return queue.call(grid, ([x, y, r = x]) => {
|
|
504
|
+
if (id !== this.refreshid) return false;
|
|
505
|
+
return this.drawLayer(x, y, zoom, r);
|
|
506
|
+
}, 2);
|
|
321
507
|
},
|
|
322
508
|
drawImage(x, y, z, image) {
|
|
323
509
|
var { startx, starty, zoom, left, top } = this.getGrid(false);
|
|
324
510
|
if (zoom !== z) return;
|
|
325
|
-
var
|
|
326
|
-
|
|
327
|
-
|
|
511
|
+
var width = 256;
|
|
512
|
+
var height = 256;
|
|
513
|
+
left = (x - startx) * width + left;
|
|
514
|
+
top = (y - starty) * height + top;
|
|
328
515
|
if (this.direction < 0) {
|
|
329
|
-
top = this.canvas.
|
|
516
|
+
top = this.canvas.height - top - height;
|
|
330
517
|
}
|
|
331
518
|
var scale = this.Scale();
|
|
332
519
|
if (scale !== 1) {
|
|
333
|
-
var {
|
|
334
|
-
var centerx =
|
|
335
|
-
var centery =
|
|
520
|
+
var { height: cheight, width: cwidth } = this.canvas;
|
|
521
|
+
var centerx = cwidth / 2;
|
|
522
|
+
var centery = cheight / 2;
|
|
336
523
|
left = (left - centerx) * scale + centerx;
|
|
337
524
|
top = (top - centery) * scale + centery;
|
|
338
525
|
width = scale * width;
|
|
339
526
|
height = scale * height;
|
|
340
527
|
}
|
|
341
|
-
|
|
342
|
-
left = round(left);
|
|
343
|
-
top = round(top);
|
|
344
|
-
width = round(width);
|
|
345
|
-
height = round(height);
|
|
346
|
-
this.context.clearRect(left, top, width, height);
|
|
347
|
-
// console.log(grids)
|
|
528
|
+
if (this.direction > 0) this.context.clearRect(left, top, width, height);
|
|
348
529
|
this.context.drawImage(image, left, top, width, height);
|
|
349
530
|
},
|
|
350
531
|
destroyImage(image) {
|
|
351
532
|
if (!image.complete) image.abort && image.abort();
|
|
533
|
+
delete this.cache[image._id];
|
|
352
534
|
image.onload = null;
|
|
353
535
|
image.onabort = null;
|
|
354
|
-
image.removeAttribute("src");
|
|
355
536
|
},
|
|
356
537
|
abortLoading(image) {
|
|
357
538
|
for (var cx = this.loadings.length - 1; cx >= 0; cx--) {
|
|
358
539
|
if (this.loadings[cx] === image) this.loadings.splice(cx, 1);
|
|
359
540
|
}
|
|
360
541
|
},
|
|
361
|
-
drawLayer(x, y, z) {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
},
|
|
377
|
-
lat2layer(lat, zoom) {
|
|
542
|
+
drawLayer(x, y, z, r) {
|
|
543
|
+
return new Promise((ok) => {
|
|
544
|
+
var image = this.getImage(x, y, z);
|
|
545
|
+
if (image.src && image.complete) {
|
|
546
|
+
this.drawImage(r, y, z, image);
|
|
547
|
+
setTimeout(ok, 1);
|
|
548
|
+
} else {
|
|
549
|
+
image.onload = () => {
|
|
550
|
+
this.abortLoading(image);
|
|
551
|
+
this.drawImage(r, y, z, image);
|
|
552
|
+
ok();
|
|
553
|
+
};
|
|
554
|
+
this.loadings.push(image);
|
|
555
|
+
}
|
|
556
|
+
});
|
|
378
557
|
},
|
|
379
558
|
lng2tile,
|
|
380
559
|
lat2tile,
|