@basemaps/cli-raster 8.0.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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/build/bin.d.ts +1 -0
  4. package/build/bin.js +16 -0
  5. package/build/bin.js.map +1 -0
  6. package/build/cogify/__test__/covering.test.d.ts +1 -0
  7. package/build/cogify/__test__/covering.test.js +64 -0
  8. package/build/cogify/__test__/covering.test.js.map +1 -0
  9. package/build/cogify/__test__/extract.test.d.ts +1 -0
  10. package/build/cogify/__test__/extract.test.js +34 -0
  11. package/build/cogify/__test__/extract.test.js.map +1 -0
  12. package/build/cogify/cli/__test__/cli.cover.test.d.ts +1 -0
  13. package/build/cogify/cli/__test__/cli.cover.test.js +48 -0
  14. package/build/cogify/cli/__test__/cli.cover.test.js.map +1 -0
  15. package/build/cogify/cli/__test__/cli.topo.test.d.ts +1 -0
  16. package/build/cogify/cli/__test__/cli.topo.test.js +53 -0
  17. package/build/cogify/cli/__test__/cli.topo.test.js.map +1 -0
  18. package/build/cogify/cli/cli.cog.d.ts +55 -0
  19. package/build/cogify/cli/cli.cog.js +353 -0
  20. package/build/cogify/cli/cli.cog.js.map +1 -0
  21. package/build/cogify/cli/cli.cover.d.ts +30 -0
  22. package/build/cogify/cli/cli.cover.js +157 -0
  23. package/build/cogify/cli/cli.cover.js.map +1 -0
  24. package/build/cogify/cli/cli.topo.d.ts +50 -0
  25. package/build/cogify/cli/cli.topo.js +169 -0
  26. package/build/cogify/cli/cli.topo.js.map +1 -0
  27. package/build/cogify/cli/cli.validate.d.ts +15 -0
  28. package/build/cogify/cli/cli.validate.js +30 -0
  29. package/build/cogify/cli/cli.validate.js.map +1 -0
  30. package/build/cogify/cli.d.ts +121 -0
  31. package/build/cogify/cli.js +15 -0
  32. package/build/cogify/cli.js.map +1 -0
  33. package/build/cogify/covering/covering.d.ts +28 -0
  34. package/build/cogify/covering/covering.js +126 -0
  35. package/build/cogify/covering/covering.js.map +1 -0
  36. package/build/cogify/covering/cutline.d.ts +29 -0
  37. package/build/cogify/covering/cutline.js +109 -0
  38. package/build/cogify/covering/cutline.js.map +1 -0
  39. package/build/cogify/covering/tile.cover.d.ts +38 -0
  40. package/build/cogify/covering/tile.cover.js +198 -0
  41. package/build/cogify/covering/tile.cover.js.map +1 -0
  42. package/build/cogify/gdal/gdal.command.d.ts +27 -0
  43. package/build/cogify/gdal/gdal.command.js +175 -0
  44. package/build/cogify/gdal/gdal.command.js.map +1 -0
  45. package/build/cogify/gdal/gdal.runner.d.ts +42 -0
  46. package/build/cogify/gdal/gdal.runner.js +194 -0
  47. package/build/cogify/gdal/gdal.runner.js.map +1 -0
  48. package/build/cogify/stac.d.ts +138 -0
  49. package/build/cogify/stac.js +25 -0
  50. package/build/cogify/stac.js.map +1 -0
  51. package/build/cogify/topo/extract.d.ts +82 -0
  52. package/build/cogify/topo/extract.js +195 -0
  53. package/build/cogify/topo/extract.js.map +1 -0
  54. package/build/cogify/topo/slug.d.ts +10 -0
  55. package/build/cogify/topo/slug.js +18 -0
  56. package/build/cogify/topo/slug.js.map +1 -0
  57. package/build/cogify/topo/stac.creation.d.ts +47 -0
  58. package/build/cogify/topo/stac.creation.js +171 -0
  59. package/build/cogify/topo/stac.creation.js.map +1 -0
  60. package/build/download.d.ts +57 -0
  61. package/build/download.js +144 -0
  62. package/build/download.js.map +1 -0
  63. package/build/hash.stream.d.ts +20 -0
  64. package/build/hash.stream.js +62 -0
  65. package/build/hash.stream.js.map +1 -0
  66. package/build/index.d.ts +1 -0
  67. package/build/index.js +2 -0
  68. package/build/index.js.map +1 -0
  69. package/build/preset.d.ts +15 -0
  70. package/build/preset.js +66 -0
  71. package/build/preset.js.map +1 -0
  72. package/dist/index.cjs +85880 -0
  73. package/package.json +61 -0
