@basemaps/lambda-tiler 7.11.0 → 7.12.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 +17 -0
- package/build/index.js +9 -4
- package/build/index.js.map +1 -1
- package/build/routes/__tests__/link.test.d.ts +1 -0
- package/build/routes/__tests__/link.test.js +82 -0
- package/build/routes/__tests__/link.test.js.map +1 -0
- package/build/routes/__tests__/tile.style.json.attribution.test.d.ts +1 -0
- package/build/routes/__tests__/tile.style.json.attribution.test.js +172 -0
- package/build/routes/__tests__/tile.style.json.attribution.test.js.map +1 -0
- package/build/routes/attribution.d.ts +19 -1
- package/build/routes/attribution.js +38 -3
- package/build/routes/attribution.js.map +1 -1
- package/build/routes/link.d.ts +17 -0
- package/build/routes/link.js +42 -0
- package/build/routes/link.js.map +1 -0
- package/build/routes/tile.style.json.d.ts +2 -2
- package/build/routes/tile.style.json.js +12 -4
- package/build/routes/tile.style.json.js.map +1 -1
- package/package.json +9 -9
- package/src/index.ts +10 -4
- package/src/routes/__tests__/link.test.ts +114 -0
- package/src/routes/__tests__/tile.style.json.attribution.test.ts +224 -0
- package/src/routes/attribution.ts +50 -5
- package/src/routes/link.ts +55 -0
- package/src/routes/tile.style.json.ts +15 -4
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -9,6 +9,7 @@ import { Etag } from '../util/etag.js';
|
|
|
9
9
|
import { convertStyleToNztmStyle } from '../util/nztm.style.js';
|
|
10
10
|
import { NotFound, NotModified } from '../util/response.js';
|
|
11
11
|
import { Validate } from '../util/validate.js';
|
|
12
|
+
import { createTileSetAttribution } from './attribution.js';
|
|
12
13
|
/**
|
|
13
14
|
* Convert relative URL into a full hostname URL, converting {tileMatrix} into the provided tileMatrix
|
|
14
15
|
*
|
|
@@ -128,7 +129,7 @@ async function ensureTerrain(req, tileMatrix, apiKey, style) {
|
|
|
128
129
|
* Generate a StyleJSON from a tileset
|
|
129
130
|
* @returns
|
|
130
131
|
*/
|
|
131
|
-
export function tileSetToStyle(req, tileSet, tileMatrix, apiKey) {
|
|
132
|
+
export async function tileSetToStyle(req, config, tileSet, tileMatrix, apiKey) {
|
|
132
133
|
// If the style has outputs defined it has a different process for generating the stylejson
|
|
133
134
|
if (tileSet.outputs)
|
|
134
135
|
return tileSetOutputToStyle(req, tileSet, tileMatrix, apiKey);
|
|
@@ -141,12 +142,20 @@ export function tileSetToStyle(req, tileSet, tileMatrix, apiKey) {
|
|
|
141
142
|
const query = toQueryString({ config: configLocation, api: apiKey, pipeline: pipelineName });
|
|
142
143
|
const tileUrl = (Env.get(Env.PublicUrlBase) ?? '') +
|
|
143
144
|
`/v1/tiles/${tileSet.name}/${tileMatrix.identifier}/{z}/{x}/{y}.${tileFormat}${query}`;
|
|
145
|
+
const attribution = await createTileSetAttribution(config, tileSet, tileMatrix.projection);
|
|
144
146
|
const styleId = `basemaps-${tileSet.name}`;
|
|
145
147
|
return {
|
|
146
148
|
id: ConfigId.prefix(ConfigPrefix.Style, tileSet.name),
|
|
147
149
|
name: tileSet.name,
|
|
148
150
|
version: 8,
|
|
149
|
-
sources: {
|
|
151
|
+
sources: {
|
|
152
|
+
[styleId]: {
|
|
153
|
+
type: 'raster',
|
|
154
|
+
tiles: [tileUrl],
|
|
155
|
+
tileSize: 256,
|
|
156
|
+
attribution,
|
|
157
|
+
},
|
|
158
|
+
},
|
|
150
159
|
layers: [{ id: styleId, type: 'raster', source: styleId }],
|
|
151
160
|
};
|
|
152
161
|
}
|
|
@@ -199,8 +208,7 @@ async function generateStyleFromTileSet(req, config, tileSetName, tileMatrix, ap
|
|
|
199
208
|
}
|
|
200
209
|
if (tileSet.outputs)
|
|
201
210
|
return tileSetOutputToStyle(req, tileSet, tileMatrix, apiKey);
|
|
202
|
-
|
|
203
|
-
return tileSetToStyle(req, tileSet, tileMatrix, apiKey);
|
|
211
|
+
return tileSetToStyle(req, config, tileSet, tileMatrix, apiKey);
|
|
204
212
|
}
|
|
205
213
|
export async function styleJsonGet(req) {
|
|
206
214
|
const apiKey = Validate.apiKey(req);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile.style.json.js","sourceRoot":"","sources":["../../src/routes/tile.style.json.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tile.style.json.js","sourceRoot":"","sources":["../../src/routes/tile.style.json.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basemaps/lambda-tiler",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.12.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/linz/basemaps.git",
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
"types": "./build/index.d.ts",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@basemaps/config": "^7.
|
|
26
|
-
"@basemaps/config-loader": "^7.
|
|
27
|
-
"@basemaps/geo": "^7.
|
|
28
|
-
"@basemaps/shared": "^7.
|
|
29
|
-
"@basemaps/tiler": "^7.
|
|
30
|
-
"@basemaps/tiler-sharp": "^7.
|
|
25
|
+
"@basemaps/config": "^7.12.0",
|
|
26
|
+
"@basemaps/config-loader": "^7.12.0",
|
|
27
|
+
"@basemaps/geo": "^7.12.0",
|
|
28
|
+
"@basemaps/shared": "^7.12.0",
|
|
29
|
+
"@basemaps/tiler": "^7.12.0",
|
|
30
|
+
"@basemaps/tiler-sharp": "^7.12.0",
|
|
31
31
|
"@linzjs/geojson": "^7.10.0",
|
|
32
32
|
"@linzjs/lambda": "^4.0.0",
|
|
33
33
|
"@mapbox/vector-tile": "^2.0.3",
|
|
@@ -50,11 +50,11 @@
|
|
|
50
50
|
"bundle": "./bundle.sh"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@basemaps/attribution": "^7.
|
|
53
|
+
"@basemaps/attribution": "^7.12.0",
|
|
54
54
|
"@chunkd/fs": "^11.2.0",
|
|
55
55
|
"@types/aws-lambda": "^8.10.75",
|
|
56
56
|
"@types/pixelmatch": "^5.0.0",
|
|
57
57
|
"pretty-json-log": "^1.0.0"
|
|
58
58
|
},
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "ae07a9588aa620801b6d1578c4e32f884882b53a"
|
|
60
60
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FsaCache, FsaLog, LogConfig } from '@basemaps/shared';
|
|
1
|
+
import { FsaCache, FsaLog, LogConfig, LogStorage } from '@basemaps/shared';
|
|
2
2
|
import { LambdaHttpRequest, LambdaHttpResponse, lf } from '@linzjs/lambda';
|
|
3
3
|
|
|
4
4
|
import { tileAttributionGet } from './routes/attribution.js';
|
|
@@ -6,6 +6,7 @@ import { configImageryGet, configTileSetGet } from './routes/config.js';
|
|
|
6
6
|
import { fontGet, fontList } from './routes/fonts.js';
|
|
7
7
|
import { healthGet } from './routes/health.js';
|
|
8
8
|
import { imageryGet } from './routes/imagery.js';
|
|
9
|
+
import { linkGet } from './routes/link.js';
|
|
9
10
|
import { pingGet } from './routes/ping.js';
|
|
10
11
|
import { previewIndexGet } from './routes/preview.index.js';
|
|
11
12
|
import { tilePreviewGet } from './routes/preview.js';
|
|
@@ -33,13 +34,14 @@ function randomTrace(req: LambdaHttpRequest): void {
|
|
|
33
34
|
const rand = Math.random();
|
|
34
35
|
// 1% trace
|
|
35
36
|
if (rand < 0.01) req.log.level = 'trace';
|
|
36
|
-
//
|
|
37
|
-
else if (rand < 0.
|
|
37
|
+
// 25% debug
|
|
38
|
+
else if (rand < 0.25) req.log.level = 'debug';
|
|
38
39
|
// everything else info
|
|
39
40
|
else req.log.level = 'info';
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
handler.router.hook('request', (req) => {
|
|
44
|
+
LogStorage.enterWith({ log: req.log });
|
|
43
45
|
FsaLog.reset();
|
|
44
46
|
|
|
45
47
|
randomTrace(req);
|
|
@@ -48,7 +50,8 @@ handler.router.hook('request', (req) => {
|
|
|
48
50
|
});
|
|
49
51
|
|
|
50
52
|
handler.router.hook('response', (req, res) => {
|
|
51
|
-
req.set('
|
|
53
|
+
req.set('fetchCount', FsaLog.count);
|
|
54
|
+
req.set('fetches', FsaLog.requests);
|
|
52
55
|
req.set('cacheSize', FsaCache.size);
|
|
53
56
|
// Force access-control-allow-origin to everything
|
|
54
57
|
res.header('access-control-allow-origin', '*');
|
|
@@ -102,6 +105,9 @@ handler.router.get('/v1/preview/:tileSet/:tileMatrix/:z/:lon/:lat/:outputType',
|
|
|
102
105
|
handler.router.get('/v1/@:location', previewIndexGet);
|
|
103
106
|
handler.router.get('/@:location', previewIndexGet);
|
|
104
107
|
|
|
108
|
+
// Link
|
|
109
|
+
handler.router.get('/v1/link/:tileSet', linkGet);
|
|
110
|
+
|
|
105
111
|
// Attribution
|
|
106
112
|
handler.router.get('/v1/tiles/:tileSet/:tileMatrix/attribution.json', tileAttributionGet);
|
|
107
113
|
handler.router.get('/v1/attribution/:tileSet/:tileMatrix/summary.json', tileAttributionGet);
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { strictEqual } from 'node:assert';
|
|
2
|
+
import { afterEach, describe, it } from 'node:test';
|
|
3
|
+
|
|
4
|
+
import { ConfigProviderMemory } from '@basemaps/config';
|
|
5
|
+
import { Epsg } from '@basemaps/geo';
|
|
6
|
+
|
|
7
|
+
import { FakeData, Imagery3857 } from '../../__tests__/config.data.js';
|
|
8
|
+
import { mockRequest } from '../../__tests__/xyz.util.js';
|
|
9
|
+
import { handler } from '../../index.js';
|
|
10
|
+
import { ConfigLoader } from '../../util/config.loader.js';
|
|
11
|
+
|
|
12
|
+
describe('/v1/link/:tileSet', () => {
|
|
13
|
+
const FakeTileSetName = 'tileset';
|
|
14
|
+
const config = new ConfigProviderMemory();
|
|
15
|
+
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
config.objects.clear();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 3xx status responses
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// tileset found, is raster type, has one layer, has '3857' entry, imagery found > 302 response
|
|
25
|
+
it('success: redirect to pre-zoomed imagery', async (t) => {
|
|
26
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
27
|
+
|
|
28
|
+
config.put(FakeData.tileSetRaster(FakeTileSetName));
|
|
29
|
+
config.put(Imagery3857);
|
|
30
|
+
|
|
31
|
+
const req = mockRequest(`/v1/link/${FakeTileSetName}`);
|
|
32
|
+
const res = await handler.router.handle(req);
|
|
33
|
+
|
|
34
|
+
strictEqual(res.status, 302);
|
|
35
|
+
strictEqual(res.statusDescription, 'Redirect to pre-zoomed imagery');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 4xx status responses
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
// tileset not found > 404 response
|
|
43
|
+
it('failure: tileset not found', async (t) => {
|
|
44
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
45
|
+
|
|
46
|
+
const req = mockRequest(`/v1/link/${FakeTileSetName}`);
|
|
47
|
+
const res = await handler.router.handle(req);
|
|
48
|
+
|
|
49
|
+
strictEqual(res.status, 404);
|
|
50
|
+
strictEqual(res.statusDescription, 'Tileset not found');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// tileset found, not raster type > 400 response
|
|
54
|
+
it('failure: tileset must be raster type', async (t) => {
|
|
55
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
56
|
+
|
|
57
|
+
config.put(FakeData.tileSetVector(FakeTileSetName));
|
|
58
|
+
|
|
59
|
+
const req = mockRequest(`/v1/link/${FakeTileSetName}`);
|
|
60
|
+
const res = await handler.router.handle(req);
|
|
61
|
+
|
|
62
|
+
strictEqual(res.status, 400);
|
|
63
|
+
strictEqual(res.statusDescription, 'Tileset must be raster type');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// tileset found, is raster type, has more than one layer > 400 response
|
|
67
|
+
it('failure: too many layers', async (t) => {
|
|
68
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
69
|
+
|
|
70
|
+
const tileSet = FakeData.tileSetRaster(FakeTileSetName);
|
|
71
|
+
|
|
72
|
+
// add another layer
|
|
73
|
+
tileSet.layers.push(tileSet.layers[0]);
|
|
74
|
+
|
|
75
|
+
config.put(tileSet);
|
|
76
|
+
|
|
77
|
+
const req = mockRequest(`/v1/link/${FakeTileSetName}`);
|
|
78
|
+
const res = await handler.router.handle(req);
|
|
79
|
+
|
|
80
|
+
strictEqual(res.status, 400);
|
|
81
|
+
strictEqual(res.statusDescription, 'Too many layers');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// tileset found, is raster type, has one layer, no '3857' entry > 400 response
|
|
85
|
+
it("failure: no imagery for '3857' projection", async (t) => {
|
|
86
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
87
|
+
|
|
88
|
+
const tileSet = FakeData.tileSetRaster(FakeTileSetName);
|
|
89
|
+
|
|
90
|
+
// delete '3857' entry
|
|
91
|
+
delete tileSet.layers[0][Epsg.Google.code];
|
|
92
|
+
|
|
93
|
+
config.put(tileSet);
|
|
94
|
+
|
|
95
|
+
const req = mockRequest(`/v1/link/${FakeTileSetName}`);
|
|
96
|
+
const res = await handler.router.handle(req);
|
|
97
|
+
|
|
98
|
+
strictEqual(res.status, 400);
|
|
99
|
+
strictEqual(res.statusDescription, "No imagery for '3857' projection");
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// tileset found, is raster type, has one layer, has '3857' entry, imagery not found > 400 response
|
|
103
|
+
it('failure: imagery not found', async (t) => {
|
|
104
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
105
|
+
|
|
106
|
+
config.put(FakeData.tileSetRaster(FakeTileSetName));
|
|
107
|
+
|
|
108
|
+
const req = mockRequest(`/v1/link/${FakeTileSetName}`);
|
|
109
|
+
const res = await handler.router.handle(req);
|
|
110
|
+
|
|
111
|
+
strictEqual(res.status, 400);
|
|
112
|
+
strictEqual(res.statusDescription, 'Imagery not found');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import assert, { strictEqual } from 'node:assert';
|
|
2
|
+
import { afterEach, before, describe, it } from 'node:test';
|
|
3
|
+
|
|
4
|
+
import { copyright, createLicensorAttribution } from '@basemaps/attribution/build/utils.js';
|
|
5
|
+
import { ConfigProviderMemory, StyleJson } from '@basemaps/config';
|
|
6
|
+
import { StacProvider } from '@basemaps/geo';
|
|
7
|
+
import { Env } from '@basemaps/shared';
|
|
8
|
+
|
|
9
|
+
import { FakeData, Imagery3857 } from '../../__tests__/config.data.js';
|
|
10
|
+
import { Api, mockRequest } from '../../__tests__/xyz.util.js';
|
|
11
|
+
import { handler } from '../../index.js';
|
|
12
|
+
import { ConfigLoader } from '../../util/config.loader.js';
|
|
13
|
+
|
|
14
|
+
const defaultAttribution = `${copyright} LINZ`;
|
|
15
|
+
|
|
16
|
+
describe('/v1/styles', () => {
|
|
17
|
+
const host = 'https://tiles.test';
|
|
18
|
+
const config = new ConfigProviderMemory();
|
|
19
|
+
|
|
20
|
+
const FakeTileSetName = 'tileset';
|
|
21
|
+
const FakeLicensor1: StacProvider = {
|
|
22
|
+
name: 'L1',
|
|
23
|
+
roles: ['licensor'],
|
|
24
|
+
};
|
|
25
|
+
const FakeLicensor2: StacProvider = {
|
|
26
|
+
name: 'L2',
|
|
27
|
+
roles: ['licensor'],
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
before(() => {
|
|
31
|
+
process.env[Env.PublicUrlBase] = host;
|
|
32
|
+
});
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
config.objects.clear();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// tileset exists, imagery not found
|
|
38
|
+
it('default: imagery not found', async (t) => {
|
|
39
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
40
|
+
|
|
41
|
+
// insert
|
|
42
|
+
config.put(FakeData.tileSetRaster(FakeTileSetName));
|
|
43
|
+
|
|
44
|
+
// request
|
|
45
|
+
const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
|
|
46
|
+
const res = await handler.router.handle(req);
|
|
47
|
+
strictEqual(res.status, 200);
|
|
48
|
+
|
|
49
|
+
// extract
|
|
50
|
+
const body = Buffer.from(res.body, 'base64').toString();
|
|
51
|
+
const json = JSON.parse(body) as StyleJson;
|
|
52
|
+
|
|
53
|
+
const source = Object.values(json.sources)[0];
|
|
54
|
+
assert(source != null);
|
|
55
|
+
assert(source.attribution != null);
|
|
56
|
+
|
|
57
|
+
// verify
|
|
58
|
+
strictEqual(source.attribution, defaultAttribution);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// tileset exists, imagery found, more than one layer
|
|
62
|
+
it('default: too many layers', async (t) => {
|
|
63
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
64
|
+
|
|
65
|
+
// insert
|
|
66
|
+
const tileset = FakeData.tileSetRaster(FakeTileSetName);
|
|
67
|
+
assert(tileset.layers[0] != null);
|
|
68
|
+
|
|
69
|
+
tileset.layers.push(tileset.layers[0]);
|
|
70
|
+
assert(tileset.layers.length > 1);
|
|
71
|
+
|
|
72
|
+
config.put(tileset);
|
|
73
|
+
config.put(Imagery3857);
|
|
74
|
+
|
|
75
|
+
// request
|
|
76
|
+
const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
|
|
77
|
+
const res = await handler.router.handle(req);
|
|
78
|
+
strictEqual(res.status, 200);
|
|
79
|
+
|
|
80
|
+
// extract
|
|
81
|
+
const body = Buffer.from(res.body, 'base64').toString();
|
|
82
|
+
const json = JSON.parse(body) as StyleJson;
|
|
83
|
+
|
|
84
|
+
const source = Object.values(json.sources)[0];
|
|
85
|
+
assert(source != null);
|
|
86
|
+
assert(source.attribution != null);
|
|
87
|
+
|
|
88
|
+
// verify
|
|
89
|
+
strictEqual(source.attribution, defaultAttribution);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// tileset exists, imagery found, one layer, no providers
|
|
93
|
+
it('default: no providers', async (t) => {
|
|
94
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
95
|
+
|
|
96
|
+
// insert
|
|
97
|
+
const tileset = FakeData.tileSetRaster(FakeTileSetName);
|
|
98
|
+
assert(tileset.layers[0] != null);
|
|
99
|
+
assert(tileset.layers.length === 1);
|
|
100
|
+
|
|
101
|
+
const imagery = Imagery3857;
|
|
102
|
+
assert(imagery.providers == null);
|
|
103
|
+
|
|
104
|
+
config.put(tileset);
|
|
105
|
+
config.put(imagery);
|
|
106
|
+
|
|
107
|
+
// request
|
|
108
|
+
const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
|
|
109
|
+
const res = await handler.router.handle(req);
|
|
110
|
+
strictEqual(res.status, 200);
|
|
111
|
+
|
|
112
|
+
// extract
|
|
113
|
+
const body = Buffer.from(res.body, 'base64').toString();
|
|
114
|
+
const json = JSON.parse(body) as StyleJson;
|
|
115
|
+
|
|
116
|
+
const source = Object.values(json.sources)[0];
|
|
117
|
+
assert(source != null);
|
|
118
|
+
assert(source.attribution != null);
|
|
119
|
+
|
|
120
|
+
// verify
|
|
121
|
+
strictEqual(source.attribution, defaultAttribution);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// tileset exists, imagery found, one layer, has providers, no licensors
|
|
125
|
+
it('default: no licensors', async (t) => {
|
|
126
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
127
|
+
|
|
128
|
+
// insert
|
|
129
|
+
const tileset = FakeData.tileSetRaster(FakeTileSetName);
|
|
130
|
+
assert(tileset.layers[0] != null);
|
|
131
|
+
assert(tileset.layers.length === 1);
|
|
132
|
+
|
|
133
|
+
const imagery = Imagery3857;
|
|
134
|
+
imagery.providers = [];
|
|
135
|
+
assert(imagery.providers != null);
|
|
136
|
+
|
|
137
|
+
config.put(tileset);
|
|
138
|
+
config.put(imagery);
|
|
139
|
+
|
|
140
|
+
// request
|
|
141
|
+
const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
|
|
142
|
+
const res = await handler.router.handle(req);
|
|
143
|
+
strictEqual(res.status, 200);
|
|
144
|
+
|
|
145
|
+
// extract
|
|
146
|
+
const body = Buffer.from(res.body, 'base64').toString();
|
|
147
|
+
const json = JSON.parse(body) as StyleJson;
|
|
148
|
+
|
|
149
|
+
const source = Object.values(json.sources)[0];
|
|
150
|
+
assert(source != null);
|
|
151
|
+
assert(source.attribution != null);
|
|
152
|
+
|
|
153
|
+
// verify
|
|
154
|
+
strictEqual(source.attribution, defaultAttribution);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// tileset exists, imagery found, one layer, has providers, one licensor
|
|
158
|
+
it('custom: one licensor', async (t) => {
|
|
159
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
160
|
+
|
|
161
|
+
// insert
|
|
162
|
+
const tileset = FakeData.tileSetRaster(FakeTileSetName);
|
|
163
|
+
assert(tileset.layers[0] != null);
|
|
164
|
+
assert(tileset.layers.length === 1);
|
|
165
|
+
|
|
166
|
+
const imagery = Imagery3857;
|
|
167
|
+
imagery.providers = [FakeLicensor1];
|
|
168
|
+
assert(imagery.providers != null);
|
|
169
|
+
|
|
170
|
+
config.put(tileset);
|
|
171
|
+
config.put(imagery);
|
|
172
|
+
|
|
173
|
+
// request
|
|
174
|
+
const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
|
|
175
|
+
const res = await handler.router.handle(req);
|
|
176
|
+
strictEqual(res.status, 200);
|
|
177
|
+
|
|
178
|
+
// extract
|
|
179
|
+
const body = Buffer.from(res.body, 'base64').toString();
|
|
180
|
+
const json = JSON.parse(body) as StyleJson;
|
|
181
|
+
|
|
182
|
+
const source = Object.values(json.sources)[0];
|
|
183
|
+
assert(source != null);
|
|
184
|
+
assert(source.attribution != null);
|
|
185
|
+
|
|
186
|
+
// verify
|
|
187
|
+
strictEqual(source.attribution, `${copyright} ${FakeLicensor1.name}`);
|
|
188
|
+
strictEqual(source.attribution, createLicensorAttribution([FakeLicensor1]));
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// tileset exists, imagery found, one layer, has providers, two licensors
|
|
192
|
+
it('custom: two licensors', async (t) => {
|
|
193
|
+
t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
|
|
194
|
+
|
|
195
|
+
// insert
|
|
196
|
+
const tileset = FakeData.tileSetRaster(FakeTileSetName);
|
|
197
|
+
assert(tileset.layers[0] != null);
|
|
198
|
+
assert(tileset.layers.length === 1);
|
|
199
|
+
|
|
200
|
+
const imagery = Imagery3857;
|
|
201
|
+
imagery.providers = [FakeLicensor1, FakeLicensor2];
|
|
202
|
+
assert(imagery.providers != null);
|
|
203
|
+
|
|
204
|
+
config.put(tileset);
|
|
205
|
+
config.put(imagery);
|
|
206
|
+
|
|
207
|
+
// request
|
|
208
|
+
const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
|
|
209
|
+
const res = await handler.router.handle(req);
|
|
210
|
+
strictEqual(res.status, 200);
|
|
211
|
+
|
|
212
|
+
// extract
|
|
213
|
+
const body = Buffer.from(res.body, 'base64').toString();
|
|
214
|
+
const json = JSON.parse(body) as StyleJson;
|
|
215
|
+
|
|
216
|
+
const source = Object.values(json.sources)[0];
|
|
217
|
+
assert(source != null);
|
|
218
|
+
assert(source.attribution != null);
|
|
219
|
+
|
|
220
|
+
// verify
|
|
221
|
+
strictEqual(source.attribution, `${copyright} ${FakeLicensor1.name}, ${FakeLicensor2.name}`);
|
|
222
|
+
strictEqual(source.attribution, createLicensorAttribution([FakeLicensor1, FakeLicensor2]));
|
|
223
|
+
});
|
|
224
|
+
});
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLicensorAttribution } from '@basemaps/attribution/build/utils.js';
|
|
2
|
+
import { BasemapsConfigProvider, ConfigProvider, ConfigTileSet, getAllImagery, TileSetType } from '@basemaps/config';
|
|
2
3
|
import {
|
|
3
4
|
AttributionCollection,
|
|
4
5
|
AttributionItem,
|
|
5
6
|
AttributionStac,
|
|
6
7
|
Bounds,
|
|
8
|
+
Epsg,
|
|
7
9
|
GoogleTms,
|
|
8
10
|
NamedBounds,
|
|
9
11
|
Projection,
|
|
@@ -93,10 +95,11 @@ async function tileSetAttribution(
|
|
|
93
95
|
|
|
94
96
|
const config = await ConfigLoader.load(req);
|
|
95
97
|
const imagery = await getAllImagery(config, tileSet.layers, [tileMatrix.projection]);
|
|
96
|
-
|
|
97
98
|
const host = await config.Provider.get(config.Provider.id('linz'));
|
|
98
99
|
|
|
99
|
-
for (
|
|
100
|
+
for (let i = 0; i < tileSet.layers.length; i++) {
|
|
101
|
+
const layer = tileSet.layers[i];
|
|
102
|
+
|
|
100
103
|
const imgId = layer[proj.epsg.code];
|
|
101
104
|
if (imgId == null) continue;
|
|
102
105
|
|
|
@@ -138,11 +141,12 @@ async function tileSetAttribution(
|
|
|
138
141
|
|
|
139
142
|
const zoomMin = TileMatrixSet.convertZoomLevel(layer.minZoom ? layer.minZoom : 0, GoogleTms, tileMatrix, true);
|
|
140
143
|
const zoomMax = TileMatrixSet.convertZoomLevel(layer.maxZoom ? layer.maxZoom : 32, GoogleTms, tileMatrix, true);
|
|
144
|
+
|
|
141
145
|
cols.push({
|
|
142
146
|
stac_version: Stac.Version,
|
|
143
147
|
license: Stac.License,
|
|
144
148
|
id: im.id,
|
|
145
|
-
providers: getHost(host),
|
|
149
|
+
providers: im.providers ?? getHost(host),
|
|
146
150
|
title,
|
|
147
151
|
description: 'No description',
|
|
148
152
|
extent,
|
|
@@ -150,10 +154,11 @@ async function tileSetAttribution(
|
|
|
150
154
|
summaries: {
|
|
151
155
|
'linz:category': im.category,
|
|
152
156
|
'linz:zoom': { min: zoomMin, max: zoomMax },
|
|
153
|
-
'linz:priority': [1000 +
|
|
157
|
+
'linz:priority': [1000 + i],
|
|
154
158
|
},
|
|
155
159
|
});
|
|
156
160
|
}
|
|
161
|
+
|
|
157
162
|
return {
|
|
158
163
|
id: tileSet.id,
|
|
159
164
|
type: 'FeatureCollection',
|
|
@@ -205,3 +210,43 @@ export async function tileAttributionGet(req: LambdaHttpRequest<TileAttributionG
|
|
|
205
210
|
response.json(attributions);
|
|
206
211
|
return response;
|
|
207
212
|
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Construct a licensor attribution for a given tileSet.
|
|
216
|
+
*
|
|
217
|
+
* @param provider The BasemapsConfigProvider object.
|
|
218
|
+
* @param tileSet The tileset from which to build the attribution.
|
|
219
|
+
* @param projection The projection to consider.
|
|
220
|
+
*
|
|
221
|
+
* @returns A default attribution, if the tileset has more than one layer or no such imagery for the given projection exists.
|
|
222
|
+
* Otherwise, a copyright string comprising the names of the tileset's licensors.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* "CC BY 4.0 LINZ"
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* "CC BY 4.0 Nelson City Council, Tasman District Council, Waka Kotahi"
|
|
229
|
+
*/
|
|
230
|
+
export async function createTileSetAttribution(
|
|
231
|
+
provider: BasemapsConfigProvider,
|
|
232
|
+
tileSet: ConfigTileSet,
|
|
233
|
+
projection: Epsg,
|
|
234
|
+
): Promise<string> {
|
|
235
|
+
// ensure the tileset has exactly one layer
|
|
236
|
+
if (tileSet.layers.length > 1 || tileSet.layers[0] == null) {
|
|
237
|
+
return createLicensorAttribution();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ensure imagery exist for the given projection
|
|
241
|
+
const imgId = tileSet.layers[0][projection.code];
|
|
242
|
+
if (imgId == null) return '';
|
|
243
|
+
|
|
244
|
+
// attempt to load the imagery
|
|
245
|
+
const imagery = await provider.Imagery.get(imgId);
|
|
246
|
+
if (imagery?.providers == null) {
|
|
247
|
+
return createLicensorAttribution();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// return a licensor attribution string
|
|
251
|
+
return createLicensorAttribution(imagery.providers);
|
|
252
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { TileSetType } from '@basemaps/config';
|
|
2
|
+
import { Epsg } from '@basemaps/geo';
|
|
3
|
+
import { getPreviewUrl } from '@basemaps/shared';
|
|
4
|
+
import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
|
|
5
|
+
|
|
6
|
+
import { ConfigLoader } from '../util/config.loader.js';
|
|
7
|
+
|
|
8
|
+
export interface LinkGet {
|
|
9
|
+
Params: {
|
|
10
|
+
tileSet: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Redirect the client to a Basemaps URL that is already zoomed to the extent of the tileset's imagery.
|
|
16
|
+
*
|
|
17
|
+
* /v1/link/:tileSet
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* '/v1/link/ashburton-2023-0.1m'
|
|
21
|
+
*
|
|
22
|
+
* @returns on success, 302 redirect response. on failure, 4xx status code response.
|
|
23
|
+
*/
|
|
24
|
+
export async function linkGet(req: LambdaHttpRequest<LinkGet>): Promise<LambdaHttpResponse> {
|
|
25
|
+
const config = await ConfigLoader.load(req);
|
|
26
|
+
|
|
27
|
+
// get tileset
|
|
28
|
+
|
|
29
|
+
req.timer.start('tileset:load');
|
|
30
|
+
const tileSet = await config.TileSet.get(req.params.tileSet);
|
|
31
|
+
req.timer.end('tileset:load');
|
|
32
|
+
|
|
33
|
+
if (tileSet == null) return new LambdaHttpResponse(404, 'Tileset not found');
|
|
34
|
+
|
|
35
|
+
if (tileSet.type !== TileSetType.Raster) return new LambdaHttpResponse(400, 'Tileset must be raster type');
|
|
36
|
+
|
|
37
|
+
// TODO: add support for 'aerial' and 'elevation' multi-layer tilesets
|
|
38
|
+
if (tileSet.layers.length !== 1) return new LambdaHttpResponse(400, 'Too many layers');
|
|
39
|
+
|
|
40
|
+
// get imagery
|
|
41
|
+
|
|
42
|
+
const imageryId = tileSet.layers[0][Epsg.Google.code];
|
|
43
|
+
if (imageryId === undefined) return new LambdaHttpResponse(400, "No imagery for '3857' projection");
|
|
44
|
+
|
|
45
|
+
const imagery = await config.Imagery.get(imageryId);
|
|
46
|
+
if (imagery == null) return new LambdaHttpResponse(400, 'Imagery not found');
|
|
47
|
+
|
|
48
|
+
// do redirect
|
|
49
|
+
|
|
50
|
+
const url = getPreviewUrl({ imagery });
|
|
51
|
+
|
|
52
|
+
return new LambdaHttpResponse(302, 'Redirect to pre-zoomed imagery', {
|
|
53
|
+
location: `/${url.slug}?i=${url.name}`,
|
|
54
|
+
});
|
|
55
|
+
}
|