@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.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/build/bin.d.ts +1 -0
- package/build/bin.js +16 -0
- package/build/bin.js.map +1 -0
- package/build/cogify/__test__/covering.test.d.ts +1 -0
- package/build/cogify/__test__/covering.test.js +64 -0
- package/build/cogify/__test__/covering.test.js.map +1 -0
- package/build/cogify/__test__/extract.test.d.ts +1 -0
- package/build/cogify/__test__/extract.test.js +34 -0
- package/build/cogify/__test__/extract.test.js.map +1 -0
- package/build/cogify/cli/__test__/cli.cover.test.d.ts +1 -0
- package/build/cogify/cli/__test__/cli.cover.test.js +48 -0
- package/build/cogify/cli/__test__/cli.cover.test.js.map +1 -0
- package/build/cogify/cli/__test__/cli.topo.test.d.ts +1 -0
- package/build/cogify/cli/__test__/cli.topo.test.js +53 -0
- package/build/cogify/cli/__test__/cli.topo.test.js.map +1 -0
- package/build/cogify/cli/cli.cog.d.ts +55 -0
- package/build/cogify/cli/cli.cog.js +353 -0
- package/build/cogify/cli/cli.cog.js.map +1 -0
- package/build/cogify/cli/cli.cover.d.ts +30 -0
- package/build/cogify/cli/cli.cover.js +157 -0
- package/build/cogify/cli/cli.cover.js.map +1 -0
- package/build/cogify/cli/cli.topo.d.ts +50 -0
- package/build/cogify/cli/cli.topo.js +169 -0
- package/build/cogify/cli/cli.topo.js.map +1 -0
- package/build/cogify/cli/cli.validate.d.ts +15 -0
- package/build/cogify/cli/cli.validate.js +30 -0
- package/build/cogify/cli/cli.validate.js.map +1 -0
- package/build/cogify/cli.d.ts +121 -0
- package/build/cogify/cli.js +15 -0
- package/build/cogify/cli.js.map +1 -0
- package/build/cogify/covering/covering.d.ts +28 -0
- package/build/cogify/covering/covering.js +126 -0
- package/build/cogify/covering/covering.js.map +1 -0
- package/build/cogify/covering/cutline.d.ts +29 -0
- package/build/cogify/covering/cutline.js +109 -0
- package/build/cogify/covering/cutline.js.map +1 -0
- package/build/cogify/covering/tile.cover.d.ts +38 -0
- package/build/cogify/covering/tile.cover.js +198 -0
- package/build/cogify/covering/tile.cover.js.map +1 -0
- package/build/cogify/gdal/gdal.command.d.ts +27 -0
- package/build/cogify/gdal/gdal.command.js +175 -0
- package/build/cogify/gdal/gdal.command.js.map +1 -0
- package/build/cogify/gdal/gdal.runner.d.ts +42 -0
- package/build/cogify/gdal/gdal.runner.js +194 -0
- package/build/cogify/gdal/gdal.runner.js.map +1 -0
- package/build/cogify/stac.d.ts +138 -0
- package/build/cogify/stac.js +25 -0
- package/build/cogify/stac.js.map +1 -0
- package/build/cogify/topo/extract.d.ts +82 -0
- package/build/cogify/topo/extract.js +195 -0
- package/build/cogify/topo/extract.js.map +1 -0
- package/build/cogify/topo/slug.d.ts +10 -0
- package/build/cogify/topo/slug.js +18 -0
- package/build/cogify/topo/slug.js.map +1 -0
- package/build/cogify/topo/stac.creation.d.ts +47 -0
- package/build/cogify/topo/stac.creation.js +171 -0
- package/build/cogify/topo/stac.creation.js.map +1 -0
- package/build/download.d.ts +57 -0
- package/build/download.js +144 -0
- package/build/download.js.map +1 -0
- package/build/hash.stream.d.ts +20 -0
- package/build/hash.stream.js +62 -0
- package/build/hash.stream.js.map +1 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +2 -0
- package/build/index.js.map +1 -0
- package/build/preset.d.ts +15 -0
- package/build/preset.js +66 -0
- package/build/preset.js.map +1 -0
- package/dist/index.cjs +85880 -0
- 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>;
|