@antv/l7-layers 2.5.37 → 2.5.41
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/es/core/BaseLayer.d.ts +3 -1
- package/es/core/BaseLayer.js +6 -1
- package/es/core/BaseLayer.js.map +1 -1
- package/es/imagetile/index.d.ts +22 -0
- package/es/imagetile/index.js +82 -0
- package/es/imagetile/index.js.map +1 -0
- package/es/imagetile/models/imagetile.d.ts +11 -0
- package/es/imagetile/models/imagetile.js +160 -0
- package/es/imagetile/models/imagetile.js.map +1 -0
- package/es/imagetile/models/index.d.ts +5 -0
- package/es/imagetile/models/index.js +6 -0
- package/es/imagetile/models/index.js.map +1 -0
- package/es/imagetile/utils/ImageTile.d.ts +20 -0
- package/es/imagetile/utils/ImageTile.js +90 -0
- package/es/imagetile/utils/ImageTile.js.map +1 -0
- package/es/imagetile/utils/Tile.d.ts +27 -0
- package/es/imagetile/utils/Tile.js +321 -0
- package/es/imagetile/utils/Tile.js.map +1 -0
- package/es/imagetile/utils/lruCache.d.ts +20 -0
- package/es/imagetile/utils/lruCache.js +105 -0
- package/es/imagetile/utils/lruCache.js.map +1 -0
- package/es/imagetile/utils/tileCache.d.ts +8 -0
- package/es/imagetile/utils/tileCache.js +50 -0
- package/es/imagetile/utils/tileCache.js.map +1 -0
- package/es/index.d.ts +2 -1
- package/es/index.js +2 -1
- package/es/index.js.map +1 -1
- package/es/line/index.d.ts +2 -0
- package/es/line/index.js +3 -0
- package/es/line/index.js.map +1 -1
- package/es/line/models/arc.js +2 -2
- package/es/line/models/arc_3d.js +2 -2
- package/es/line/models/arcmini.d.ts +9 -0
- package/es/line/models/arcmini.js +144 -0
- package/es/line/models/arcmini.js.map +1 -0
- package/es/line/models/great_circle.js +2 -2
- package/es/line/models/index.d.ts +1 -1
- package/es/line/models/index.js +2 -0
- package/es/line/models/index.js.map +1 -1
- package/es/line/models/line.js +2 -2
- package/lib/core/BaseLayer.js +4 -1
- package/lib/core/BaseLayer.js.map +1 -1
- package/lib/imagetile/index.js +95 -0
- package/lib/imagetile/index.js.map +1 -0
- package/lib/imagetile/models/imagetile.js +177 -0
- package/lib/imagetile/models/imagetile.js.map +1 -0
- package/lib/imagetile/models/index.js +17 -0
- package/lib/imagetile/models/index.js.map +1 -0
- package/lib/imagetile/utils/ImageTile.js +99 -0
- package/lib/imagetile/utils/ImageTile.js.map +1 -0
- package/lib/imagetile/utils/Tile.js +324 -0
- package/lib/imagetile/utils/Tile.js.map +1 -0
- package/lib/imagetile/utils/lruCache.js +109 -0
- package/lib/imagetile/utils/lruCache.js.map +1 -0
- package/lib/imagetile/utils/tileCache.js +58 -0
- package/lib/imagetile/utils/tileCache.js.map +1 -0
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -1
- package/lib/line/index.js +3 -0
- package/lib/line/index.js.map +1 -1
- package/lib/line/models/arc.js +2 -2
- package/lib/line/models/arc_3d.js +2 -2
- package/lib/line/models/arcmini.js +160 -0
- package/lib/line/models/arcmini.js.map +1 -0
- package/lib/line/models/great_circle.js +2 -2
- package/lib/line/models/index.js +3 -0
- package/lib/line/models/index.js.map +1 -1
- package/lib/line/models/line.js +2 -2
- package/package.json +6 -5
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { LngLatBounds } from '@antv/geo-coord';
|
|
2
|
+
import { Container } from 'inversify';
|
|
3
|
+
interface IUrlParams {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
z: number;
|
|
7
|
+
s?: string;
|
|
8
|
+
}
|
|
9
|
+
export default class ImageTile {
|
|
10
|
+
tile: number[];
|
|
11
|
+
name: string;
|
|
12
|
+
imageLayer: any;
|
|
13
|
+
constructor(key: string, url: string, container: Container, sceneContainer: Container);
|
|
14
|
+
destroy(): void;
|
|
15
|
+
getTileURL(urlParams: IUrlParams, path: string): string;
|
|
16
|
+
tileLnglatBounds(tile: number[]): LngLatBounds;
|
|
17
|
+
tile2lng(x: number, z: number): number;
|
|
18
|
+
tile2lat(y: number, z: number): number;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import { toLngLatBounds } from '@antv/geo-coord';
|
|
5
|
+
import ImageLayer from '../../image';
|
|
6
|
+
var r2d = 180 / Math.PI;
|
|
7
|
+
var tileURLRegex = /\{([zxy])\}/g;
|
|
8
|
+
|
|
9
|
+
var ImageTile = function () {
|
|
10
|
+
function ImageTile(key, url, container, sceneContainer) {
|
|
11
|
+
_classCallCheck(this, ImageTile);
|
|
12
|
+
|
|
13
|
+
_defineProperty(this, "tile", void 0);
|
|
14
|
+
|
|
15
|
+
_defineProperty(this, "name", void 0);
|
|
16
|
+
|
|
17
|
+
_defineProperty(this, "imageLayer", void 0);
|
|
18
|
+
|
|
19
|
+
this.name = key;
|
|
20
|
+
this.tile = key.split('_').map(function (v) {
|
|
21
|
+
return Number(v);
|
|
22
|
+
});
|
|
23
|
+
var urlParams = {
|
|
24
|
+
x: this.tile[0],
|
|
25
|
+
y: this.tile[1],
|
|
26
|
+
z: this.tile[2]
|
|
27
|
+
};
|
|
28
|
+
var imageSrc = this.getTileURL(urlParams, url);
|
|
29
|
+
var lnglatBounds = this.tileLnglatBounds(this.tile);
|
|
30
|
+
var west = lnglatBounds.getWest();
|
|
31
|
+
var south = lnglatBounds.getSouth();
|
|
32
|
+
var east = lnglatBounds.getEast();
|
|
33
|
+
var north = lnglatBounds.getNorth();
|
|
34
|
+
var imageLayer = new ImageLayer({});
|
|
35
|
+
imageLayer.source(imageSrc, {
|
|
36
|
+
parser: {
|
|
37
|
+
type: 'image',
|
|
38
|
+
extent: [west, south, east, north]
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
imageLayer.setContainer(container, sceneContainer);
|
|
42
|
+
imageLayer.init();
|
|
43
|
+
this.imageLayer = imageLayer;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_createClass(ImageTile, [{
|
|
47
|
+
key: "destroy",
|
|
48
|
+
value: function destroy() {
|
|
49
|
+
this.imageLayer.clearModels();
|
|
50
|
+
this.imageLayer.destroy();
|
|
51
|
+
}
|
|
52
|
+
}, {
|
|
53
|
+
key: "getTileURL",
|
|
54
|
+
value: function getTileURL(urlParams, path) {
|
|
55
|
+
if (!urlParams.s) {
|
|
56
|
+
urlParams.s = String.fromCharCode(97 + Math.floor(Math.random() * 3));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
tileURLRegex.lastIndex = 0;
|
|
60
|
+
return path.replace(tileURLRegex, function (value, key) {
|
|
61
|
+
return urlParams[key];
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}, {
|
|
65
|
+
key: "tileLnglatBounds",
|
|
66
|
+
value: function tileLnglatBounds(tile) {
|
|
67
|
+
var e = this.tile2lng(tile[0] + 1, tile[2]);
|
|
68
|
+
var w = this.tile2lng(tile[0], tile[2]);
|
|
69
|
+
var s = this.tile2lat(tile[1] + 1, tile[2]);
|
|
70
|
+
var n = this.tile2lat(tile[1], tile[2]);
|
|
71
|
+
return toLngLatBounds([w, n], [e, s]);
|
|
72
|
+
}
|
|
73
|
+
}, {
|
|
74
|
+
key: "tile2lng",
|
|
75
|
+
value: function tile2lng(x, z) {
|
|
76
|
+
return x / Math.pow(2, z) * 360 - 180;
|
|
77
|
+
}
|
|
78
|
+
}, {
|
|
79
|
+
key: "tile2lat",
|
|
80
|
+
value: function tile2lat(y, z) {
|
|
81
|
+
var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);
|
|
82
|
+
return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));
|
|
83
|
+
}
|
|
84
|
+
}]);
|
|
85
|
+
|
|
86
|
+
return ImageTile;
|
|
87
|
+
}();
|
|
88
|
+
|
|
89
|
+
export { ImageTile as default };
|
|
90
|
+
//# sourceMappingURL=ImageTile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/imagetile/utils/ImageTile.ts"],"names":["toLngLatBounds","ImageLayer","r2d","Math","PI","tileURLRegex","ImageTile","key","url","container","sceneContainer","name","tile","split","map","v","Number","urlParams","x","y","z","imageSrc","getTileURL","lnglatBounds","tileLnglatBounds","west","getWest","south","getSouth","east","getEast","north","getNorth","imageLayer","source","parser","type","extent","setContainer","init","clearModels","destroy","path","s","String","fromCharCode","floor","random","lastIndex","replace","value","e","tile2lng","w","tile2lat","n","pow","atan","exp"],"mappings":"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","sourcesContent":["import { LngLatBounds, toBounds, toLngLatBounds } from '@antv/geo-coord';\nimport { Container } from 'inversify';\nimport ImageLayer from '../../image';\n\ninterface IUrlParams {\n x: number;\n y: number;\n z: number;\n s?: string;\n}\n\nconst r2d = 180 / Math.PI;\nconst tileURLRegex = /\\{([zxy])\\}/g;\n\nexport default class ImageTile {\n public tile: number[]; // 当前图片瓦片的索引\n public name: string;\n public imageLayer: any;\n constructor(\n key: string,\n url: string,\n container: Container,\n sceneContainer: Container,\n ) {\n this.name = key;\n this.tile = key.split('_').map((v) => Number(v));\n\n const urlParams = {\n x: this.tile[0],\n y: this.tile[1],\n z: this.tile[2],\n };\n const imageSrc = this.getTileURL(urlParams, url);\n\n const lnglatBounds = this.tileLnglatBounds(this.tile);\n const west = lnglatBounds.getWest();\n const south = lnglatBounds.getSouth();\n const east = lnglatBounds.getEast();\n const north = lnglatBounds.getNorth();\n\n const imageLayer = new ImageLayer({});\n imageLayer.source(\n // 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg',\n imageSrc,\n {\n parser: {\n type: 'image',\n // extent: [121.168, 30.2828, 121.384, 30.4219],\n extent: [west, south, east, north],\n },\n },\n );\n\n imageLayer.setContainer(container, sceneContainer);\n imageLayer.init();\n\n this.imageLayer = imageLayer;\n }\n\n public destroy() {\n this.imageLayer.clearModels();\n this.imageLayer.destroy();\n }\n\n public getTileURL(urlParams: IUrlParams, path: string) {\n if (!urlParams.s) {\n // Default to a random choice of a, b or c\n urlParams.s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n }\n\n tileURLRegex.lastIndex = 0;\n return path.replace(tileURLRegex, (value, key: any) => {\n // @ts-ignore\n return urlParams[key];\n });\n }\n\n // Get tile bounds in WGS84 coordinates\n public tileLnglatBounds(tile: number[]) {\n const e = this.tile2lng(tile[0] + 1, tile[2]);\n const w = this.tile2lng(tile[0], tile[2]);\n const s = this.tile2lat(tile[1] + 1, tile[2]);\n const n = this.tile2lat(tile[1], tile[2]);\n return toLngLatBounds([w, n], [e, s]);\n }\n\n public tile2lng(x: number, z: number) {\n return (x / Math.pow(2, z)) * 360 - 180;\n }\n\n public tile2lat(y: number, z: number) {\n const n = Math.PI - (2 * Math.PI * y) / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n }\n}\n"],"file":"ImageTile.js"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Bounds } from '@antv/geo-coord';
|
|
2
|
+
import { ILayer, ILayerService, ILngLat } from '@antv/l7-core';
|
|
3
|
+
export default class Tile {
|
|
4
|
+
tileList: any;
|
|
5
|
+
tileCache: any;
|
|
6
|
+
updateTileList: any[];
|
|
7
|
+
tileZoom: number;
|
|
8
|
+
noPruneRange: any;
|
|
9
|
+
url: string;
|
|
10
|
+
resolution: number;
|
|
11
|
+
maxSourceZoom: number;
|
|
12
|
+
crstype: string;
|
|
13
|
+
currentCrs: any;
|
|
14
|
+
layerService: ILayerService;
|
|
15
|
+
layer: ILayer;
|
|
16
|
+
constructor(props: any);
|
|
17
|
+
calCurrentTiles(oprions: any): void;
|
|
18
|
+
pxBoundsToTileRange(pixelBounds: any): Bounds;
|
|
19
|
+
getPixelBounds(NE: ILngLat, SW: ILngLat, tileCenter: ILngLat, tileZoom: number, crs: any): Bounds;
|
|
20
|
+
pruneTiles(): void;
|
|
21
|
+
requestTile(key: string): void;
|
|
22
|
+
retainParent(x: number, y: number, z: number, minZoom: number): any;
|
|
23
|
+
retainChildren(x: number, y: number, z: number, maxZoom: number): void;
|
|
24
|
+
destroyTile(tile: any): void;
|
|
25
|
+
removeOutTiles(): void;
|
|
26
|
+
removeTiles(): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
4
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
5
|
+
import { Bounds, GeoCoordinates, Point, toLngLat } from '@antv/geo-coord';
|
|
6
|
+
import { createLayerContainer } from '@antv/l7-core';
|
|
7
|
+
import ImageTile from './ImageTile';
|
|
8
|
+
import TileCache from './tileCache';
|
|
9
|
+
var CacheLimit = 30;
|
|
10
|
+
|
|
11
|
+
var Tile = function () {
|
|
12
|
+
function Tile(props) {
|
|
13
|
+
_classCallCheck(this, Tile);
|
|
14
|
+
|
|
15
|
+
_defineProperty(this, "tileList", {});
|
|
16
|
+
|
|
17
|
+
_defineProperty(this, "tileCache", void 0);
|
|
18
|
+
|
|
19
|
+
_defineProperty(this, "updateTileList", void 0);
|
|
20
|
+
|
|
21
|
+
_defineProperty(this, "tileZoom", void 0);
|
|
22
|
+
|
|
23
|
+
_defineProperty(this, "noPruneRange", void 0);
|
|
24
|
+
|
|
25
|
+
_defineProperty(this, "url", void 0);
|
|
26
|
+
|
|
27
|
+
_defineProperty(this, "resolution", void 0);
|
|
28
|
+
|
|
29
|
+
_defineProperty(this, "maxSourceZoom", void 0);
|
|
30
|
+
|
|
31
|
+
_defineProperty(this, "crstype", void 0);
|
|
32
|
+
|
|
33
|
+
_defineProperty(this, "currentCrs", void 0);
|
|
34
|
+
|
|
35
|
+
_defineProperty(this, "layerService", void 0);
|
|
36
|
+
|
|
37
|
+
_defineProperty(this, "layer", void 0);
|
|
38
|
+
|
|
39
|
+
this.layerService = props.layerService;
|
|
40
|
+
this.layer = props.layer;
|
|
41
|
+
this.url = props.url;
|
|
42
|
+
this.resolution = props.resolution === 'low' ? -1 : 0;
|
|
43
|
+
this.maxSourceZoom = props.maxSourceZoom;
|
|
44
|
+
this.crstype = props.crstype;
|
|
45
|
+
this.currentCrs = new GeoCoordinates.default({
|
|
46
|
+
start: {
|
|
47
|
+
x: 0,
|
|
48
|
+
y: 0
|
|
49
|
+
},
|
|
50
|
+
end: {
|
|
51
|
+
x: 0,
|
|
52
|
+
y: 0
|
|
53
|
+
},
|
|
54
|
+
projection: this.crstype
|
|
55
|
+
}).crs;
|
|
56
|
+
this.destroyTile = this.destroyTile.bind(this);
|
|
57
|
+
this.tileCache = new TileCache(CacheLimit, this.destroyTile);
|
|
58
|
+
this.updateTileList = [];
|
|
59
|
+
this.removeTiles = this.removeTiles.bind(this);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
_createClass(Tile, [{
|
|
63
|
+
key: "calCurrentTiles",
|
|
64
|
+
value: function calCurrentTiles(oprions) {
|
|
65
|
+
var _this = this;
|
|
66
|
+
|
|
67
|
+
var NE = oprions.NE,
|
|
68
|
+
SW = oprions.SW,
|
|
69
|
+
tileCenter = oprions.tileCenter,
|
|
70
|
+
currentZoom = oprions.currentZoom,
|
|
71
|
+
minSourceZoom = oprions.minSourceZoom,
|
|
72
|
+
minZoom = oprions.minZoom,
|
|
73
|
+
maxZoom = oprions.maxZoom;
|
|
74
|
+
|
|
75
|
+
if (currentZoom >= this.maxSourceZoom) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
var zoom = Math.floor(currentZoom) + this.resolution;
|
|
80
|
+
this.tileZoom = zoom > this.maxSourceZoom ? this.maxSourceZoom : zoom;
|
|
81
|
+
|
|
82
|
+
if (currentZoom < minZoom || currentZoom >= maxZoom || currentZoom < minSourceZoom) {
|
|
83
|
+
this.removeTiles();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
this.updateTileList = [];
|
|
88
|
+
var centerPoint = this.currentCrs.lngLatToPoint(toLngLat(tileCenter.lng, tileCenter.lat), this.tileZoom);
|
|
89
|
+
var centerXY = centerPoint.divideBy(256).floor();
|
|
90
|
+
var pixelBounds = this.getPixelBounds(NE, SW, tileCenter, this.tileZoom, this.currentCrs);
|
|
91
|
+
var tileRange = this.pxBoundsToTileRange(pixelBounds);
|
|
92
|
+
var margin = 4;
|
|
93
|
+
this.noPruneRange = new Bounds(tileRange.getBottomLeft().subtract([margin, -margin]), tileRange.getTopRight().add([margin, -margin]));
|
|
94
|
+
|
|
95
|
+
if (!(isFinite(tileRange.min.x) && isFinite(tileRange.min.y) && isFinite(tileRange.max.x) && isFinite(tileRange.max.y))) {
|
|
96
|
+
throw new Error('Attempted to load an infinite number of tiles');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for (var j = tileRange.min.y; j <= tileRange.max.y; j++) {
|
|
100
|
+
for (var i = tileRange.min.x; i <= tileRange.max.x; i++) {
|
|
101
|
+
var coords = [i, j, this.tileZoom];
|
|
102
|
+
var tile = this.tileList[coords.join('_')];
|
|
103
|
+
|
|
104
|
+
if (tile) {
|
|
105
|
+
tile.current = true;
|
|
106
|
+
} else {
|
|
107
|
+
this.tileList[coords.join('_')] = {
|
|
108
|
+
current: true,
|
|
109
|
+
coords: coords
|
|
110
|
+
};
|
|
111
|
+
this.updateTileList.push(coords);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this.updateTileList.sort(function (a, b) {
|
|
117
|
+
var tile1 = a;
|
|
118
|
+
var tile2 = b;
|
|
119
|
+
var d1 = Math.pow(tile1[0] * 1 - centerXY.x, 2) + Math.pow(tile1[1] * 1 - centerXY.y, 2);
|
|
120
|
+
var d2 = Math.pow(tile2[0] * 1 - centerXY.x, 2) + Math.pow(tile2[1] * 1 - centerXY.y, 2);
|
|
121
|
+
return d1 - d2;
|
|
122
|
+
});
|
|
123
|
+
this.pruneTiles();
|
|
124
|
+
this.updateTileList.forEach(function (coords) {
|
|
125
|
+
var key = coords.join('_');
|
|
126
|
+
|
|
127
|
+
if (_this.tileList[key].current) {
|
|
128
|
+
_this.requestTile(key);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}, {
|
|
133
|
+
key: "pxBoundsToTileRange",
|
|
134
|
+
value: function pxBoundsToTileRange(pixelBounds) {
|
|
135
|
+
return new Bounds(pixelBounds.min.divideBy(256).floor(), pixelBounds.max.divideBy(256).ceil().subtract([1, 1]));
|
|
136
|
+
}
|
|
137
|
+
}, {
|
|
138
|
+
key: "getPixelBounds",
|
|
139
|
+
value: function getPixelBounds(NE, SW, tileCenter, tileZoom, crs) {
|
|
140
|
+
var zoom = tileZoom;
|
|
141
|
+
var NEPoint = crs.lngLatToPoint(toLngLat(NE.lng, NE.lat), zoom);
|
|
142
|
+
var SWPoint = crs.lngLatToPoint(toLngLat(SW.lng, SW.lat), zoom);
|
|
143
|
+
var centerPoint = crs.lngLatToPoint(toLngLat(tileCenter.lng, tileCenter.lat), zoom);
|
|
144
|
+
var topHeight = centerPoint.y - NEPoint.y;
|
|
145
|
+
var bottomHeight = SWPoint.y - centerPoint.y;
|
|
146
|
+
var leftWidth;
|
|
147
|
+
var rightWidth;
|
|
148
|
+
|
|
149
|
+
if (tileCenter.lng - NE.lng > 0 || tileCenter.lng - SW.lng < 0) {
|
|
150
|
+
var width = Math.pow(2, zoom) * 256 / 360 * (180 - NE.lng) + Math.pow(2, zoom) * 256 / 360 * (SW.lng + 180);
|
|
151
|
+
|
|
152
|
+
if (tileCenter.lng - NE.lng > 0) {
|
|
153
|
+
leftWidth = Math.pow(2, zoom) * 256 / 360 * (tileCenter.lng - NE.lng);
|
|
154
|
+
rightWidth = width - leftWidth;
|
|
155
|
+
} else {
|
|
156
|
+
rightWidth = Math.pow(2, zoom) * 256 / 360 * (SW.lng - tileCenter.lng);
|
|
157
|
+
leftWidth = width - rightWidth;
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
leftWidth = Math.pow(2, zoom) * 256 / 360 * (tileCenter.lng - SW.lng);
|
|
161
|
+
rightWidth = Math.pow(2, zoom) * 256 / 360 * (NE.lng - tileCenter.lng);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
var pixelBounds = new Bounds(centerPoint.subtract(leftWidth, topHeight), centerPoint.add(rightWidth, bottomHeight));
|
|
165
|
+
return pixelBounds;
|
|
166
|
+
}
|
|
167
|
+
}, {
|
|
168
|
+
key: "pruneTiles",
|
|
169
|
+
value: function pruneTiles() {
|
|
170
|
+
var _this2 = this;
|
|
171
|
+
|
|
172
|
+
Object.keys(this.tileList).map(function (key) {
|
|
173
|
+
var c = _this2.tileList[key].coords;
|
|
174
|
+
|
|
175
|
+
if (c[2] !== _this2.tileZoom || !_this2.noPruneRange.contains(new Point(c[0], c[1]))) {
|
|
176
|
+
_this2.tileList[key].current = false;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
Object.keys(this.tileList).map(function (key) {
|
|
180
|
+
var tile = _this2.tileList[key];
|
|
181
|
+
tile.retain = tile.current;
|
|
182
|
+
});
|
|
183
|
+
Object.keys(this.tileList).map(function (key) {
|
|
184
|
+
var tile = _this2.tileList[key];
|
|
185
|
+
|
|
186
|
+
if (tile.current && !tile.active) {
|
|
187
|
+
var _key$split$map = key.split('_').map(function (v) {
|
|
188
|
+
return Number(v);
|
|
189
|
+
}),
|
|
190
|
+
_key$split$map2 = _slicedToArray(_key$split$map, 3),
|
|
191
|
+
x = _key$split$map2[0],
|
|
192
|
+
y = _key$split$map2[1],
|
|
193
|
+
z = _key$split$map2[2];
|
|
194
|
+
|
|
195
|
+
if (!_this2.retainParent(x, y, z, z - 5)) {
|
|
196
|
+
_this2.retainChildren(x, y, z, z + 2);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
this.removeOutTiles();
|
|
201
|
+
}
|
|
202
|
+
}, {
|
|
203
|
+
key: "requestTile",
|
|
204
|
+
value: function requestTile(key) {
|
|
205
|
+
var t = this.tileList[key];
|
|
206
|
+
|
|
207
|
+
if (!t) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
var tile = this.tileCache.getTile(key);
|
|
212
|
+
|
|
213
|
+
if (!tile) {
|
|
214
|
+
var container = createLayerContainer(this.layer.sceneContainer);
|
|
215
|
+
tile = new ImageTile(key, this.url, container, this.layer.sceneContainer);
|
|
216
|
+
tile.name = key;
|
|
217
|
+
t.current = true;
|
|
218
|
+
t.retain = true;
|
|
219
|
+
t.active = true;
|
|
220
|
+
this.layer.layerChildren.push(tile.imageLayer);
|
|
221
|
+
this.tileCache.setTile(tile, key);
|
|
222
|
+
this.pruneTiles();
|
|
223
|
+
this.layerService.renderLayers();
|
|
224
|
+
} else {
|
|
225
|
+
tile.imageLayer.show();
|
|
226
|
+
t.current = true;
|
|
227
|
+
t.retain = true;
|
|
228
|
+
t.active = true;
|
|
229
|
+
this.pruneTiles();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}, {
|
|
233
|
+
key: "retainParent",
|
|
234
|
+
value: function retainParent(x, y, z, minZoom) {
|
|
235
|
+
var x2 = Math.floor(x / 2);
|
|
236
|
+
var y2 = Math.floor(y / 2);
|
|
237
|
+
var z2 = z - 1;
|
|
238
|
+
var tile = this.tileList[[x2, y2, z2].join('_')];
|
|
239
|
+
|
|
240
|
+
if (tile && tile.active) {
|
|
241
|
+
tile.retain = true;
|
|
242
|
+
return true;
|
|
243
|
+
} else if (tile && tile.loaded) {
|
|
244
|
+
tile.retain = true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (z2 > minZoom) {
|
|
248
|
+
return this.retainParent(x2, y2, z2, minZoom);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}, {
|
|
254
|
+
key: "retainChildren",
|
|
255
|
+
value: function retainChildren(x, y, z, maxZoom) {
|
|
256
|
+
for (var i = 2 * x; i < 2 * x + 2; i++) {
|
|
257
|
+
for (var j = 2 * y; j < 2 * y + 2; j++) {
|
|
258
|
+
var key = [i, j, z + 1].join('_');
|
|
259
|
+
var tile = this.tileList[key];
|
|
260
|
+
|
|
261
|
+
if (tile && tile.active) {
|
|
262
|
+
tile.retain = true;
|
|
263
|
+
continue;
|
|
264
|
+
} else if (tile && tile.loaded) {
|
|
265
|
+
tile.retain = true;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (z + 1 < maxZoom) {
|
|
269
|
+
this.retainChildren(i, j, z + 1, maxZoom);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}, {
|
|
275
|
+
key: "destroyTile",
|
|
276
|
+
value: function destroyTile(tile) {
|
|
277
|
+
var layerIndex = this.layer.layerChildren.indexOf(tile.imageLayer);
|
|
278
|
+
|
|
279
|
+
if (layerIndex > -1) {
|
|
280
|
+
this.layer.layerChildren.splice(layerIndex, 1);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
tile.imageLayer.emit('remove', null);
|
|
284
|
+
tile.imageLayer.destroy();
|
|
285
|
+
this.layerService.renderLayers();
|
|
286
|
+
tile = null;
|
|
287
|
+
}
|
|
288
|
+
}, {
|
|
289
|
+
key: "removeOutTiles",
|
|
290
|
+
value: function removeOutTiles() {
|
|
291
|
+
for (var key in this.tileList) {
|
|
292
|
+
if (!this.tileList[key].retain) {
|
|
293
|
+
var tile = this.tileCache.getTile(key);
|
|
294
|
+
|
|
295
|
+
if (tile) {
|
|
296
|
+
tile.imageLayer.hide();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
delete this.tileList[key];
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}, {
|
|
304
|
+
key: "removeTiles",
|
|
305
|
+
value: function removeTiles() {
|
|
306
|
+
this.layer.layerChildren.forEach(function (layer) {
|
|
307
|
+
layer.emit('remove', null);
|
|
308
|
+
layer.destroy();
|
|
309
|
+
});
|
|
310
|
+
this.layer.layerChildren = [];
|
|
311
|
+
this.layerService.renderLayers();
|
|
312
|
+
this.tileList = {};
|
|
313
|
+
this.tileCache.destory();
|
|
314
|
+
}
|
|
315
|
+
}]);
|
|
316
|
+
|
|
317
|
+
return Tile;
|
|
318
|
+
}();
|
|
319
|
+
|
|
320
|
+
export { Tile as default };
|
|
321
|
+
//# sourceMappingURL=Tile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/imagetile/utils/Tile.ts"],"names":["Bounds","GeoCoordinates","Point","toLngLat","createLayerContainer","ImageTile","TileCache","CacheLimit","Tile","props","layerService","layer","url","resolution","maxSourceZoom","crstype","currentCrs","default","start","x","y","end","projection","crs","destroyTile","bind","tileCache","updateTileList","removeTiles","oprions","NE","SW","tileCenter","currentZoom","minSourceZoom","minZoom","maxZoom","zoom","Math","floor","tileZoom","centerPoint","lngLatToPoint","lng","lat","centerXY","divideBy","pixelBounds","getPixelBounds","tileRange","pxBoundsToTileRange","margin","noPruneRange","getBottomLeft","subtract","getTopRight","add","isFinite","min","max","Error","j","i","coords","tile","tileList","join","current","push","sort","a","b","tile1","tile2","d1","pow","d2","pruneTiles","forEach","key","requestTile","ceil","NEPoint","SWPoint","topHeight","bottomHeight","leftWidth","rightWidth","width","Object","keys","map","c","contains","retain","active","split","v","Number","z","retainParent","retainChildren","removeOutTiles","t","getTile","container","sceneContainer","name","layerChildren","imageLayer","setTile","renderLayers","show","x2","y2","z2","loaded","layerIndex","indexOf","splice","emit","destroy","hide","destory"],"mappings":"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","sourcesContent":["import { Bounds, GeoCoordinates, Point, toLngLat } from '@antv/geo-coord';\nimport {\n createLayerContainer,\n ILayer,\n ILayerService,\n ILngLat,\n} from '@antv/l7-core';\nimport { Container } from 'inversify';\n\nimport ImageTile from './ImageTile';\nimport TileCache from './tileCache';\n\n// Tip: 瓦片地图的存储上限\nconst CacheLimit = 30;\n\nexport default class Tile {\n public tileList: any = {};\n public tileCache: any;\n\n public updateTileList: any[];\n public tileZoom: number;\n public noPruneRange: any;\n public url: string;\n public resolution: number;\n public maxSourceZoom: number;\n public crstype: string;\n public currentCrs: any;\n\n public layerService: ILayerService;\n public layer: ILayer;\n constructor(props: any) {\n this.layerService = props.layerService;\n this.layer = props.layer;\n this.url = props.url;\n this.resolution = props.resolution === 'low' ? -1 : 0;\n this.maxSourceZoom = props.maxSourceZoom;\n this.crstype = props.crstype;\n\n this.currentCrs = new GeoCoordinates.default({\n start: { x: 0, y: 0 },\n end: { x: 0, y: 0 },\n projection: this.crstype,\n }).crs as any;\n\n this.destroyTile = this.destroyTile.bind(this);\n this.tileCache = new TileCache(CacheLimit, this.destroyTile);\n\n this.updateTileList = [];\n\n this.removeTiles = this.removeTiles.bind(this);\n }\n\n public calCurrentTiles(oprions: any) {\n const {\n NE,\n SW,\n tileCenter,\n currentZoom,\n minSourceZoom,\n minZoom,\n maxZoom,\n } = oprions;\n // TODO: 当前瓦片的层级要比地图底图的层级低\n if (currentZoom >= this.maxSourceZoom) {\n return;\n }\n const zoom = Math.floor(currentZoom) + this.resolution;\n\n this.tileZoom = zoom > this.maxSourceZoom ? this.maxSourceZoom : zoom;\n\n if (\n currentZoom < minZoom ||\n currentZoom >= maxZoom ||\n currentZoom < minSourceZoom\n ) {\n this.removeTiles();\n return;\n }\n\n this.updateTileList = [];\n\n // 计算瓦片中心\n const centerPoint = this.currentCrs.lngLatToPoint(\n toLngLat(tileCenter.lng, tileCenter.lat),\n this.tileZoom,\n );\n const centerXY = centerPoint.divideBy(256).floor();\n\n const pixelBounds = this.getPixelBounds(\n NE,\n SW,\n tileCenter,\n this.tileZoom,\n this.currentCrs,\n ); // 计算像素范围\n const tileRange = this.pxBoundsToTileRange(pixelBounds); // 计算瓦片范围\n\n const margin = 4;\n\n this.noPruneRange = new Bounds(\n tileRange.getBottomLeft().subtract([margin, -margin]),\n tileRange.getTopRight().add([margin, -margin]),\n );\n\n // T: isFinite(n: number) 用于检测 n 是否无穷大\n if (\n !(\n isFinite(tileRange.min.x) &&\n isFinite(tileRange.min.y) &&\n isFinite(tileRange.max.x) &&\n isFinite(tileRange.max.y)\n )\n ) {\n throw new Error('Attempted to load an infinite number of tiles');\n }\n\n // 根据视野判断新增的瓦片索引\n for (let j = tileRange.min.y; j <= tileRange.max.y; j++) {\n for (let i = tileRange.min.x; i <= tileRange.max.x; i++) {\n const coords = [i, j, this.tileZoom];\n const tile = this.tileList[coords.join('_')];\n if (tile) {\n tile.current = true;\n } else {\n this.tileList[coords.join('_')] = {\n current: true,\n coords,\n };\n this.updateTileList.push(coords);\n }\n }\n }\n\n // 瓦片列表排序\n this.updateTileList.sort((a: any, b: any) => {\n const tile1 = a;\n const tile2 = b;\n const d1 =\n Math.pow(tile1[0] * 1 - centerXY.x, 2) +\n Math.pow(tile1[1] * 1 - centerXY.y, 2);\n const d2 =\n Math.pow(tile2[0] * 1 - centerXY.x, 2) +\n Math.pow(tile2[1] * 1 - centerXY.y, 2);\n return d1 - d2;\n });\n\n this.pruneTiles();\n this.updateTileList.forEach((coords: any) => {\n const key = coords.join('_');\n if (this.tileList[key].current) {\n this.requestTile(key);\n }\n });\n }\n\n public pxBoundsToTileRange(pixelBounds: any) {\n return new Bounds(\n pixelBounds.min.divideBy(256).floor(),\n pixelBounds.max\n .divideBy(256)\n .ceil()\n .subtract([1, 1]),\n );\n }\n\n public getPixelBounds(\n NE: ILngLat,\n SW: ILngLat,\n tileCenter: ILngLat,\n tileZoom: number,\n crs: any,\n ) {\n const zoom = tileZoom;\n const NEPoint = crs.lngLatToPoint(toLngLat(NE.lng, NE.lat), zoom);\n const SWPoint = crs.lngLatToPoint(toLngLat(SW.lng, SW.lat), zoom);\n const centerPoint = crs.lngLatToPoint(\n toLngLat(tileCenter.lng, tileCenter.lat),\n zoom,\n );\n const topHeight = centerPoint.y - NEPoint.y;\n const bottomHeight = SWPoint.y - centerPoint.y;\n // 跨日界线的情况\n let leftWidth;\n let rightWidth;\n if (tileCenter.lng - NE.lng > 0 || tileCenter.lng - SW.lng < 0) {\n const width =\n ((Math.pow(2, zoom) * 256) / 360) * (180 - NE.lng) +\n ((Math.pow(2, zoom) * 256) / 360) * (SW.lng + 180);\n if (tileCenter.lng - NE.lng > 0) {\n // 日界线在右侧\n leftWidth =\n ((Math.pow(2, zoom) * 256) / 360) * (tileCenter.lng - NE.lng);\n rightWidth = width - leftWidth;\n } else {\n rightWidth =\n ((Math.pow(2, zoom) * 256) / 360) * (SW.lng - tileCenter.lng);\n leftWidth = width - rightWidth;\n }\n } else {\n // 不跨日界线\n leftWidth = ((Math.pow(2, zoom) * 256) / 360) * (tileCenter.lng - SW.lng);\n rightWidth =\n ((Math.pow(2, zoom) * 256) / 360) * (NE.lng - tileCenter.lng);\n }\n const pixelBounds = new Bounds(\n centerPoint.subtract(leftWidth, topHeight),\n centerPoint.add(rightWidth, bottomHeight),\n );\n return pixelBounds;\n }\n\n public pruneTiles() {\n Object.keys(this.tileList).map((key) => {\n const c = this.tileList[key].coords;\n // 如果不是同一个缩放层级,则将瓦片设为不显示\n if (\n c[2] !== this.tileZoom ||\n !this.noPruneRange.contains(new Point(c[0], c[1]))\n ) {\n this.tileList[key].current = false;\n }\n });\n\n Object.keys(this.tileList).map((key) => {\n const tile = this.tileList[key];\n tile.retain = tile.current;\n });\n\n Object.keys(this.tileList).map((key) => {\n const tile = this.tileList[key];\n if (tile.current && !tile.active) {\n const [x, y, z] = key.split('_').map((v) => Number(v));\n\n if (!this.retainParent(x, y, z, z - 5)) {\n this.retainChildren(x, y, z, z + 2);\n }\n }\n });\n\n this.removeOutTiles();\n }\n\n public requestTile(key: string) {\n const t = this.tileList[key];\n if (!t) {\n return;\n }\n let tile = this.tileCache.getTile(key);\n if (!tile) {\n const container = createLayerContainer(\n this.layer.sceneContainer as Container,\n );\n tile = new ImageTile(\n key,\n this.url,\n container,\n this.layer.sceneContainer as Container,\n );\n tile.name = key;\n\n t.current = true;\n t.retain = true;\n t.active = true;\n\n // 往 imageTileLayer 中添加子图层\n this.layer.layerChildren.push(tile.imageLayer);\n\n this.tileCache.setTile(tile, key);\n\n this.pruneTiles();\n this.layerService.renderLayers();\n } else {\n // Tip: show 方法就是将相应的瓦片图片添加到渲染队列\n tile.imageLayer.show();\n t.current = true;\n t.retain = true;\n t.active = true;\n\n this.pruneTiles();\n }\n }\n\n public retainParent(x: number, y: number, z: number, minZoom: number): any {\n const x2 = Math.floor(x / 2);\n const y2 = Math.floor(y / 2);\n const z2 = z - 1;\n const tile = this.tileList[[x2, y2, z2].join('_')];\n if (tile && tile.active) {\n tile.retain = true;\n return true;\n } else if (tile && tile.loaded) {\n tile.retain = true;\n }\n if (z2 > minZoom) {\n return this.retainParent(x2, y2, z2, minZoom);\n }\n return false;\n }\n\n public retainChildren(x: number, y: number, z: number, maxZoom: number) {\n for (let i = 2 * x; i < 2 * x + 2; i++) {\n for (let j = 2 * y; j < 2 * y + 2; j++) {\n const key = [i, j, z + 1].join('_');\n const tile = this.tileList[key];\n if (tile && tile.active) {\n tile.retain = true;\n continue;\n } else if (tile && tile.loaded) {\n tile.retain = true;\n }\n\n if (z + 1 < maxZoom) {\n this.retainChildren(i, j, z + 1, maxZoom);\n }\n }\n }\n }\n\n public destroyTile(tile: any) {\n const layerIndex = this.layer.layerChildren.indexOf(tile.imageLayer);\n if (layerIndex > -1) {\n this.layer.layerChildren.splice(layerIndex, 1);\n }\n\n tile.imageLayer.emit('remove', null);\n tile.imageLayer.destroy();\n this.layerService.renderLayers();\n\n // 清除 tileCache 中的存储 相当于 tileCache.setTile(tile, null)\n tile = null;\n }\n\n public removeOutTiles() {\n for (const key in this.tileList) {\n if (!this.tileList[key].retain) {\n // Tip: 不需要显示的瓦片对象\n const tile = this.tileCache.getTile(key);\n // Tip: 若是网格对象存在\n if (tile) {\n // Tip: hide 方法就是将相应的瓦片图片从渲染队列中剔除\n tile.imageLayer.hide();\n }\n delete this.tileList[key];\n }\n }\n }\n\n public removeTiles() {\n this.layer.layerChildren.forEach((layer: any) => {\n layer.emit('remove', null);\n layer.destroy();\n });\n\n this.layer.layerChildren = [];\n this.layerService.renderLayers();\n this.tileList = {};\n this.tileCache.destory();\n }\n}\n"],"file":"Tile.js"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LRU Cache class with limit
|
|
3
|
+
*
|
|
4
|
+
* Update order for each get/set operation
|
|
5
|
+
* Delete oldest when reach given limit
|
|
6
|
+
*/
|
|
7
|
+
export default class LRUCache {
|
|
8
|
+
limit: number;
|
|
9
|
+
order: any[];
|
|
10
|
+
cache: any;
|
|
11
|
+
destroy: any;
|
|
12
|
+
constructor(limit?: number, destroy?: () => string);
|
|
13
|
+
clear(): void;
|
|
14
|
+
get(key: string): any;
|
|
15
|
+
set(key: string, value: any): void;
|
|
16
|
+
delete(key: string): void;
|
|
17
|
+
deleteCache(key: string): void;
|
|
18
|
+
deleteOrder(key: string): void;
|
|
19
|
+
appendOrder(key: string): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
|
|
5
|
+
var LRUCache = function () {
|
|
6
|
+
function LRUCache() {
|
|
7
|
+
var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50;
|
|
8
|
+
var destroy = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
|
|
9
|
+
return '';
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
_classCallCheck(this, LRUCache);
|
|
13
|
+
|
|
14
|
+
_defineProperty(this, "limit", void 0);
|
|
15
|
+
|
|
16
|
+
_defineProperty(this, "order", void 0);
|
|
17
|
+
|
|
18
|
+
_defineProperty(this, "cache", void 0);
|
|
19
|
+
|
|
20
|
+
_defineProperty(this, "destroy", void 0);
|
|
21
|
+
|
|
22
|
+
this.limit = limit;
|
|
23
|
+
this.destroy = destroy;
|
|
24
|
+
this.order = [];
|
|
25
|
+
this.clear();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
_createClass(LRUCache, [{
|
|
29
|
+
key: "clear",
|
|
30
|
+
value: function clear() {
|
|
31
|
+
var _this = this;
|
|
32
|
+
|
|
33
|
+
this.order.forEach(function (key) {
|
|
34
|
+
_this.delete(key);
|
|
35
|
+
});
|
|
36
|
+
this.cache = {};
|
|
37
|
+
this.order = [];
|
|
38
|
+
}
|
|
39
|
+
}, {
|
|
40
|
+
key: "get",
|
|
41
|
+
value: function get(key) {
|
|
42
|
+
var value = this.cache[key];
|
|
43
|
+
|
|
44
|
+
if (value) {
|
|
45
|
+
this.deleteOrder(key);
|
|
46
|
+
this.appendOrder(key);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
}, {
|
|
52
|
+
key: "set",
|
|
53
|
+
value: function set(key, value) {
|
|
54
|
+
if (!this.cache[key]) {
|
|
55
|
+
if (Object.keys(this.cache).length === this.limit) {
|
|
56
|
+
this.delete(this.order[0]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.cache[key] = value;
|
|
60
|
+
this.appendOrder(key);
|
|
61
|
+
} else {
|
|
62
|
+
this.delete(key);
|
|
63
|
+
this.cache[key] = value;
|
|
64
|
+
this.appendOrder(key);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}, {
|
|
68
|
+
key: "delete",
|
|
69
|
+
value: function _delete(key) {
|
|
70
|
+
var value = this.cache[key];
|
|
71
|
+
|
|
72
|
+
if (value) {
|
|
73
|
+
this.deleteCache(key);
|
|
74
|
+
this.deleteOrder(key);
|
|
75
|
+
this.destroy(value, key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}, {
|
|
79
|
+
key: "deleteCache",
|
|
80
|
+
value: function deleteCache(key) {
|
|
81
|
+
delete this.cache[key];
|
|
82
|
+
}
|
|
83
|
+
}, {
|
|
84
|
+
key: "deleteOrder",
|
|
85
|
+
value: function deleteOrder(key) {
|
|
86
|
+
var index = this.order.findIndex(function (o) {
|
|
87
|
+
return o === key;
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
if (index >= 0) {
|
|
91
|
+
this.order.splice(index, 1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}, {
|
|
95
|
+
key: "appendOrder",
|
|
96
|
+
value: function appendOrder(key) {
|
|
97
|
+
this.order.push(key);
|
|
98
|
+
}
|
|
99
|
+
}]);
|
|
100
|
+
|
|
101
|
+
return LRUCache;
|
|
102
|
+
}();
|
|
103
|
+
|
|
104
|
+
export { LRUCache as default };
|
|
105
|
+
//# sourceMappingURL=lruCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/imagetile/utils/lruCache.ts"],"names":["LRUCache","limit","destroy","order","clear","forEach","key","delete","cache","value","deleteOrder","appendOrder","Object","keys","length","deleteCache","index","findIndex","o","splice","push"],"mappings":";;;;IAOqBA,Q;AAKnB,sBAA4C;AAAA,QAAhCC,KAAgC,uEAAxB,EAAwB;AAAA,QAApBC,OAAoB,uEAAV;AAAA,aAAM,EAAN;AAAA,KAAU;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAC1C,SAAKD,KAAL,GAAaA,KAAb;AACA,SAAKC,OAAL,GAAeA,OAAf;AACA,SAAKC,KAAL,GAAa,EAAb;AACA,SAAKC,KAAL;AACD;;;;WAED,iBAAe;AAAA;;AACb,WAAKD,KAAL,CAAWE,OAAX,CAAmB,UAACC,GAAD,EAAc;AAC/B,QAAA,KAAI,CAACC,MAAL,CAAYD,GAAZ;AACD,OAFD;AAGA,WAAKE,KAAL,GAAa,EAAb;AAEA,WAAKL,KAAL,GAAa,EAAb;AACD;;;WAED,aAAWG,GAAX,EAAwB;AACtB,UAAMG,KAAK,GAAG,KAAKD,KAAL,CAAWF,GAAX,CAAd;;AACA,UAAIG,KAAJ,EAAW;AAET,aAAKC,WAAL,CAAiBJ,GAAjB;AACA,aAAKK,WAAL,CAAiBL,GAAjB;AACD;;AACD,aAAOG,KAAP;AACD;;;WAED,aAAWH,GAAX,EAAwBG,KAAxB,EAAoC;AAClC,UAAI,CAAC,KAAKD,KAAL,CAAWF,GAAX,CAAL,EAAsB;AAEpB,YAAIM,MAAM,CAACC,IAAP,CAAY,KAAKL,KAAjB,EAAwBM,MAAxB,KAAmC,KAAKb,KAA5C,EAAmD;AACjD,eAAKM,MAAL,CAAY,KAAKJ,KAAL,CAAW,CAAX,CAAZ;AACD;;AAED,aAAKK,KAAL,CAAWF,GAAX,IAAkBG,KAAlB;AACA,aAAKE,WAAL,CAAiBL,GAAjB;AACD,OARD,MAQO;AAEL,aAAKC,MAAL,CAAYD,GAAZ;AAEA,aAAKE,KAAL,CAAWF,GAAX,IAAkBG,KAAlB;AACA,aAAKE,WAAL,CAAiBL,GAAjB;AACD;AACF;;;WAED,iBAAcA,GAAd,EAA2B;AACzB,UAAMG,KAAK,GAAG,KAAKD,KAAL,CAAWF,GAAX,CAAd;;AACA,UAAIG,KAAJ,EAAW;AACT,aAAKM,WAAL,CAAiBT,GAAjB;AACA,aAAKI,WAAL,CAAiBJ,GAAjB;AACA,aAAKJ,OAAL,CAAaO,KAAb,EAAoBH,GAApB;AACD;AACF;;;WAED,qBAAmBA,GAAnB,EAAgC;AAC9B,aAAO,KAAKE,KAAL,CAAWF,GAAX,CAAP;AACD;;;WAED,qBAAmBA,GAAnB,EAAgC;AAC9B,UAAMU,KAAK,GAAG,KAAKb,KAAL,CAAWc,SAAX,CAAqB,UAACC,CAAD;AAAA,eAAOA,CAAC,KAAKZ,GAAb;AAAA,OAArB,CAAd;;AACA,UAAIU,KAAK,IAAI,CAAb,EAAgB;AACd,aAAKb,KAAL,CAAWgB,MAAX,CAAkBH,KAAlB,EAAyB,CAAzB;AACD;AACF;;;WAED,qBAAmBV,GAAnB,EAAgC;AAC9B,WAAKH,KAAL,CAAWiB,IAAX,CAAgBd,GAAhB;AACD;;;;;;SAvEkBN,Q","sourcesContent":["/**\n * LRU Cache class with limit\n *\n * Update order for each get/set operation\n * Delete oldest when reach given limit\n */\n\nexport default class LRUCache {\n public limit: number;\n public order: any[];\n public cache: any;\n public destroy: any;\n constructor(limit = 50, destroy = () => '') {\n this.limit = limit;\n this.destroy = destroy;\n this.order = [];\n this.clear();\n }\n\n public clear() {\n this.order.forEach((key: any) => {\n this.delete(key);\n });\n this.cache = {};\n // access/update order, first item is oldest, last item is newest\n this.order = [];\n }\n\n public get(key: string) {\n const value = this.cache[key];\n if (value) {\n // update order\n this.deleteOrder(key);\n this.appendOrder(key);\n }\n return value;\n }\n\n public set(key: string, value: any) {\n if (!this.cache[key]) {\n // if reach limit, delete the oldest\n if (Object.keys(this.cache).length === this.limit) {\n this.delete(this.order[0]);\n }\n\n this.cache[key] = value;\n this.appendOrder(key);\n } else {\n // if found in cache, delete the old one, insert new one to the first of list\n this.delete(key);\n\n this.cache[key] = value;\n this.appendOrder(key);\n }\n }\n\n public delete(key: string) {\n const value = this.cache[key];\n if (value) {\n this.deleteCache(key);\n this.deleteOrder(key);\n this.destroy(value, key);\n }\n }\n\n public deleteCache(key: string) {\n delete this.cache[key];\n }\n\n public deleteOrder(key: string) {\n const index = this.order.findIndex((o) => o === key);\n if (index >= 0) {\n this.order.splice(index, 1);\n }\n }\n\n public appendOrder(key: string) {\n this.order.push(key);\n }\n}\n"],"file":"lruCache.js"}
|