@basemaps/lambda-tiler 6.36.0 → 6.37.0
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/CHANGELOG.md +18 -0
- package/build/__tests__/config.data.js +1 -1
- package/build/__tests__/config.data.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/routes/__tests__/fonts.test.js +1 -1
- package/build/routes/__tests__/fonts.test.js.map +1 -1
- package/build/routes/__tests__/memory.fs.d.ts +1 -13
- package/build/routes/__tests__/memory.fs.d.ts.map +1 -1
- package/build/routes/__tests__/memory.fs.js +0 -59
- package/build/routes/__tests__/memory.fs.js.map +1 -1
- package/build/routes/__tests__/sprites.test.js +1 -1
- package/build/routes/__tests__/sprites.test.js.map +1 -1
- package/build/routes/__tests__/tile.json.test.js +1 -1
- package/build/routes/__tests__/tile.json.test.js.map +1 -1
- package/build/routes/tile.xyz.raster.d.ts +4 -1
- package/build/routes/tile.xyz.raster.d.ts.map +1 -1
- package/build/routes/tile.xyz.raster.js +19 -8
- package/build/routes/tile.xyz.raster.js.map +1 -1
- package/build/util/__test__/config.loader.test.js +1 -1
- package/build/util/__test__/config.loader.test.js.map +1 -1
- package/build/util/config.loader.js +1 -1
- package/build/util/config.loader.js.map +1 -1
- package/build/util/source.cache.d.ts +1 -1
- package/build/util/source.cache.d.ts.map +1 -1
- package/build/util/validate.d.ts +1 -1
- package/build/util/validate.d.ts.map +1 -1
- package/build/wmts.capability.d.ts +2 -0
- package/build/wmts.capability.d.ts.map +1 -1
- package/build/wmts.capability.js +3 -1
- package/build/wmts.capability.js.map +1 -1
- package/dist/index.js +66 -64
- package/dist/node_modules/.package-lock.json +4 -4
- package/dist/node_modules/node-abi/abi_registry.json +8 -1
- package/dist/node_modules/node-abi/package.json +1 -1
- package/dist/package-lock.json +8 -8
- package/dist/package.json +1 -1
- package/package.json +11 -11
- package/src/__tests__/config.data.ts +1 -1
- package/src/routes/__tests__/fonts.test.ts +1 -1
- package/src/routes/__tests__/memory.fs.ts +0 -62
- package/src/routes/__tests__/sprites.test.ts +1 -1
- package/src/routes/__tests__/tile.json.test.ts +1 -1
- package/src/routes/tile.xyz.raster.ts +25 -10
- package/src/util/__test__/config.loader.test.ts +1 -1
- package/src/util/config.loader.ts +1 -1
- package/src/wmts.capability.ts +4 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basemaps/lambda-tiler",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.37.0",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
@@ -229,9 +229,9 @@
|
|
|
229
229
|
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
|
|
230
230
|
},
|
|
231
231
|
"node_modules/node-abi": {
|
|
232
|
-
"version": "3.
|
|
233
|
-
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.
|
|
234
|
-
"integrity": "sha512-
|
|
232
|
+
"version": "3.30.0",
|
|
233
|
+
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz",
|
|
234
|
+
"integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==",
|
|
235
235
|
"dependencies": {
|
|
236
236
|
"semver": "^7.3.5"
|
|
237
237
|
},
|
|
@@ -67,6 +67,13 @@
|
|
|
67
67
|
"future": false,
|
|
68
68
|
"abi": "108"
|
|
69
69
|
},
|
|
70
|
+
{
|
|
71
|
+
"runtime": "node",
|
|
72
|
+
"target": "19.0.0",
|
|
73
|
+
"lts": false,
|
|
74
|
+
"future": false,
|
|
75
|
+
"abi": "111"
|
|
76
|
+
},
|
|
70
77
|
{
|
|
71
78
|
"abi": "70",
|
|
72
79
|
"future": false,
|
|
@@ -216,7 +223,7 @@
|
|
|
216
223
|
},
|
|
217
224
|
{
|
|
218
225
|
"abi": "110",
|
|
219
|
-
"future":
|
|
226
|
+
"future": false,
|
|
220
227
|
"lts": false,
|
|
221
228
|
"runtime": "electron",
|
|
222
229
|
"target": "22.0.0-alpha.1"
|
package/dist/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basemaps/lambda-tiler",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.37.0",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@basemaps/lambda-tiler",
|
|
9
|
-
"version": "6.
|
|
9
|
+
"version": "6.37.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"sharp": "0.30.7"
|
|
@@ -240,9 +240,9 @@
|
|
|
240
240
|
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
|
|
241
241
|
},
|
|
242
242
|
"node_modules/node-abi": {
|
|
243
|
-
"version": "3.
|
|
244
|
-
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.
|
|
245
|
-
"integrity": "sha512-
|
|
243
|
+
"version": "3.30.0",
|
|
244
|
+
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz",
|
|
245
|
+
"integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==",
|
|
246
246
|
"dependencies": {
|
|
247
247
|
"semver": "^7.3.5"
|
|
248
248
|
},
|
|
@@ -650,9 +650,9 @@
|
|
|
650
650
|
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
|
|
651
651
|
},
|
|
652
652
|
"node-abi": {
|
|
653
|
-
"version": "3.
|
|
654
|
-
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.
|
|
655
|
-
"integrity": "sha512-
|
|
653
|
+
"version": "3.30.0",
|
|
654
|
+
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz",
|
|
655
|
+
"integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==",
|
|
656
656
|
"requires": {
|
|
657
657
|
"semver": "^7.3.5"
|
|
658
658
|
}
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basemaps/lambda-tiler",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.37.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/linz/basemaps.git",
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
"types": "./build/index.d.ts",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@basemaps/config": "^6.
|
|
26
|
-
"@basemaps/geo": "^6.
|
|
27
|
-
"@basemaps/shared": "^6.
|
|
28
|
-
"@basemaps/tiler": "^6.
|
|
29
|
-
"@basemaps/tiler-sharp": "^6.
|
|
30
|
-
"@chunkd/fs": "^
|
|
31
|
-
"@cogeotiff/core": "^7.
|
|
25
|
+
"@basemaps/config": "^6.37.0",
|
|
26
|
+
"@basemaps/geo": "^6.37.0",
|
|
27
|
+
"@basemaps/shared": "^6.37.0",
|
|
28
|
+
"@basemaps/tiler": "^6.37.0",
|
|
29
|
+
"@basemaps/tiler-sharp": "^6.37.0",
|
|
30
|
+
"@chunkd/fs": "^10.0.2",
|
|
31
|
+
"@cogeotiff/core": "^7.2.0",
|
|
32
32
|
"@cotar/core": "^5.4.0",
|
|
33
33
|
"@linzjs/geojson": "^6.32.1",
|
|
34
34
|
"@linzjs/lambda": "^4.0.0",
|
|
@@ -51,12 +51,12 @@
|
|
|
51
51
|
"bundle": "./bundle.sh"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@basemaps/attribution": "^6.
|
|
54
|
+
"@basemaps/attribution": "^6.37.0",
|
|
55
|
+
"@chunkd/source-memory": "^10.0.0",
|
|
55
56
|
"@types/aws-lambda": "^8.10.75",
|
|
56
|
-
"@types/node": "^17.0.34",
|
|
57
57
|
"@types/pixelmatch": "^5.0.0",
|
|
58
58
|
"@types/sharp": "^0.30.3",
|
|
59
59
|
"pretty-json-log": "^1.0.0"
|
|
60
60
|
},
|
|
61
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "98c97100161b159272c1826c4e668b3e805ec214"
|
|
62
62
|
}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from '@basemaps/config';
|
|
11
11
|
import { ImageFormat, VectorFormat } from '@basemaps/geo';
|
|
12
12
|
import { fsa } from '@basemaps/shared';
|
|
13
|
-
import { FsMemory } from '
|
|
13
|
+
import { FsMemory } from '@chunkd/source-memory';
|
|
14
14
|
|
|
15
15
|
export const TileSetAerial: ConfigTileSetRaster = {
|
|
16
16
|
id: 'ts_aerial',
|
|
@@ -9,7 +9,7 @@ import { ConfigLoader } from '../../util/config.loader.js';
|
|
|
9
9
|
import { CoSources } from '../../util/source.cache.js';
|
|
10
10
|
import { Api, mockRequest, mockUrlRequest } from '../../__tests__/xyz.util.js';
|
|
11
11
|
import { fontList } from '../fonts.js';
|
|
12
|
-
import { FsMemory } from '
|
|
12
|
+
import { FsMemory } from '@chunkd/source-memory';
|
|
13
13
|
|
|
14
14
|
o.spec('/v1/fonts', () => {
|
|
15
15
|
const memory = new FsMemory();
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ChunkSource, CompositeError, FileInfo, FileSystem } from '@chunkd/core';
|
|
2
1
|
import { Readable } from 'stream';
|
|
3
2
|
|
|
4
3
|
export async function toBuffer(stream: Readable): Promise<Buffer> {
|
|
@@ -14,64 +13,3 @@ export function toReadable(r: string | Buffer | Readable): Readable {
|
|
|
14
13
|
if (typeof r === 'string') r = Buffer.from(r);
|
|
15
14
|
return Readable.from(r);
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
// TODO this should be provided by @chunkd/fs as it already provides a memory source
|
|
19
|
-
export class FsMemory implements FileSystem {
|
|
20
|
-
protocol = 'memory';
|
|
21
|
-
|
|
22
|
-
files: Map<string, Buffer> = new Map();
|
|
23
|
-
|
|
24
|
-
async read(filePath: string): Promise<Buffer> {
|
|
25
|
-
const data = this.files.get(filePath);
|
|
26
|
-
if (data == null) throw new CompositeError('Not found', 404, new Error());
|
|
27
|
-
return data;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
stream(filePath: string): Readable {
|
|
31
|
-
const buf = this.files.get(filePath);
|
|
32
|
-
if (buf == null) throw new CompositeError('Not found', 404, new Error());
|
|
33
|
-
return toReadable(buf);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async write(filePath: string, buffer: string | Buffer | Readable): Promise<void> {
|
|
37
|
-
if (typeof buffer === 'string') {
|
|
38
|
-
this.files.set(filePath, Buffer.from(buffer));
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (Buffer.isBuffer(buffer)) {
|
|
42
|
-
this.files.set(filePath, buffer);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const buf = await toBuffer(buffer);
|
|
46
|
-
this.files.set(filePath, buf);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async *list(filePath: string): AsyncGenerator<string> {
|
|
50
|
-
for (const file of this.files.keys()) {
|
|
51
|
-
if (file.startsWith(filePath)) yield file;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async *details(filePath: string): AsyncGenerator<FileInfo> {
|
|
56
|
-
for await (const file of this.list(filePath)) {
|
|
57
|
-
const data = await this.head(file);
|
|
58
|
-
if (data == null) continue;
|
|
59
|
-
yield data;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async exists(filePath: string): Promise<boolean> {
|
|
64
|
-
const dat = await this.head(filePath);
|
|
65
|
-
return dat != null;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async head(filePath: string): Promise<FileInfo | null> {
|
|
69
|
-
const buf = this.files.get(filePath);
|
|
70
|
-
if (buf == null) return null;
|
|
71
|
-
return { path: filePath, size: buf.length };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
source(): ChunkSource {
|
|
75
|
-
throw new Error('Method not implemented.');
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -6,7 +6,7 @@ import { gunzipSync, gzipSync } from 'zlib';
|
|
|
6
6
|
import { handler } from '../../index.js';
|
|
7
7
|
import { ConfigLoader } from '../../util/config.loader.js';
|
|
8
8
|
import { mockRequest } from '../../__tests__/xyz.util.js';
|
|
9
|
-
import { FsMemory } from '
|
|
9
|
+
import { FsMemory } from '@chunkd/source-memory';
|
|
10
10
|
|
|
11
11
|
o.spec('/v1/sprites', () => {
|
|
12
12
|
const memory = new FsMemory();
|
|
@@ -8,7 +8,7 @@ import { ConfigLoader } from '../../util/config.loader.js';
|
|
|
8
8
|
import { CoSources } from '../../util/source.cache.js';
|
|
9
9
|
import { FakeData } from '../../__tests__/config.data.js';
|
|
10
10
|
import { Api, mockRequest, mockUrlRequest } from '../../__tests__/xyz.util.js';
|
|
11
|
-
import { FsMemory } from '
|
|
11
|
+
import { FsMemory } from '@chunkd/source-memory';
|
|
12
12
|
|
|
13
13
|
o.spec('/v1/tiles/:tileSet/:tileMatrix/tile.json', () => {
|
|
14
14
|
const config = new ConfigProviderMemory();
|
|
@@ -4,6 +4,7 @@ import { Env, fsa } from '@basemaps/shared';
|
|
|
4
4
|
import { Tiler } from '@basemaps/tiler';
|
|
5
5
|
import { TileMakerSharp } from '@basemaps/tiler-sharp';
|
|
6
6
|
import { CogTiff } from '@cogeotiff/core';
|
|
7
|
+
import { Cotar } from '@cotar/core';
|
|
7
8
|
import { HttpHeader, LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
|
|
8
9
|
import pLimit from 'p-limit';
|
|
9
10
|
import { ConfigLoader } from '../util/config.loader.js';
|
|
@@ -20,13 +21,15 @@ export function getTiffName(name: string): string {
|
|
|
20
21
|
return `${name}.tiff`;
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
export type CloudArchive = CogTiff | Cotar;
|
|
25
|
+
|
|
23
26
|
export const TileComposer = new TileMakerSharp(256);
|
|
24
27
|
|
|
25
28
|
const DefaultResizeKernel = { in: 'lanczos3', out: 'lanczos3' } as const;
|
|
26
29
|
const DefaultBackground = { r: 0, g: 0, b: 0, alpha: 0 };
|
|
27
30
|
|
|
28
31
|
export const TileXyzRaster = {
|
|
29
|
-
async
|
|
32
|
+
async getAssetsForTile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<string[]> {
|
|
30
33
|
const config = await ConfigLoader.load(req);
|
|
31
34
|
const imagery = await getAllImagery(config, tileSet.layers, [xyz.tileMatrix.projection]);
|
|
32
35
|
|
|
@@ -55,6 +58,12 @@ export const TileXyzRaster = {
|
|
|
55
58
|
}
|
|
56
59
|
if (!tileBounds.intersects(Bounds.fromJson(img.bounds))) continue;
|
|
57
60
|
|
|
61
|
+
// FIXME is this meant to be >= <=
|
|
62
|
+
if (img.overviews && img.overviews.maxZoom >= filterZoom && img.overviews.minZoom <= filterZoom) {
|
|
63
|
+
output.push(fsa.join(img.uri, img.overviews.path));
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
58
67
|
for (const c of img.files) {
|
|
59
68
|
if (!tileBounds.intersects(Bounds.fromJson(c))) continue;
|
|
60
69
|
const tiffPath = fsa.join(img.uri, getTiffName(c.name));
|
|
@@ -67,26 +76,32 @@ export const TileXyzRaster = {
|
|
|
67
76
|
async tile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<LambdaHttpResponse> {
|
|
68
77
|
if (xyz.tileType === VectorFormat.MapboxVectorTiles) return NotFound();
|
|
69
78
|
|
|
70
|
-
const
|
|
71
|
-
const cacheKey = Etag.key(
|
|
79
|
+
const assetPaths = await this.getAssetsForTile(req, tileSet, xyz);
|
|
80
|
+
const cacheKey = Etag.key(assetPaths);
|
|
72
81
|
if (Etag.isNotModified(req, cacheKey)) return NotModified();
|
|
73
82
|
|
|
74
|
-
const toLoad: Promise<
|
|
75
|
-
for (const
|
|
83
|
+
const toLoad: Promise<CloudArchive | null>[] = [];
|
|
84
|
+
for (const assetPath of assetPaths) {
|
|
76
85
|
toLoad.push(
|
|
77
|
-
LoadingQueue(() => {
|
|
78
|
-
|
|
79
|
-
|
|
86
|
+
LoadingQueue((): Promise<CloudArchive | null> => {
|
|
87
|
+
if (assetPath.endsWith('.tar.co')) {
|
|
88
|
+
return CoSources.getCotar(assetPath).catch((error) => {
|
|
89
|
+
req.log.warn({ error, tiff: assetPath }, 'Load:Cotar:Failed');
|
|
90
|
+
return null;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return CoSources.getCog(assetPath).catch((error) => {
|
|
94
|
+
req.log.warn({ error, tiff: assetPath }, 'Load:Tiff:Failed');
|
|
80
95
|
return null;
|
|
81
96
|
});
|
|
82
97
|
}),
|
|
83
98
|
);
|
|
84
99
|
}
|
|
85
100
|
|
|
86
|
-
const
|
|
101
|
+
const assets = (await Promise.all(toLoad)).filter((f) => f != null) as CloudArchive[];
|
|
87
102
|
|
|
88
103
|
const tiler = new Tiler(xyz.tileMatrix);
|
|
89
|
-
const layers = await tiler.tile(
|
|
104
|
+
const layers = await tiler.tile(assets, xyz.tile.x, xyz.tile.y, xyz.tile.z);
|
|
90
105
|
|
|
91
106
|
const res = await TileComposer.compose({
|
|
92
107
|
layers,
|
|
@@ -3,7 +3,7 @@ import { fsa } from '@basemaps/shared';
|
|
|
3
3
|
import { LambdaHttpResponse } from '@linzjs/lambda';
|
|
4
4
|
import o from 'ospec';
|
|
5
5
|
import { createSandbox } from 'sinon';
|
|
6
|
-
import { FsMemory } from '
|
|
6
|
+
import { FsMemory } from '@chunkd/source-memory';
|
|
7
7
|
import { FakeData } from '../../__tests__/config.data.js';
|
|
8
8
|
import { Api, mockRequest, mockUrlRequest } from '../../__tests__/xyz.util.js';
|
|
9
9
|
import { CachedConfig } from '../config.cache.js';
|
|
@@ -6,7 +6,7 @@ import { CachedConfig } from './config.cache.js';
|
|
|
6
6
|
import { getDefaultConfig } from '@basemaps/shared';
|
|
7
7
|
|
|
8
8
|
// FIXME load this from process.env COG BUCKETS?
|
|
9
|
-
const SafeBuckets = new Set(['linz-workflow-artifacts', 'linz-basemaps']);
|
|
9
|
+
const SafeBuckets = new Set(['linz-workflow-artifacts', 'linz-basemaps', 'linz-basemaps-staging']);
|
|
10
10
|
const SafeProtocols = new Set(['s3', 'memory']);
|
|
11
11
|
|
|
12
12
|
export class ConfigLoader {
|
package/src/wmts.capability.ts
CHANGED
|
@@ -64,6 +64,9 @@ export class WmtsCapabilities {
|
|
|
64
64
|
formats: ImageFormat[];
|
|
65
65
|
isIndividualLayers = false;
|
|
66
66
|
|
|
67
|
+
minZoom = 0;
|
|
68
|
+
maxZoom = 32;
|
|
69
|
+
|
|
67
70
|
constructor(params: WmtsCapabilitiesParams) {
|
|
68
71
|
this.httpBase = params.httpBase;
|
|
69
72
|
this.provider = params.provider;
|
|
@@ -267,7 +270,7 @@ export class WmtsCapabilities {
|
|
|
267
270
|
V('ows:Identifier', tms.identifier),
|
|
268
271
|
V('ows:SupportedCRS', tms.projection.toUrn()),
|
|
269
272
|
tms.def.wellKnownScaleSet ? V('WellKnownScaleSet', tms.def.wellKnownScaleSet) : null,
|
|
270
|
-
...tms.def.tileMatrix.map((c) => {
|
|
273
|
+
...tms.def.tileMatrix.slice(this.minZoom, this.maxZoom).map((c) => {
|
|
271
274
|
return V('TileMatrix', [
|
|
272
275
|
V('ows:Identifier', c.identifier),
|
|
273
276
|
V('ScaleDenominator', c.scaleDenominator),
|