efront 3.18.2 → 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.
@@ -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
- var context = this.context = canvas.getContext("2d");
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
- onmousedown(canvas, function (event) {
91
- event.preventDefault();
92
- var saved_point = {
93
- x: event.clientX,
94
- y: event.clientY
95
- };
96
- var cancelmove = onmousemove(window, function (event) {
97
- var { clientX, clientY } = event;
98
- var deltaX = clientX - saved_point.x
99
- var deltaY = clientY - saved_point.y;
100
- saved_point.x = clientX;
101
- saved_point.y = clientY;
102
- map.Move(deltaX, deltaY);
103
- });
104
- var cancelup = onmouseup(window, function () {
105
- cancelup();
106
- cancelmove();
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
- var scale = map.Scale();
115
- if (event.deltaY < 0) {
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: "http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png",
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 { canvas, context } = this;
135
- var imagedata = context.getImageData(0, 0, canvas.offsetWidth, canvas.offsetHeight);
136
- context.putImageData(imagedata, deltaX, deltaY);
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.offsetWidth + deltaX;
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.offsetHeight + deltaY;
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.offsetHeight);
152
- context.clearRect(0, y_start, canvas.offsetWidth, y_empty);
153
- var map = this;
154
- var [lng, lat] = map.Center();
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(scale, x, y) {
174
- if (isFinite(scale)) {
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
- if (x === undefined) {
182
- x = width >> 1;
310
+ var dw = width / 2;
311
+ var dh = height / 2;
312
+ if (layerX === undefined) {
313
+ layerX = dw;
183
314
  }
184
- if (y === undefined) {
185
- y = height >> 1;
315
+ if (layerY === undefined) {
316
+ layerY = dh;
186
317
  }
187
-
188
318
  var zoom = map.Zoom();
189
- var saved_value = zoom;
190
- if (scale >= 2) {
191
- zoom += 1;
192
- scale -= 1;
193
- } else if (scale <= 1) {
194
- zoom -= 1;
195
- scale += 1;
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 < 3) {
198
- zoom = 3;
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
- } else if (zoom > 23) {
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 dest_scale = Math.pow(2, zoom - saved_value);
205
- if (dest_scale !== 1) {
206
- var dwidth = width * dest_scale;
207
- var dheight = height * dest_scale;
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
- var dw = dwidth >> 1;
210
- var dh = dheight >> 1;
211
- var tempCanvas = this.canvas.cloneNode();
212
- tempCanvas.getContext("2d").putImageData(context.getImageData(0, 0, width, height), 0, 0);
213
- context.clearRect(0, 0, width, height);
214
- context.drawImage(tempCanvas, 0, 0, width, height, x - dw, y - dh, dwidth, dheight);
215
- this.center = [this.center[0] - (dw >> 1), this.center[1] - (dh >> 1)]
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 { offsetWidth, offsetHeight } = this.canvas;
229
- var x = centerx + (layerx - offsetWidth / 2) / 256;
230
- var y = centery + (layery - offsetHeight / 2) / 256;
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, this.getURL(x, y, z));
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(gridOnly) {
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
- offsetWidth,
289
- offsetHeight
442
+ width,
443
+ height
290
444
  } = this.canvas;
291
- var halfWidth = offsetWidth / 2;
292
- var halfHeight = offsetHeight / 2;
293
- var marginX = (halfWidth + 256 * (x + 1 - x0)) % 256 - 256;
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((offsetWidth - marginX) / 256);
296
- var countY = Math.ceil((offsetHeight - marginY) / 256);
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
- if (gridOnly !== false) {
301
- for (var cx = startx, dx = cx + countX; cx < dx; cx++) {
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([cx, cy]);
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
- refresh() {
315
- this.freeze();
494
+ refreshid: 0,
495
+ async refresh() {
496
+ var id = ++this.refreshid;
316
497
  var grid = this.getGrid();
317
498
  var { zoom } = grid;
318
- grid.map(([x, y]) => {
319
- this.drawLayer(x, y, zoom);
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 { width, height } = image;
326
- left = (x - startx) * 256 + left;
327
- top = (y - starty) * 256 + top;
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.offsetHeight - top - 256;
516
+ top = this.canvas.height - top - height;
330
517
  }
331
518
  var scale = this.Scale();
332
519
  if (scale !== 1) {
333
- var { offsetHeight, offsetWidth } = this.canvas;
334
- var centerx = offsetWidth / 2;
335
- var centery = offsetHeight / 2;
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
- var round = Math.round;
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
- var image = this.getImage(x, y, z);
363
- if (image.src && image.complete) {
364
- this.drawImage(x, y, z, image);
365
- this.destroyImage(image);
366
- } else {
367
- image.onload = () => {
368
- this.abortLoading(image);
369
- this.drawImage(x, y, z, image);
370
- this.destroyImage(image);
371
- };
372
- this.loadings.push(image);
373
- }
374
- },
375
- lng2layer(lng, zoom) {
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,
@@ -0,0 +1,8 @@
1
+ &{
2
+ display: block;
3
+ }
4
+ &>img{
5
+ position: absolute;
6
+ user-select: none;
7
+ pointer-events: none;
8
+ }
@@ -0,0 +1,2 @@
1
+ <menu -src="(m,i) in menus" @active="open(maps[i])"></menu>
2
+ <map #mp @click="locat"></map>