@basemaps/lambda-tiler 6.43.0 → 6.44.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/cli/render.preview.d.ts +2 -0
  3. package/build/cli/render.preview.d.ts.map +1 -0
  4. package/build/cli/render.preview.js +38 -0
  5. package/build/cli/render.preview.js.map +1 -0
  6. package/build/index.d.ts.map +1 -1
  7. package/build/index.js +6 -0
  8. package/build/index.js.map +1 -1
  9. package/build/routes/__tests__/preview.index.test.d.ts +2 -0
  10. package/build/routes/__tests__/preview.index.test.d.ts.map +1 -0
  11. package/build/routes/__tests__/preview.index.test.js +82 -0
  12. package/build/routes/__tests__/preview.index.test.js.map +1 -0
  13. package/build/routes/preview.d.ts +58 -0
  14. package/build/routes/preview.d.ts.map +1 -0
  15. package/build/routes/preview.index.d.ts +23 -0
  16. package/build/routes/preview.index.d.ts.map +1 -0
  17. package/build/routes/preview.index.js +98 -0
  18. package/build/routes/preview.index.js.map +1 -0
  19. package/build/routes/preview.js +159 -0
  20. package/build/routes/preview.js.map +1 -0
  21. package/build/routes/tile.xyz.raster.d.ts +15 -0
  22. package/build/routes/tile.xyz.raster.d.ts.map +1 -1
  23. package/build/routes/tile.xyz.raster.js +45 -24
  24. package/build/routes/tile.xyz.raster.js.map +1 -1
  25. package/build/util/validate.d.ts +3 -1
  26. package/build/util/validate.d.ts.map +1 -1
  27. package/build/util/validate.js +10 -0
  28. package/build/util/validate.js.map +1 -1
  29. package/bundle.sh +1 -1
  30. package/package.json +8 -8
  31. package/src/cli/render.preview.ts +44 -0
  32. package/src/index.ts +7 -0
  33. package/src/routes/__tests__/preview.index.test.ts +94 -0
  34. package/src/routes/preview.index.ts +119 -0
  35. package/src/routes/preview.ts +234 -0
  36. package/src/routes/tile.xyz.raster.ts +53 -28
  37. package/src/util/validate.ts +10 -1
  38. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [6.44.0](https://github.com/linz/basemaps/compare/v6.43.0...v6.44.0) (2023-09-05)
7
+
8
+
9
+ ### Features
10
+
11
+ * **lambda-tiler:** use the same checker background that the landing does for previews BM-264 ([#2929](https://github.com/linz/basemaps/issues/2929)) ([9318588](https://github.com/linz/basemaps/commit/9318588bd929b6f41d10217138726331fa8115b2))
12
+ * add og:image preview to all basemaps links BM-264 ([#2925](https://github.com/linz/basemaps/issues/2925)) ([de00528](https://github.com/linz/basemaps/commit/de005285eac0c2f5e2c83c8eeaa61aafeff8edde))
13
+ * **lambda-tiler:** create preview images for og:image BM-264 ([#2921](https://github.com/linz/basemaps/issues/2921)) ([a074cc4](https://github.com/linz/basemaps/commit/a074cc45b40e35d5a593380f067f4932ef9e8da4))
14
+ * **lambda-tiler:** try arm based lambdas ([#2910](https://github.com/linz/basemaps/issues/2910)) ([e5bd68d](https://github.com/linz/basemaps/commit/e5bd68df37f487c4cc543c69fbedc66f13c5fdc0))
15
+
16
+
17
+
18
+
19
+
6
20
  # [6.43.0](https://github.com/linz/basemaps/compare/v6.42.1...v6.43.0) (2023-08-22)
7
21
 
8
22
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=render.preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.preview.d.ts","sourceRoot":"","sources":["../../src/cli/render.preview.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { ConfigProviderMemory } from '@basemaps/config';
2
+ import { initConfigFromUrls } from '@basemaps/config/build/json/tiff.config.js';
3
+ import { ImageFormat, TileMatrixSets } from '@basemaps/geo';
4
+ import { LogConfig, setDefaultConfig } from '@basemaps/shared';
5
+ import { fsa } from '@chunkd/fs';
6
+ import { LambdaUrlRequest } from '@linzjs/lambda';
7
+ import { pathToFileURL } from 'url';
8
+ import { renderPreview } from '../routes/preview.js';
9
+ const target = pathToFileURL(`/home/blacha/tmp/basemaps/bm-724/test-north-island_20230220_10m/`);
10
+ const location = { lat: -39.0852555, lon: 177.3998405 };
11
+ const z = 12;
12
+ const outputFormat = ImageFormat.Webp;
13
+ let tileMatrix = null;
14
+ async function main() {
15
+ const log = LogConfig.get();
16
+ const provider = new ConfigProviderMemory();
17
+ setDefaultConfig(provider);
18
+ const { tileSet, imagery } = await initConfigFromUrls(provider, [target]);
19
+ if (tileSet.layers.length === 0)
20
+ throw new Error('No imagery found in path: ' + target);
21
+ log.info({ tileSet: tileSet.name, layers: tileSet.layers.length }, 'TileSet:Loaded');
22
+ for (const im of imagery) {
23
+ log.info({ url: im.uri, title: im.title, tileMatrix: im.tileMatrix, files: im.files.length }, 'Imagery:Loaded');
24
+ if (tileMatrix == null) {
25
+ tileMatrix = TileMatrixSets.find(im.tileMatrix);
26
+ log.info({ tileMatrix: im.tileMatrix }, 'Imagery:TileMatrix:Set');
27
+ }
28
+ }
29
+ if (tileMatrix == null)
30
+ throw new Error('No tileMatrix found');
31
+ const req = new LambdaUrlRequest({ headers: {} }, {}, LogConfig.get());
32
+ const res = await renderPreview(req, { tileMatrix, tileSet, location, z, outputFormat });
33
+ const previewFile = `./z${z}_${location.lon}_${location.lat}.${outputFormat}`;
34
+ await fsa.write(previewFile, Buffer.from(res.body, 'base64'));
35
+ log.info({ path: previewFile }, 'Tile:Write');
36
+ }
37
+ main();
38
+ //# sourceMappingURL=render.preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.preview.js","sourceRoot":"","sources":["../../src/cli/render.preview.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,OAAO,uRAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,OAAO,uRAA2B,CAAC"}
package/build/index.js CHANGED
@@ -18,6 +18,8 @@ import { versionGet } from './routes/version.js';
18
18
  import { NotFound, OkResponse } from './util/response.js';
19
19
  import { CoSources } from './util/source.cache.js';
20
20
  import { St } from './util/source.tracer.js';
21
+ import { tilePreviewGet } from './routes/preview.js';
22
+ import { previewIndexGet } from './routes/preview.index.js';
21
23
  export const handler = lf.http(LogConfig.get());
22
24
  /** If the request takes too long, respond with a 408 timeout when there is approx 1 second remaining */
23
25
  handler.router.timeoutEarlyMs = 1000;
@@ -77,6 +79,10 @@ handler.router.get('/v1/tiles/:tileSet/:tileMatrix/style/:styleName.json', style
77
79
  handler.router.get('/v1/tiles/:tileSet/:tileMatrix/tile.json', tileJsonGet);
78
80
  // Tiles
79
81
  handler.router.get('/v1/tiles/:tileSet/:tileMatrix/:z/:x/:y.:tileType', tileXyzGet);
82
+ // Preview
83
+ handler.router.get('/v1/preview/:tileSet/:tileMatrix/:z/:lon/:lat', tilePreviewGet);
84
+ handler.router.get('/v1/@:location', previewIndexGet);
85
+ handler.router.get('/@:location', previewIndexGet);
80
86
  // Attribution
81
87
  handler.router.get('/v1/tiles/:tileSet/:tileMatrix/attribution.json', tileAttributionGet);
82
88
  handler.router.get('/v1/attribution/:tileSet/:tileMatrix/summary.json', tileAttributionGet);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=preview.index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.index.test.d.ts","sourceRoot":"","sources":["../../../src/routes/__tests__/preview.index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { Env, LogConfig, V, fsa } from '@basemaps/shared';
2
+ import { LambdaAlbRequest } from '@linzjs/lambda';
3
+ import o from 'ospec';
4
+ import { loadAndServeIndexHtml } from '../preview.index.js';
5
+ import { LocationUrl } from '@basemaps/geo';
6
+ import { FsMemory } from '@chunkd/source-memory';
7
+ o.spec('/@*', async () => {
8
+ o.specTimeout(1000);
9
+ const baseRequest = {
10
+ requestContext: null,
11
+ httpMethod: 'get',
12
+ path: '/@-41.8900012,174.0492432,z5',
13
+ body: null,
14
+ isBase64Encoded: false,
15
+ };
16
+ const fsMem = new FsMemory();
17
+ let lastLocation;
18
+ o.beforeEach(() => {
19
+ fsa.register('memory://', fsMem);
20
+ lastLocation = process.env[Env.StaticAssetLocation];
21
+ });
22
+ o.afterEach(() => {
23
+ if (lastLocation == null)
24
+ delete process.env[Env.StaticAssetLocation];
25
+ else
26
+ process.env[Env.StaticAssetLocation] = lastLocation;
27
+ });
28
+ o('Should redirect on failure to load', async () => {
29
+ const ctx = new LambdaAlbRequest(baseRequest, {}, LogConfig.get());
30
+ const res = await loadAndServeIndexHtml(ctx);
31
+ o(res.status).equals(302);
32
+ o(res.header('location')).equals('/?');
33
+ });
34
+ o('Should redirect with querystring on failure to load', async () => {
35
+ const evt = { ...baseRequest, queryStringParameters: { config: 'config-latest.json' } };
36
+ const ctx = new LambdaAlbRequest(evt, {}, LogConfig.get());
37
+ const res = await loadAndServeIndexHtml(ctx);
38
+ o(res.status).equals(302);
39
+ o(res.header('location')).equals('/?config=config-latest.json');
40
+ });
41
+ o('Should redirect with querystring and location on failure to load', async () => {
42
+ const evt = { ...baseRequest, queryStringParameters: { config: 'config-latest.json' } };
43
+ const loc = LocationUrl.fromSlug(evt.path);
44
+ const ctx = new LambdaAlbRequest(evt, {}, LogConfig.get());
45
+ const res = await loadAndServeIndexHtml(ctx, loc);
46
+ o(res.status).equals(302);
47
+ o(res.header('location')).equals('/?config=config-latest.json#@-41.8900012,174.0492432,z5');
48
+ });
49
+ o('should redirect on failure to load index.html', async () => {
50
+ const ctx = new LambdaAlbRequest(baseRequest, {}, LogConfig.get());
51
+ process.env[Env.StaticAssetLocation] = 'memory://assets/';
52
+ const res = await loadAndServeIndexHtml(ctx);
53
+ o(res.status).equals(302);
54
+ });
55
+ o('should redirect with new tags!', async () => {
56
+ var _a, _b;
57
+ const ctx = new LambdaAlbRequest(baseRequest, {}, LogConfig.get());
58
+ process.env[Env.StaticAssetLocation] = 'memory://assets/';
59
+ const indexHtml = V('html', [
60
+ V('head', [
61
+ V('meta', { property: 'og:title', content: 'LINZ Basemaps' }),
62
+ V('meta', { property: 'og:image', content: '/basemaps-card.jepg' }),
63
+ V('meta', { name: 'viewport' }),
64
+ ]),
65
+ ]).toString();
66
+ await fsa.write('memory://assets/index.html', indexHtml);
67
+ // Pass back the body un altered
68
+ const res = await loadAndServeIndexHtml(ctx);
69
+ o((_a = getBody(res)) === null || _a === void 0 ? void 0 : _a.toString()).equals(indexHtml);
70
+ // Replace og:title with a <fake tag />
71
+ const resB = await loadAndServeIndexHtml(ctx, null, new Map([['og:title', '<fake tag />']]));
72
+ o((_b = getBody(resB)) === null || _b === void 0 ? void 0 : _b.toString().includes('<fake tag />')).equals(true);
73
+ });
74
+ });
75
+ function getBody(res) {
76
+ if (res._body == null)
77
+ return null;
78
+ if (res.isBase64Encoded)
79
+ return Buffer.from(res._body, 'base64');
80
+ return Buffer.from(res._body);
81
+ }
82
+ //# sourceMappingURL=preview.index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.index.test.js","sourceRoot":"","sources":["../../../src/routes/__tests__/preview.index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAyC,MAAM,gBAAgB,CAAC;AAEzF,OAAO,CAAC,MAAM,OAAO,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;IACvB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,WAAW,GAAa;QAC5B,cAAc,EAAE,IAAW;QAC3B,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,KAAK;KACvB,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC7B,IAAI,YAAgC,CAAC;IACrC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;QAChB,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,IAAI,YAAY,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;;YACjE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,YAAY,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAsB,IAAI,gBAAgB,CAAC,WAAW,EAAE,EAAa,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjG,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,GAAG,GAAa,EAAE,GAAG,WAAW,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,CAAC;QAClG,MAAM,GAAG,GAAsB,IAAI,gBAAgB,CAAC,GAAG,EAAE,EAAa,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEzF,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,GAAG,GAAa,EAAE,GAAG,WAAW,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,CAAC;QAClG,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAsB,IAAI,gBAAgB,CAAC,GAAG,EAAE,EAAa,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEzF,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,GAAG,GAAsB,IAAI,gBAAgB,CAAC,WAAW,EAAE,EAAa,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,kBAAkB,CAAC;QAE1D,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;;QAC7C,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,WAAW,EAAE,EAAa,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,kBAAkB,CAAC;QAE1D,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE;YAC1B,CAAC,CAAC,MAAM,EAAE;gBACR,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;gBAC7D,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;gBACnE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAChC,CAAC;SACH,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEd,MAAM,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;QAEzD,gCAAgC;QAChC,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE9C,uCAAuC;QACvC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC,CAAC,MAAA,OAAO,CAAC,IAAI,CAAC,0CAAE,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,OAAO,CAAC,GAAuB;IACtC,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,GAAG,CAAC,eAAe;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAe,EAAE,QAAQ,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { ConfigTileSetRaster } from '@basemaps/config';
2
+ import { ImageFormat, LatLon, TileMatrixSet } from '@basemaps/geo';
3
+ import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
4
+ export interface PreviewGet {
5
+ Params: {
6
+ tileSet: string;
7
+ tileMatrix: string;
8
+ lat: string;
9
+ lon: string;
10
+ z: string;
11
+ };
12
+ }
13
+ /**
14
+ * Serve a preview of a imagery set
15
+ *
16
+ * /v1/preview/:tileSet/:tileMatrixSet/:z/:lon/:lat
17
+ *
18
+ * @example
19
+ * Raster Tile `/v1/preview/aerial/WebMercatorQuad/12/177.3998405/-39.0852555`
20
+ *
21
+ */
22
+ export declare function tilePreviewGet(req: LambdaHttpRequest<PreviewGet>): Promise<LambdaHttpResponse>;
23
+ interface PreviewRenderContext {
24
+ /** Imagery to use */
25
+ tileSet: ConfigTileSetRaster;
26
+ /** output tilematrix to use */
27
+ tileMatrix: TileMatrixSet;
28
+ /** Center point of the preview */
29
+ location: LatLon;
30
+ /** Iamge format to render the preview as */
31
+ outputFormat: ImageFormat;
32
+ /** Zom level to be use, must be a integer */
33
+ z: number;
34
+ }
35
+ /**
36
+ * Render the preview!
37
+ *
38
+ * All the parameter validation is done in {@link tilePreviewGet} this function expects everything to align
39
+ *
40
+ * @returns 304 not modified if the ETag matches or 200 ok with the content of the image
41
+ */
42
+ export declare function renderPreview(req: LambdaHttpRequest, ctx: PreviewRenderContext): Promise<LambdaHttpResponse>;
43
+ export interface CheckerBoard {
44
+ /** Output image width in pixels */
45
+ width: number;
46
+ /** Output image height in pixels */
47
+ height: number;
48
+ colors: {
49
+ /** Color of the checker board eg 0xef */
50
+ fill: number;
51
+ /** Color of the background eg 0xff */
52
+ background: number;
53
+ };
54
+ /** Size of the checkers */
55
+ size: number;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/routes/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAU,WAAW,EAAE,MAAM,EAAc,aAAa,EAAE,MAAM,eAAe,CAAC;AAGvF,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAQnF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;CACH;AAWD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2BpG;AAED,UAAU,oBAAoB;IAC5B,qBAAqB;IACrB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,+BAA+B;IAC/B,UAAU,EAAE,aAAa,CAAC;IAC1B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,WAAW,CAAC;IAC1B,6CAA6C;IAC7C,CAAC,EAAE,MAAM,CAAC;CACX;AACD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0ElH;AAeD,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,yCAAyC;QACzC,IAAI,EAAE,MAAM,CAAC;QACb,sCAAsC;QACtC,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,23 @@
1
+ import { LonLatZoom } from '@basemaps/geo';
2
+ import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
3
+ export interface PreviewIndexGet {
4
+ Params: {
5
+ location: string;
6
+ };
7
+ Query: {
8
+ config?: string;
9
+ style?: string;
10
+ tileMatrix?: string;
11
+ };
12
+ }
13
+ /**
14
+ * Load the `index.html` from the static bucket and replace `<meta />` tags with the preview open graph tags
15
+ *
16
+ * @param loc location of the request if valid
17
+ * @param tags tags to replace if they exist
18
+ *
19
+ * @returns response containing the output HTML
20
+ */
21
+ export declare function loadAndServeIndexHtml(req: LambdaHttpRequest, loc?: LonLatZoom | null, tags?: Map<string, string>): Promise<LambdaHttpResponse>;
22
+ export declare function previewIndexGet(req: LambdaHttpRequest<PreviewIndexGet>): Promise<LambdaHttpResponse>;
23
+ //# sourceMappingURL=preview.index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.index.d.ts","sourceRoot":"","sources":["../../src/routes/preview.index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,UAAU,EAAkB,MAAM,eAAe,CAAC;AACnF,OAAO,EAAc,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAUnF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,iBAAiB,EACtB,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,EACvB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoC1G"}
@@ -0,0 +1,98 @@
1
+ import { GoogleTms, LocationUrl, TileMatrixSets } from '@basemaps/geo';
2
+ import { HttpHeader, LambdaHttpResponse } from '@linzjs/lambda';
3
+ import { ConfigLoader } from '../util/config.loader.js';
4
+ import { Env, fsa } from '@basemaps/shared';
5
+ import { isGzip } from '../util/cotar.serve.js';
6
+ import { gunzip } from 'node:zlib';
7
+ import { promisify } from 'node:util';
8
+ import { Etag } from '../util/etag.js';
9
+ const gunzipP = promisify(gunzip);
10
+ /**
11
+ * Load the `index.html` from the static bucket and replace `<meta />` tags with the preview open graph tags
12
+ *
13
+ * @param loc location of the request if valid
14
+ * @param tags tags to replace if they exist
15
+ *
16
+ * @returns response containing the output HTML
17
+ */
18
+ export async function loadAndServeIndexHtml(req, loc, tags) {
19
+ const locUrl = loc ? `#` + LocationUrl.toSlug(loc) : '';
20
+ // If the static location is given to us replace
21
+ const staticLocation = Env.get(Env.StaticAssetLocation);
22
+ // No static assets defined, just redirect back to the main page
23
+ if (staticLocation == null) {
24
+ return new LambdaHttpResponse(302, 'Invalid index.html', {
25
+ location: '/?' + req.query.toString() + locUrl,
26
+ });
27
+ }
28
+ try {
29
+ let indexHtml = await fsa.read(fsa.join(staticLocation, 'index.html'));
30
+ if (isGzip(indexHtml))
31
+ indexHtml = await gunzipP(indexHtml);
32
+ const res = new LambdaHttpResponse(200, 'ok');
33
+ // These index.html documents are refreshed frequently so only let them be cached for short durations
34
+ res.header(HttpHeader.CacheControl, 'public, max-age=30, stale-while-revalidate=60');
35
+ if (tags == null) {
36
+ res.header(HttpHeader.ETag, Etag.key(indexHtml));
37
+ res.buffer(indexHtml, `text/html; charset=utf-8`);
38
+ return res;
39
+ }
40
+ // Replace open graph tags
41
+ const output = String(indexHtml)
42
+ .split('\n')
43
+ .map((f) => {
44
+ for (const [key, value] of tags.entries()) {
45
+ if (f.includes(key))
46
+ return value;
47
+ }
48
+ return f;
49
+ });
50
+ const outHtml = output.join('\n');
51
+ res.header(HttpHeader.ETag, Etag.key(outHtml));
52
+ res.buffer(outHtml, `text/html; charset=utf-8`);
53
+ return res;
54
+ }
55
+ catch (e) {
56
+ req.log.fatal({ e }, 'Index:Failed');
57
+ // If we fail to read transform the index, just redirect the user to the actual index.html
58
+ return new LambdaHttpResponse(302, 'Failed to render index.html', {
59
+ location: '/?' + req.query.toString() + locUrl,
60
+ });
61
+ }
62
+ }
63
+ export async function previewIndexGet(req) {
64
+ const config = await ConfigLoader.load(req);
65
+ const loc = LocationUrl.fromSlug(req.params.location);
66
+ if (loc == null)
67
+ return loadAndServeIndexHtml(req);
68
+ const query = LocationUrl.parseQuery(req.query);
69
+ req.timer.start('tileset:load');
70
+ const tileSet = await config.TileSet.get(config.TileSet.id(query.style));
71
+ req.timer.end('tileset:load');
72
+ if (tileSet == null)
73
+ return loadAndServeIndexHtml(req, loc);
74
+ if (tileSet.type !== 'raster')
75
+ return loadAndServeIndexHtml(req, loc);
76
+ let tileMatrix = TileMatrixSets.find(query.tileMatrix);
77
+ if (tileMatrix == null)
78
+ tileMatrix = GoogleTms;
79
+ const short = LocationUrl.truncateLatLon(loc);
80
+ const shortLocation = [short.zoom, short.lon, short.lat].join('/');
81
+ // Include tile matrix name eg "[NZTM2000Quad]" in the title if its not WebMercatorQuad
82
+ const tileMatrixId = tileMatrix.identifier === GoogleTms.identifier ? '' : ` [${tileMatrix.identifier}]`;
83
+ // List of tags to replace in the index.html
84
+ const ogTags = new Map([
85
+ ['og:title', `<meta name="twitter:title" property="og:title" content="LINZ Basemaps">`],
86
+ // TODO attribution could be used to get exactly what imagery is being looked at.
87
+ [
88
+ 'og:description',
89
+ `<meta name="twitter:description" property="og:description" content="${tileSet.title}${tileMatrixId}" />`,
90
+ ],
91
+ [
92
+ 'og:image',
93
+ `<meta name="twitter:image" property="og:image" content="/v1/preview/${tileSet.name}/${tileMatrix.identifier}/${shortLocation}" />`,
94
+ ],
95
+ ]);
96
+ return loadAndServeIndexHtml(req, loc, ogTags);
97
+ }
98
+ //# sourceMappingURL=preview.index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.index.js","sourceRoot":"","sources":["../../src/routes/preview.index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAc,cAAc,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,UAAU,EAAqB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAalC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAsB,EACtB,GAAuB,EACvB,IAA0B;IAE1B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,gDAAgD;IAChD,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxD,gEAAgE;IAChE,IAAI,cAAc,IAAI,IAAI,EAAE;QAC1B,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE;YACvD,QAAQ,EAAE,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,MAAM;SAC/C,CAAC,CAAC;KACJ;IAED,IAAI;QACF,IAAI,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;QACvE,IAAI,MAAM,CAAC,SAAS,CAAC;YAAE,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9C,qGAAqG;QACrG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QAErF,IAAI,IAAI,IAAI,IAAI,EAAE;YAChB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACjD,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAClD,OAAO,GAAG,CAAC;SACZ;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;aAC7B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;gBACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;aACnC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEL,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;KACZ;IAAC,OAAO,CAAC,EAAE;QACV,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QACrC,0FAA0F;QAC1F,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,6BAA6B,EAAE;YAChE,QAAQ,EAAE,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,MAAM;SAC/C,CAAC,CAAC;KACJ;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAuC;IAC3E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEhD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEtE,IAAI,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,UAAU,IAAI,IAAI;QAAE,UAAU,GAAG,SAAS,CAAC;IAE/C,MAAM,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnE,uFAAuF;IACvF,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,UAAU,GAAG,CAAC;IACzG,4CAA4C;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;QACrB,CAAC,UAAU,EAAE,yEAAyE,CAAC;QACvF,iFAAiF;QACjF;YACE,gBAAgB;YAChB,uEAAuE,OAAO,CAAC,KAAK,GAAG,YAAY,MAAM;SAC1G;QACD;YACE,UAAU;YACV,uEAAuE,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,IAAI,aAAa,MAAM;SACpI;KACF,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { Bounds, ImageFormat, Projection } from '@basemaps/geo';
2
+ import { Tiler } from '@basemaps/tiler';
3
+ import { TileMakerSharp } from '@basemaps/tiler-sharp';
4
+ import { HttpHeader, LambdaHttpResponse } from '@linzjs/lambda';
5
+ import { ConfigLoader } from '../util/config.loader.js';
6
+ import { Etag } from '../util/etag.js';
7
+ import { NotModified } from '../util/response.js';
8
+ import { Validate } from '../util/validate.js';
9
+ import { DefaultResizeKernel, TileXyzRaster, isArchiveTiff } from './tile.xyz.raster.js';
10
+ import sharp from 'sharp';
11
+ const PreviewSize = { width: 1200, height: 630 };
12
+ const TilerSharp = new TileMakerSharp(PreviewSize.width, PreviewSize.height);
13
+ const OutputFormat = ImageFormat.Webp;
14
+ /** Slightly grey color for the checker background */
15
+ const PreviewBackgroundFillColor = 0xef;
16
+ /** Make th e checkered background 30x30px */
17
+ const PreviewBackgroundSizePx = 30;
18
+ /**
19
+ * Serve a preview of a imagery set
20
+ *
21
+ * /v1/preview/:tileSet/:tileMatrixSet/:z/:lon/:lat
22
+ *
23
+ * @example
24
+ * Raster Tile `/v1/preview/aerial/WebMercatorQuad/12/177.3998405/-39.0852555`
25
+ *
26
+ */
27
+ export async function tilePreviewGet(req) {
28
+ const tileMatrix = Validate.getTileMatrixSet(req.params.tileMatrix);
29
+ if (tileMatrix == null)
30
+ return new LambdaHttpResponse(404, 'Tile Matrix not found');
31
+ req.set('tileMatrix', tileMatrix.identifier);
32
+ req.set('projection', tileMatrix.projection.code);
33
+ // TODO we should detect the format based off the "Accept" header and maybe default back to webp
34
+ req.set('extension', OutputFormat);
35
+ const location = Validate.getLocation(req.params.lon, req.params.lat);
36
+ if (location == null)
37
+ return new LambdaHttpResponse(404, 'Preview location not found');
38
+ req.set('location', location);
39
+ const z = Math.ceil(parseFloat(req.params.z));
40
+ if (isNaN(z) || z < 0 || z > tileMatrix.maxZoom)
41
+ return new LambdaHttpResponse(404, 'Preview zoom invalid');
42
+ const config = await ConfigLoader.load(req);
43
+ req.timer.start('tileset:load');
44
+ const tileSet = await config.TileSet.get(config.TileSet.id(req.params.tileSet));
45
+ req.timer.end('tileset:load');
46
+ if (tileSet == null)
47
+ return new LambdaHttpResponse(404, 'Tileset not found');
48
+ // Only raster previews are supported
49
+ if (tileSet.type !== 'raster')
50
+ return new LambdaHttpResponse(404, 'Preview invalid tile set type');
51
+ return renderPreview(req, { tileSet, tileMatrix, location, outputFormat: OutputFormat, z });
52
+ }
53
+ /**
54
+ * Render the preview!
55
+ *
56
+ * All the parameter validation is done in {@link tilePreviewGet} this function expects everything to align
57
+ *
58
+ * @returns 304 not modified if the ETag matches or 200 ok with the content of the image
59
+ */
60
+ export async function renderPreview(req, ctx) {
61
+ const tileMatrix = ctx.tileMatrix;
62
+ // Convert the input lat/lon into the projected coordinates to make it easier to do math with
63
+ const coords = Projection.get(tileMatrix).fromWgs84([ctx.location.lon, ctx.location.lat]);
64
+ // use the input as the center point, but round it to the closest pixel to make it easier to do math
65
+ const point = tileMatrix.sourceToPixels(coords[0], coords[1], ctx.z);
66
+ const pointCenter = { x: Math.round(point.x), y: Math.round(point.y) };
67
+ // position of the preview in relation to the output screen
68
+ const screenBounds = new Bounds(pointCenter.x - PreviewSize.width / 2, pointCenter.y - PreviewSize.height / 2, PreviewSize.width, PreviewSize.height);
69
+ // Convert the screen bounds back into the source to find the assets we need to render the preview
70
+ const topLeft = tileMatrix.pixelsToSource(screenBounds.x, screenBounds.y, ctx.z);
71
+ const bottomRight = tileMatrix.pixelsToSource(screenBounds.right, screenBounds.bottom, ctx.z);
72
+ const sourceBounds = Bounds.fromBbox([topLeft.x, topLeft.y, bottomRight.x, bottomRight.y]);
73
+ const assetLocations = await TileXyzRaster.getAssetsForBounds(req, ctx.tileSet, tileMatrix, sourceBounds, ctx.z, true);
74
+ const cacheKey = Etag.key(assetLocations);
75
+ if (Etag.isNotModified(req, cacheKey))
76
+ return NotModified();
77
+ const assets = await TileXyzRaster.loadAssets(req, assetLocations);
78
+ const tiler = new Tiler(tileMatrix);
79
+ // Figure out what tiffs and tiles need to be read and where they are placed on the output image
80
+ const compositions = [];
81
+ for (const asset of assets) {
82
+ // there shouldn't be any Cotar archives in previews but ignore them to be safe
83
+ if (!isArchiveTiff(asset))
84
+ continue;
85
+ const result = tiler.getTiles(asset, screenBounds, ctx.z);
86
+ if (result == null)
87
+ continue;
88
+ compositions.push(...result);
89
+ }
90
+ // Load all the tiff tiles and resize/them into the correct locations
91
+ req.timer.start('compose:overlay');
92
+ const overlays = (await Promise.all(compositions.map((comp) => TilerSharp.composeTileTiff(comp, DefaultResizeKernel))).then((items) => items.filter((f) => f != null)));
93
+ req.timer.end('compose:overlay');
94
+ // Create the output image and render all the individual pieces into them
95
+ const img = getBaseImage(ctx.tileSet.background);
96
+ img.composite(overlays);
97
+ req.timer.start('compose:compress');
98
+ const buf = await TilerSharp.toImage(ctx.outputFormat, img);
99
+ req.timer.end('compose:compress');
100
+ req.set('layersUsed', overlays.length);
101
+ req.set('bytes', buf.byteLength);
102
+ const response = new LambdaHttpResponse(200, 'ok');
103
+ response.header(HttpHeader.ETag, cacheKey);
104
+ response.header(HttpHeader.CacheControl, 'public, max-age=604800, stale-while-revalidate=86400');
105
+ response.buffer(buf, 'image/' + ctx.outputFormat);
106
+ const shortLocation = [ctx.location.lon.toFixed(7), ctx.location.lat.toFixed(7)].join('_');
107
+ const suggestedFileName = `preview_${ctx.tileSet.name}_z${ctx.z}_${shortLocation}.${ctx.outputFormat}`;
108
+ response.header('Content-Disposition', `inline; filename=\"${suggestedFileName}\"`);
109
+ return response;
110
+ }
111
+ function getBaseImage(bg) {
112
+ if (bg == null || bg.alpha === 0) {
113
+ const buf = createCheckerBoard({
114
+ width: PreviewSize.width,
115
+ height: PreviewSize.height,
116
+ colors: { fill: PreviewBackgroundFillColor, background: 0xff },
117
+ size: PreviewBackgroundSizePx,
118
+ });
119
+ return sharp(buf.buffer, { raw: buf.raw });
120
+ }
121
+ return TilerSharp.createImage(bg);
122
+ }
123
+ /** Create a chess/checkerboard background alternating between two colors */
124
+ function createCheckerBoard(ctx) {
125
+ const { width, height, size } = ctx;
126
+ const fillColor = ctx.colors.fill;
127
+ // Create a one band image, which starts off as full white
128
+ const buf = Buffer.alloc(height * width, ctx.colors.background); // 1 band grey buffer;
129
+ // Number of squares to make in x/y directions
130
+ const tileY = height / size;
131
+ const tileX = width / size;
132
+ // Fill in a square at the x/y pixel offsets
133
+ function fillSquare(xOffset, yOffset) {
134
+ for (let y = 0; y < size; y++) {
135
+ const yPx = (yOffset + y) * width;
136
+ for (let x = 0; x < size; x++) {
137
+ const px = yPx + xOffset + x;
138
+ // Actually set the color
139
+ buf[px] = fillColor;
140
+ }
141
+ }
142
+ }
143
+ for (let tX = 0; tX < tileX; tX++) {
144
+ for (let tY = 0; tY < tileY; tY++) {
145
+ const yOffset = tY * size;
146
+ const y2 = tY % 2;
147
+ // Draw every second tile alternating on rows
148
+ const x2 = tX % 2;
149
+ if (x2 === 0 && y2 === 1)
150
+ continue;
151
+ if (x2 === 1 && y2 === 0)
152
+ continue;
153
+ const xOffset = tX * size;
154
+ fillSquare(xOffset, yOffset);
155
+ }
156
+ }
157
+ return { buffer: buf, raw: { width, height, channels: 1 } };
158
+ }
159
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/routes/preview.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ConfigTileSetRaster } from '@basemaps/config';
2
+ import { Bounds, TileMatrixSet } from '@basemaps/geo';
2
3
  import { TileMakerSharp } from '@basemaps/tiler-sharp';
3
4
  import { CogTiff } from '@cogeotiff/core';
4
5
  import { Cotar } from '@cotar/core';
@@ -6,8 +7,22 @@ import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
6
7
  import { TileXyz } from '../util/validate.js';
7
8
  export declare function getTiffName(name: string): string;
8
9
  export type CloudArchive = CogTiff | Cotar;
10
+ /** Check to see if a cloud archive is a Tiff or a Cotar */
11
+ export declare function isArchiveTiff(x: CloudArchive): x is CogTiff;
9
12
  export declare const TileComposer: TileMakerSharp;
13
+ export declare const DefaultResizeKernel: {
14
+ readonly in: "lanczos3";
15
+ readonly out: "lanczos3";
16
+ };
17
+ export declare const DefaultBackground: {
18
+ r: number;
19
+ g: number;
20
+ b: number;
21
+ alpha: number;
22
+ };
10
23
  export declare const TileXyzRaster: {
24
+ getAssetsForBounds(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, tileMatrix: TileMatrixSet, bounds: Bounds, zoom: number, ignoreOverview?: boolean): Promise<string[]>;
25
+ loadAssets(req: LambdaHttpRequest, assets: string[]): Promise<CloudArchive[]>;
11
26
  getAssetsForTile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<string[]>;
12
27
  tile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<LambdaHttpResponse>;
13
28
  };