@@ -0,0 +1,353 @@
1
+ import { isEmptyTiff } from '@basemaps/config-loader';
2
+ import { Projection, ProjectionLoader, TileId, TileMatrixSets } from '@basemaps/geo';
3
+ import { fsa, stringToUrlFolder, Tiff } from '@basemaps/shared';
4
+ import { getLogger, logArguments, Url, UrlArrayJsonFile } from '@basemaps/shared';
5
+ import { CliId, CliInfo } from '@basemaps/shared/build/cli/info.js';
6
+ import { Metrics } from '@linzjs/metrics';
7
+ import { command, flag, number, option, optional, restPositionals } from 'cmd-ts';
8
+ import { mkdir, rm } from 'fs/promises';
9
+ import { tmpdir } from 'os';
10
+ import pLimit from 'p-limit';
11
+ import path from 'path';
12
+ import { pathToFileURL } from 'url';
13
+ import { SourceDownloader } from '../../download.js';
14
+ import { HashTransform } from '../../hash.stream.js';
15
+ import { CutlineOptimizer } from '../covering/cutline.js';
16
+ import { gdalBuildCog, gdalBuildTopoRasterCommands, gdalBuildVrt, gdalBuildVrtWarp, gdalCreate, } from '../gdal/gdal.command.js';
17
+ import { GdalRunner } from '../gdal/gdal.runner.js';
18
+ import { getCutline, getSources, isTopoStacItem } from '../stac.js';
19
+ const Collections = new Map();
20
+ async function loadItem(url, logger) {
21
+ const item = await fsa.readJson(url);
22
+ if (item.stac_version !== '1.0.0' || item.type !== 'Feature') {
23
+ logger.warn({ path: url }, 'Cog:Skip:NotStacItem');
24
+ return null;
25
+ }
26
+ const collectionLink = item.links.find((f) => f.rel === 'collection');
27
+ if (collectionLink == null)
28
+ throw new Error(`Unable to find collection for ${url.href}`);
29
+ const collectionPath = new URL(collectionLink.href, url);
30
+ const collectionPathHref = collectionPath.href;
31
+ const collectionFetch = Collections.get(collectionPathHref) ?? fsa.readJson(collectionPath);
32
+ Collections.set(collectionPathHref, collectionFetch);
33
+ const collection = await collectionFetch;
34
+ if (collection.stac_version !== '1.0.0') {
35
+ throw new Error(`Invalid Collection JSON: ${item.id} stac version number mismatch ${String(collection.stac_version)}`);
36
+ }
37
+ return { url: url, item, collection };
38
+ }
39
+ export const BasemapsCogifyCreateCommand = command({
40
+ name: 'cogify-create',
41
+ version: CliInfo.version,
42
+ description: 'Create a COG from a covering configuration',
43
+ args: {
44
+ ...logArguments,
45
+ path: restPositionals({ type: Url, displayName: 'path', description: 'Path to covering configuration' }),
46
+ force: flag({ long: 'force', description: 'Overwrite existing tiff files' }),
47
+ concurrency: option({
48
+ type: number,
49
+ long: 'concurrency',
50
+ description: 'Number of COGS to process at the same type',
51
+ defaultValue: () => 4,
52
+ defaultValueIsSerializable: true,
53
+ }),
54
+ docker: flag({ long: 'docker', description: 'Run GDAL inside docker container' }),
55
+ fromFile: option({
56
+ type: optional(UrlArrayJsonFile),
57
+ long: 'from-file',
58
+ description: 'Path to JSON file containing array of paths to covering configurations. ' +
59
+ 'File must be an array of objects with key "path" and value of a path to a covering configuration.',
60
+ }),
61
+ },
62
+ async handler(args) {
63
+ const metrics = new Metrics();
64
+ const logger = getLogger(this, args, 'cli-raster');
65
+ if (args.docker)
66
+ process.env['GDAL_DOCKER'] = '1';
67
+ const paths = args.fromFile != null ? args.path.concat(args.fromFile) : args.path;
68
+ const toCreate = await Promise.all(paths.map(async (p) => loadItem(p, logger)));
69
+ // // Filter out any missing items, also excluding items which already have COGs created
70
+ const filtered = toCreate.filter((f) => {
71
+ if (f == null)
72
+ return false;
73
+ const invalidReason = f.item.properties['linz_basemaps:generated'].invalid;
74
+ const cogAsset = f.item.assets['cog'];
75
+ if (cogAsset == null && invalidReason == null)
76
+ return true;
77
+ // Force overwrite existing COGs
78
+ if (args.force) {
79
+ logger.warn({ item: f.item.id, asset: cogAsset?.href }, 'Cog:Create:Overwrite');
80
+ return true;
81
+ }
82
+ // The cog was already created but deemed invalid
83
+ if (invalidReason) {
84
+ logger.warn({ item: f.item.id, asset: cogAsset?.href, reason: invalidReason }, 'Cog:Create:Exists:invalid');
85
+ return false;
86
+ }
87
+ logger.info({ item: f.item.id, asset: cogAsset?.href }, 'Cog:Create:Exists');
88
+ return false;
89
+ });
90
+ // No items left to be created
91
+ if (filtered.length === 0) {
92
+ logger.info({ toCreate: filtered.length }, 'Cog:Create:Done');
93
+ return;
94
+ }
95
+ const tmpFolder = stringToUrlFolder(path.join(tmpdir(), CliId));
96
+ // Get list of unique source files needed for all files
97
+ const sources = new SourceDownloader(tmpFolder);
98
+ for (const i of filtered) {
99
+ const files = getSources(i.item.links);
100
+ for (const src of files)
101
+ sources.register(new URL(src.href, i.url), i.item.id);
102
+ }
103
+ // Check that we have read access to all the hosts that have files that we need
104
+ // This prevents us assuming a multiple roles when file are attempted to download
105
+ await Promise.all([...sources.hosts].map(async ([hostName, url]) => {
106
+ logger.debug({ hostName }, 'Cog:Create:ValidateAccess');
107
+ await fsa.head(url);
108
+ logger.info({ hostName, url }, 'Cog:Create:ValidateAccess:Ok');
109
+ }));
110
+ const gdalVersion = await new GdalRunner({
111
+ command: 'gdal_translate',
112
+ args: ['--version'],
113
+ output: pathToFileURL('.'),
114
+ }).run();
115
+ /** Limit the creation of COGs to concurrency at the same time */
116
+ const Q = pLimit(args.concurrency);
117
+ try {
118
+ await mkdir(tmpFolder, { recursive: true });
119
+ const promises = filtered.map(async (f) => {
120
+ const { item, url } = f;
121
+ const cutlineLink = getCutline(item.links);
122
+ const options = item.properties['linz_basemaps:options'];
123
+ const tileId = isTopoStacItem(item) ? item.id : TileId.fromTile(options.tile);
124
+ // Location to where the tiff should be stored
125
+ const tiffPath = new URL(tileId + '.tiff', url);
126
+ const itemStacPath = new URL(tileId + '.json', url);
127
+ const tileMatrix = TileMatrixSets.find(options.tileMatrix);
128
+ if (tileMatrix == null)
129
+ throw new Error('Failed to find tileMatrix: ' + options.tileMatrix);
130
+ const sourceFiles = getSources(item.links);
131
+ // Skip creating the COG if the item STAC contains no source tiffs
132
+ if (sourceFiles.length === 0) {
133
+ logger.error({ stacPath: itemStacPath, target: tiffPath }, 'Cog:NoSourceFiles');
134
+ return;
135
+ }
136
+ // Create the tiff concurrently
137
+ const outputTiffPath = await Q(async () => {
138
+ metrics.start(tileId); // Only start the timer when the cog is actually being processed
139
+ // Download all tiff files needed for the processing
140
+ const sourceLocations = await Promise.all(sourceFiles.map((link) => sources.get(new URL(link.href, url), logger)));
141
+ const cutline = await CutlineOptimizer.loadFromLink(cutlineLink, tileMatrix);
142
+ if (isTopoStacItem(item)) {
143
+ if (sourceFiles.length !== 1) {
144
+ throw new Error('Topo MapSheet procesing is limited to one input file, found: ' + sourceLocations.length);
145
+ }
146
+ const width = sourceFiles[0]['linz_basemaps:source_width'];
147
+ const height = sourceFiles[0]['linz_basemaps:source_height'];
148
+ return createTopoCog({
149
+ tileId,
150
+ options,
151
+ tempFolder: tmpFolder,
152
+ sourceFiles: sourceLocations,
153
+ cutline,
154
+ size: { width, height },
155
+ logger,
156
+ });
157
+ }
158
+ return createCog({
159
+ tileId,
160
+ options,
161
+ tempFolder: tmpFolder,
162
+ sourceFiles: sourceLocations,
163
+ cutline,
164
+ logger,
165
+ });
166
+ });
167
+ // Cleanup any source files used in the COG creation
168
+ logger.debug({ files: sourceFiles.length }, 'Cog:Cleanup');
169
+ const deleted = await Promise.all(sourceFiles.map(async (f) => {
170
+ const sourceLocation = new URL(f.href, url);
171
+ const asset = sources.items.get(sourceLocation.href);
172
+ await sources.done(sourceLocation, item.id, logger);
173
+ // Update the STAC Document with the checksum and file size of the files used to create this asset
174
+ if (asset == null || asset.size == null || asset.hash == null)
175
+ return;
176
+ const link = item.links.find((link) => new URL(link.href, url).href === asset.url.href);
177
+ if (link == null)
178
+ return;
179
+ // Checksum differs in the STAC document to what was downloaded
180
+ if (link['file:checksum'] && link['file:checksum'] !== asset.hash) {
181
+ logger.warn({ path: f.href, linkHash: link['file:checksum'], assetHash: asset.hash }, 'FileHash:Mismatch');
182
+ }
183
+ link['file:checksum'] = asset.hash;
184
+ if (link['file:size'] && link['file:size'] !== asset.size) {
185
+ logger.warn({ path: f.href, linkSize: link['file:size'], assetSize: asset.size }, 'FileSize:Mismatch');
186
+ }
187
+ link['file:size'] = asset.size;
188
+ }));
189
+ logger.info({ files: sourceFiles.length, deleted: deleted.filter(Boolean).length }, 'Cog:Cleanup:Done');
190
+ const asset = {
191
+ href: `./${tileId}.tiff`,
192
+ type: 'image/tiff; application=geotiff; profile=cloud-optimized',
193
+ roles: ['data'],
194
+ };
195
+ // Update the item to have
196
+ item.assets['cog'] = asset;
197
+ item.properties['linz_basemaps:generated']['gdal'] = gdalVersion.stdout;
198
+ const cogStat = await fsa.head(outputTiffPath);
199
+ if (await isEmptyTiff(outputTiffPath)) {
200
+ // Empty tiff created, remove it from the stac
201
+ logger.warn({ tileId, tiffPath }, 'Cog:Empty');
202
+ delete item.assets['cog'];
203
+ item.properties['linz_basemaps:generated'].invalid = 'empty';
204
+ }
205
+ else {
206
+ metrics.start(`${tileId}:write`);
207
+ // Upload the output COG into the target location
208
+ const readStream = fsa.readStream(outputTiffPath).pipe(new HashTransform('sha256'));
209
+ await fsa.write(tiffPath, readStream);
210
+ await validateOutputTiff(tiffPath, tileMatrix, logger);
211
+ asset['file:checksum'] = readStream.multihash;
212
+ asset['file:size'] = readStream.size;
213
+ if (readStream.size !== cogStat?.size) {
214
+ logger.warn({ readStream: readStream.size, stat: cogStat?.size }, 'SizeMismatch');
215
+ }
216
+ logger.debug({
217
+ target: tiffPath,
218
+ hash: asset['file:checksum'],
219
+ size: asset['file:size'],
220
+ duration: metrics.end(`${tileId}:write`),
221
+ }, 'Cog:Create:Write');
222
+ }
223
+ // Write the STAC metadata
224
+ await fsa.write(itemStacPath, JSON.stringify(item, null, 2));
225
+ logger.info({ tileId, tiffPath, duration: metrics.end(tileId) }, 'Cog:Create:Done');
226
+ });
227
+ await Promise.all(promises);
228
+ }
229
+ catch (err) {
230
+ logger.error({ err }, 'Cog:Create:Failed');
231
+ throw err;
232
+ }
233
+ finally {
234
+ // Cleanup the temporary folder once everything is done
235
+ logger.info({ path: tmpFolder }, 'Cog:Cleanup');
236
+ await rm(tmpFolder, { recursive: true, force: true });
237
+ }
238
+ logger.info({
239
+ count: toCreate.length,
240
+ created: filtered.length,
241
+ files: filtered.map((f) => {
242
+ return isTopoStacItem(f.item) ? f.item.id : TileId.fromTile(f.item.properties['linz_basemaps:options'].tile);
243
+ }),
244
+ }, 'Cog:Done');
245
+ },
246
+ });
247
+ /** Create a generic COG from the creation options */
248
+ async function createCog(ctx) {
249
+ const options = ctx.options;
250
+ await ProjectionLoader.load(options.sourceEpsg);
251
+ const tileId = ctx.tileId;
252
+ const logger = ctx.logger?.child({ tileId });
253
+ logger?.info({ tileId }, 'Cog:Create');
254
+ const tileMatrix = TileMatrixSets.find(options.tileMatrix);
255
+ if (tileMatrix == null)
256
+ throw new Error('Failed to find tile matrix: ' + options.tileMatrix);
257
+ logger?.debug({ tileId }, 'Cog:Create:VrtSource');
258
+ // Create the vrt of all the source files
259
+ const vrtSourceCommand = gdalBuildVrt(new URL(`${tileId}-source.vrt`, ctx.tempFolder), ctx.sourceFiles);
260
+ await new GdalRunner(vrtSourceCommand).run(logger);
261
+ logger?.debug({ tileId }, 'Cog:Create:VrtWarp');
262
+ const cutlineProperties = { url: null, blend: ctx.cutline.blend };
263
+ if (ctx.cutline) {
264
+ logger?.debug('Cog:Cutline');
265
+ const optimizedCutline = ctx.cutline.optimize(options.tile);
266
+ if (optimizedCutline) {
267
+ cutlineProperties.url = new URL(`${tileId}-cutline.geojson`, ctx.tempFolder);
268
+ await fsa.write(cutlineProperties.url, JSON.stringify(optimizedCutline));
269
+ logger?.info({ source: ctx.cutline.path, optimized: cutlineProperties.url }, 'Cog:Cutline');
270
+ }
271
+ else {
272
+ logger?.info('Cog:Cutline:Skipped');
273
+ }
274
+ }
275
+ // warp the source VRT into the output parameters
276
+ const vrtWarpCommand = gdalBuildVrtWarp(new URL(`${tileId}-${options.tileMatrix}-warp.vrt`, ctx.tempFolder), vrtSourceCommand.output, options.sourceEpsg, cutlineProperties, options);
277
+ await new GdalRunner(vrtWarpCommand).run(logger);
278
+ if (options.background == null) {
279
+ // Create the COG from the warped vrt without a forced background
280
+ const cogCreateCommand = gdalBuildCog(new URL(`${tileId}.tiff`, ctx.tempFolder), vrtWarpCommand.output, options);
281
+ await new GdalRunner(cogCreateCommand).run(logger);
282
+ return cogCreateCommand.output;
283
+ }
284
+ // Create a colored background tiff to fill the empty space in the target cog
285
+ const gdalCreateCommand = gdalCreate(new URL(`${tileId}-bg.tiff`, ctx.tempFolder), options.background, options);
286
+ await new GdalRunner(gdalCreateCommand).run(logger);
287
+ // Create a vrt with the background tiff behind the source file vrt
288
+ const vrtMergeCommand = gdalBuildVrt(new URL(`${tileId}-merged.vrt`, ctx.tempFolder), [
289
+ gdalCreateCommand.output,
290
+ vrtWarpCommand.output,
291
+ ]);
292
+ await new GdalRunner(vrtMergeCommand).run(logger);
293
+ // Create the COG from the merged vrt with a forced background
294
+ const cogCreateCommand = gdalBuildCog(new URL(`${tileId}.tiff`, ctx.tempFolder), vrtMergeCommand.output, options);
295
+ await new GdalRunner(cogCreateCommand).run(logger);
296
+ return cogCreateCommand.output;
297
+ }
298
+ /** Create a COG specific to LINZ's Topographic 50k and 250k map series from the creation options */
299
+ async function createTopoCog(ctx) {
300
+ const options = ctx.options;
301
+ await ProjectionLoader.load(options.sourceEpsg);
302
+ const tileId = ctx.tileId;
303
+ const logger = ctx.logger?.child({ tileId });
304
+ logger?.debug({ tileId }, 'TopoCog:Create:VrtSource');
305
+ // Create the vrt of all the source files
306
+ const vrtSourceCommand = gdalBuildVrt(new URL(`${tileId}-source.vrt`, ctx.tempFolder), ctx.sourceFiles, true);
307
+ await new GdalRunner(vrtSourceCommand).run(logger);
308
+ // Create the COG from the vrt file
309
+ if (ctx.size == null)
310
+ throw new Error('TopoCog: Source image size is required for pixel trim');
311
+ const cogCreateCommand = gdalBuildTopoRasterCommands(new URL(`${tileId}.tiff`, ctx.tempFolder), vrtSourceCommand.output, options, ctx.size?.width, ctx.size?.height);
312
+ await new GdalRunner(cogCreateCommand).run(logger);
313
+ return cogCreateCommand.output;
314
+ }
315
+ /**
316
+ * Very basic checking for the output tiff to ensure it was uploaded ok
317
+ * Just open it as a COG and ensure the metadata looks about right
318
+ */
319
+ export async function validateOutputTiff(url, tileMatrix, logger) {
320
+ logger.info({ url }, 'Cog:Validate');
321
+ try {
322
+ const tiff = await Tiff.create(fsa.source(url));
323
+ const tms = tileMatrix ?? TileMatrixSets.tryGet(tiff.images[0].epsg);
324
+ if (tms == null)
325
+ throw new Error('Unknown EPSG');
326
+ const tiffStats = tiff.images.map((t) => {
327
+ // all internal images should be approximately aligned to a tile matrix
328
+ const resolution = t.resolution[0];
329
+ const closestZoom = Projection.getTiffResZoom(tms, resolution);
330
+ const zoomScale = tms.pixelScale(closestZoom);
331
+ const zoomDiff = Math.abs(zoomScale - resolution);
332
+ const obj = {
333
+ id: t.id,
334
+ ...t.size,
335
+ tiles: t.tileCount,
336
+ resolution,
337
+ zResolution: zoomScale,
338
+ z: closestZoom,
339
+ isResolutionOk: zoomDiff < 1e-8,
340
+ };
341
+ logger.debug({ url, imageStats: obj }, 'Cog:Validate:Image');
342
+ return obj;
343
+ });
344
+ logger.info({ url }, 'Cog:Validate:Ok');
345
+ logger.info({ url, tiffStats }, 'Cog:Validate:Stats');
346
+ await tiff.source.close?.();
347
+ }
348
+ catch (err) {
349
+ logger.error({ url, err }, 'Cog:ValidateFailed');
350
+ throw err;
351
+ }
352
+ }
353
+ //# sourceMappingURL=cli.cog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.cog.js","sourceRoot":"","sources":["../../../src/cogify/cli/cli.cog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export declare function gsdToMeter(gsd: number): number;
2
+ export declare const BasemapsCogifyCoverCommand: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
3
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<{
4
+ target: URL;
5
+ cutline: URL | undefined;
6
+ cutlineBlend: number;
7
+ paths: URL[];
8
+ preset: string;
9
+ tileMatrix: string;
10
+ baseZoomOffset: number | undefined;
11
+ requireStacCollection: boolean;
12
+ background: import("@basemaps/config").Rgba | undefined;
13
+ verbose: boolean;
14
+ extraVerbose: boolean;
15
+ }>>;
16
+ } & import("cmd-ts/dist/cjs/helpdoc.js").PrintHelp & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/helpdoc.js").Named & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned> & import("cmd-ts/dist/cjs/argparser.js").Register & import("cmd-ts/dist/cjs/runner.js").Handling<{
17
+ target: URL;
18
+ cutline: URL | undefined;
19
+ cutlineBlend: number;
20
+ paths: URL[];
21
+ preset: string;
22
+ tileMatrix: string;
23
+ baseZoomOffset: number | undefined;
24
+ requireStacCollection: boolean;
25
+ background: import("@basemaps/config").Rgba | undefined;
26
+ verbose: boolean;
27
+ extraVerbose: boolean;
28
+ }, Promise<void>> & {
29
+ run(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<Promise<void>>>;
30
+ } & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned & import("cmd-ts/dist/cjs/helpdoc.js").Descriptive & import("cmd-ts/dist/cjs/helpdoc.js").Aliased>;
@@ -0,0 +1,157 @@
1
+ import { ConfigProviderMemory } from '@basemaps/config';
2
+ import { initConfigFromUrls } from '@basemaps/config-loader';
3
+ import { GoogleTms, Nztm2000QuadTms, TileId } from '@basemaps/geo';
4
+ import { fsa, urlToString } from '@basemaps/shared';
5
+ import { getLogger, isArgo, logArguments, RgbaType, Url, UrlFolder } from '@basemaps/shared';
6
+ import { CliId, CliInfo } from '@basemaps/shared/build/cli/info.js';
7
+ import { Metrics } from '@linzjs/metrics';
8
+ import { command, flag, number, oneOf, option, optional, restPositionals, string } from 'cmd-ts';
9
+ import { Presets } from '../../preset.js';
10
+ import { CutlineOptimizer } from '../covering/cutline.js';
11
+ import { createTileCover } from '../covering/tile.cover.js';
12
+ import { createFileStats } from '../stac.js';
13
+ const SupportedTileMatrix = [GoogleTms, Nztm2000QuadTms];
14
+ // Round gsd to 3 decimals without trailing zero, or integer if larger than 1
15
+ export function gsdToMeter(gsd) {
16
+ if (gsd > 1)
17
+ return Math.round(gsd);
18
+ if (gsd < 0.001)
19
+ return 0.001;
20
+ return parseFloat(gsd.toFixed(3));
21
+ }
22
+ export const BasemapsCogifyCoverCommand = command({
23
+ name: 'cogify-cover',
24
+ version: CliInfo.version,
25
+ description: 'Create a covering configuration from a collection from source imagery',
26
+ args: {
27
+ ...logArguments,
28
+ target: option({ type: UrlFolder, long: 'target', description: 'Where to write the configuration' }),
29
+ cutline: option({ type: optional(Url), long: 'cutline', description: 'Cutline to cut tiffs' }),
30
+ cutlineBlend: option({
31
+ type: number,
32
+ long: 'cutline-blend',
33
+ description: 'Cutline blend amount see GDAL_TRANSLATE -cblend',
34
+ defaultValue: () => 20,
35
+ }),
36
+ paths: restPositionals({ type: UrlFolder, displayName: 'path', description: 'Path to source imagery' }),
37
+ preset: option({
38
+ type: oneOf(Object.keys(Presets)),
39
+ long: 'preset',
40
+ description: 'GDAL compression preset',
41
+ defaultValue: () => 'webp',
42
+ defaultValueIsSerializable: true,
43
+ }),
44
+ tileMatrix: option({
45
+ type: string,
46
+ long: 'tile-matrix',
47
+ description: `Output TileMatrix to use [${SupportedTileMatrix.map((f) => f.identifier).join(', ')}]`,
48
+ }),
49
+ baseZoomOffset: option({
50
+ type: optional(number),
51
+ long: 'base-zoom-offset',
52
+ description: 'Adjust the base zoom level of the output COGS, "-1" reduce the target output resolution by one zoom level',
53
+ }),
54
+ requireStacCollection: flag({
55
+ long: 'require-stac-collection',
56
+ description: 'Require the source dataset to have a STAC collection.json',
57
+ defaultValue: () => false,
58
+ defaultValueIsSerializable: true,
59
+ }),
60
+ background: option({
61
+ type: optional(RgbaType),
62
+ long: 'background',
63
+ description: 'Replace all transparent COG pixels with this RGBA hexstring color',
64
+ }),
65
+ },
66
+ async handler(args) {
67
+ const metrics = new Metrics();
68
+ const logger = getLogger(this, args, 'cli-raster');
69
+ const mem = new ConfigProviderMemory();
70
+ metrics.start('imagery:load');
71
+ const cfg = await initConfigFromUrls(mem, args.paths);
72
+ const imageryLoadTime = metrics.end('imagery:load');
73
+ if (cfg.imagery.length === 0)
74
+ throw new Error('No imagery found');
75
+ const im = cfg.imagery[0];
76
+ logger.info({ files: im.files.length, title: im.title, duration: imageryLoadTime }, 'Imagery:Loaded');
77
+ if (im.collection == null && args.requireStacCollection) {
78
+ throw new Error(`No collection.json found with imagery: ${im.url.href}`);
79
+ }
80
+ const slug = im.collection?.['linz:slug'];
81
+ if (slug != null)
82
+ im.name = slug;
83
+ const tms = SupportedTileMatrix.find((f) => f.identifier.toLowerCase() === args.tileMatrix.toLowerCase());
84
+ if (tms == null)
85
+ throw new Error('--tile-matrix: ' + args.tileMatrix + ' not found');
86
+ metrics.start('cutline:load');
87
+ const cutline = await CutlineOptimizer.load(args.cutline, args.cutlineBlend, tms);
88
+ const cutlineLoadTime = metrics.end('cutline:load');
89
+ logger.info({ path: args.cutline, duration: cutlineLoadTime }, 'Cutline:Loaded');
90
+ const ctx = {
91
+ id: CliId,
92
+ imagery: im,
93
+ tileMatrix: tms,
94
+ logger,
95
+ metrics,
96
+ cutline,
97
+ preset: args.preset,
98
+ background: args.background,
99
+ targetZoomOffset: args.baseZoomOffset,
100
+ };
101
+ const res = await createTileCover(ctx);
102
+ // Find the dem/dsm prefix for the nz-elevation bucket source and update imagery name to include prefix
103
+ if (im.collection != null) {
104
+ const geoCategory = im.collection['linz:geospatial_category'];
105
+ if (geoCategory === 'dem' || geoCategory === 'dsm') {
106
+ im.name = `${im.name}_${geoCategory}_${gsdToMeter(im.gsd)}m`;
107
+ args.target = new URL('elevation/', args.target);
108
+ }
109
+ }
110
+ const targetPath = new URL(`${tms.projection.code}/${im.name}/${CliId}/`, args.target);
111
+ const sourcePath = new URL('source.geojson', targetPath);
112
+ const sourceData = JSON.stringify(res.source, null, 2);
113
+ await fsa.write(sourcePath, sourceData);
114
+ const coveringPath = new URL('covering.geojson', targetPath);
115
+ const coveringData = JSON.stringify({ type: 'FeatureCollection', features: res.items }, null, 2);
116
+ await fsa.write(coveringPath, coveringData);
117
+ res.collection.assets = res.collection.assets ?? {};
118
+ res.collection.assets['covering'] = {
119
+ title: 'GeoJSON FeatureCollection of output',
120
+ href: './covering.geojson',
121
+ ...createFileStats(coveringData),
122
+ };
123
+ res.collection.assets['source'] = {
124
+ title: 'GeoJSON FeatureCollection of all source files used',
125
+ href: './source.geojson',
126
+ ...createFileStats(sourceData),
127
+ };
128
+ const collectionPath = new URL('collection.json', targetPath);
129
+ await fsa.write(collectionPath, JSON.stringify(res.collection, null, 2));
130
+ ctx.logger?.debug({ path: collectionPath }, 'Imagery:Stac:Collection:Write');
131
+ const items = [];
132
+ const tilesByZoom = [];
133
+ for (const item of res.items) {
134
+ const tile = item.properties['linz_basemaps:options'].tile;
135
+ if (tile == null)
136
+ throw new Error('Tile not found in item');
137
+ const tileId = TileId.fromTile(tile);
138
+ const itemPath = new URL(`${tileId}.json`, targetPath);
139
+ items.push({ path: itemPath });
140
+ await fsa.write(itemPath, JSON.stringify(item, null, 2));
141
+ const z = tile.z;
142
+ tilesByZoom[z] = (tilesByZoom[z] ?? 0) + 1;
143
+ ctx.logger?.trace({ path: itemPath }, 'Imagery:Stac:Item:Write');
144
+ }
145
+ // If running in argo dump out output information to be used by further steps
146
+ if (isArgo()) {
147
+ // Where the JSON files were written to
148
+ await fsa.write(fsa.toUrl('/tmp/cogify/cover-target'), urlToString(targetPath));
149
+ // Title of the imagery
150
+ await fsa.write(fsa.toUrl('/tmp/cogify/cover-title'), ctx.imagery.title);
151
+ // List of all the tiles to be processed
152
+ await fsa.write(fsa.toUrl('/tmp/cogify/cover-items.json'), JSON.stringify(items));
153
+ }
154
+ logger.info({ tiles: res.items.length, metrics: metrics.metrics, tilesByZoom }, 'Cover:Created');
155
+ },
156
+ });
157
+ //# sourceMappingURL=cli.cover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.cover.js","sourceRoot":"","sources":["../../../src/cogify/cli/cli.cover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { LogType } from '@basemaps/shared';
2
+ export interface TopoCreationContext {
3
+ /** Only create cogs for the latest topo tiffs by map code and version */
4
+ latestOnly: boolean;
5
+ /** Source location of topo tiffs */
6
+ paths: URL[];
7
+ /** Target location for the output stac files */
8
+ target: URL;
9
+ /** Imagery title */
10
+ title: string;
11
+ /** Input topo imagery scale, topo25, topo50, or topo250*/
12
+ mapSeries: string;
13
+ /** force output if not in argo */
14
+ output?: URL;
15
+ /** Logger to trace creation */
16
+ logger: LogType;
17
+ }
18
+ export type MapSeriesNames = 'topo50' | 'topo250';
19
+ /**
20
+ * Parses a source path directory topographic maps tiffs and writes out a directory structure
21
+ * of StacItem and StacCollection files to the target path.
22
+ *
23
+ * @param source: Location of the source files
24
+ * @example s3://linz-topographic-upload/topographic/TopoReleaseArchive/NZTopo50_GeoTif_Gridless/
25
+ *
26
+ * @param target: Location of the target path
27
+ */
28
+ export declare const TopoStacCreationCommand: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
29
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<{
30
+ title: string | undefined;
31
+ target: URL;
32
+ mapSeries: string;
33
+ latestOnly: boolean;
34
+ output: URL | undefined;
35
+ paths: URL[];
36
+ verbose: boolean;
37
+ extraVerbose: boolean;
38
+ }>>;
39
+ } & import("cmd-ts/dist/cjs/helpdoc.js").PrintHelp & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/helpdoc.js").Named & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned> & import("cmd-ts/dist/cjs/argparser.js").Register & import("cmd-ts/dist/cjs/runner.js").Handling<{
40
+ title: string | undefined;
41
+ target: URL;
42
+ mapSeries: string;
43
+ latestOnly: boolean;
44
+ output: URL | undefined;
45
+ paths: URL[];
46
+ verbose: boolean;
47
+ extraVerbose: boolean;
48
+ }, Promise<void>> & {
49
+ run(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<Promise<void>>>;
50
+ } & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned & import("cmd-ts/dist/cjs/helpdoc.js").Descriptive & import("cmd-ts/dist/cjs/helpdoc.js").Aliased>;