@basemaps/cli-vector 8.1.0 → 8.3.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/build/bin.js +2 -2
- package/build/cli/cli.analyse.d.ts +34 -0
- package/build/cli/cli.analyse.js +152 -0
- package/build/cli/cli.analyse.js.map +1 -0
- package/build/cli/cli.create.d.ts +39 -0
- package/build/cli/cli.create.js +211 -0
- package/build/cli/cli.create.js.map +1 -0
- package/build/cli/cli.extract.d.ts +8 -17
- package/build/cli/cli.extract.js +43 -33
- package/build/cli/cli.extract.js.map +1 -1
- package/build/cli/cli.join.d.ts +44 -0
- package/build/cli/cli.join.js +149 -0
- package/build/cli/cli.join.js.map +1 -0
- package/build/extract.js.map +1 -0
- package/build/generalization/generalization.d.ts +10 -0
- package/build/generalization/generalization.js +168 -0
- package/build/generalization/generalization.js.map +1 -0
- package/build/generalization/simplify.d.ts +2 -0
- package/build/generalization/simplify.js +80 -0
- package/build/generalization/simplify.js.map +1 -0
- package/build/index.d.ts +83 -5
- package/build/index.js +7 -1
- package/build/index.js.map +1 -1
- package/build/modify/consts.d.ts +1 -0
- package/build/modify/consts.js +23 -0
- package/build/modify/consts.js.map +1 -0
- package/build/modify/layers/__test__/contours.test.d.ts +1 -0
- package/build/modify/layers/__test__/contours.test.js +59 -0
- package/build/modify/layers/__test__/contours.test.js.map +1 -0
- package/build/modify/layers/contours.d.ts +28 -0
- package/build/modify/layers/contours.js +90 -0
- package/build/modify/layers/contours.js.map +1 -0
- package/build/modify/layers/place_labels.d.ts +18 -0
- package/build/modify/layers/place_labels.js +117 -0
- package/build/modify/layers/place_labels.js.map +1 -0
- package/build/modify/layers/pois.d.ts +11 -0
- package/build/modify/layers/pois.js +32 -0
- package/build/modify/layers/pois.js.map +1 -0
- package/build/modify/layers/public_transport.d.ts +12 -0
- package/build/modify/layers/public_transport.js +41 -0
- package/build/modify/layers/public_transport.js.map +1 -0
- package/build/modify/layers/street_labels.d.ts +12 -0
- package/build/modify/layers/street_labels.js +34 -0
- package/build/modify/layers/street_labels.js.map +1 -0
- package/build/modify/layers/streets.d.ts +12 -0
- package/build/modify/layers/streets.js +72 -0
- package/build/modify/layers/streets.js.map +1 -0
- package/build/modify/layers/water.d.ts +13 -0
- package/build/modify/layers/water.js +82 -0
- package/build/modify/layers/water.js.map +1 -0
- package/build/modify/modify.d.ts +11 -0
- package/build/modify/modify.js +49 -0
- package/build/modify/modify.js.map +1 -0
- package/build/modify/parser.d.ts +47 -0
- package/build/modify/parser.js +24 -0
- package/build/modify/parser.js.map +1 -0
- package/build/modify/schema.d.ts +17 -0
- package/build/modify/schema.js +2 -0
- package/build/modify/schema.js.map +1 -0
- package/build/modify/shared.d.ts +7 -0
- package/build/modify/shared.js +53 -0
- package/build/modify/shared.js.map +1 -0
- package/build/schema-loader/parser.d.ts +16 -0
- package/build/schema-loader/parser.js +2 -0
- package/build/schema-loader/parser.js.map +1 -1
- package/build/schema-loader/schema.d.ts +21 -5
- package/build/schema-loader/schema.loader.d.ts +3 -1
- package/build/schema-loader/schema.loader.js +18 -6
- package/build/schema-loader/schema.loader.js.map +1 -1
- package/build/stac.d.ts +41 -0
- package/build/stac.js +185 -0
- package/build/stac.js.map +1 -0
- package/build/transform/covt.d.ts +5 -0
- package/build/transform/covt.js +23 -0
- package/build/transform/covt.js.map +1 -0
- package/build/transform/mbtiles.to.ttiles.d.ts +14 -0
- package/build/transform/mbtiles.to.ttiles.js +60 -0
- package/build/transform/mbtiles.to.ttiles.js.map +1 -0
- package/build/transform/nztm.d.ts +4 -0
- package/build/transform/nztm.js +13 -0
- package/build/transform/nztm.js.map +1 -0
- package/build/transform/ogr2ogr.d.ts +9 -0
- package/build/transform/ogr2ogr.js +43 -0
- package/build/transform/ogr2ogr.js.map +1 -0
- package/build/transform/tippecanoe.d.ts +15 -0
- package/build/transform/tippecanoe.js +69 -0
- package/build/transform/tippecanoe.js.map +1 -0
- package/build/types/VectorGeoFeature.d.ts +9 -0
- package/build/types/VectorGeoFeature.js +2 -0
- package/build/types/VectorGeoFeature.js.map +1 -0
- package/build/util.d.ts +35 -0
- package/build/util.js +43 -0
- package/build/util.js.map +1 -0
- package/dist/index.cjs +20809 -9550
- package/package.json +23 -8
- package/build/extract/extract.js.map +0 -1
- /package/build/{extract/extract.d.ts → extract.d.ts} +0 -0
- /package/build/{extract/extract.js → extract.js} +0 -0
package/build/cli/cli.extract.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { GoogleTms, Nztm2000QuadTms, TileMatrixSets } from '@basemaps/geo';
|
|
2
|
+
import { fsa, Url } from '@basemaps/shared';
|
|
1
3
|
import { CliInfo } from '@basemaps/shared/build/cli/info.js';
|
|
2
4
|
import { getLogger, logArguments } from '@basemaps/shared/build/cli/log.js';
|
|
3
|
-
import {
|
|
4
|
-
import { command, number, option, string } from 'cmd-ts';
|
|
5
|
+
import { command, oneOf, option, string } from 'cmd-ts';
|
|
5
6
|
import { SchemaLoader } from '../schema-loader/schema.loader.js';
|
|
7
|
+
import { VectorStac } from '../stac.js';
|
|
6
8
|
function pathToURLFolder(path) {
|
|
7
9
|
const url = fsa.toUrl(path);
|
|
8
10
|
url.search = '';
|
|
@@ -13,24 +15,23 @@ function pathToURLFolder(path) {
|
|
|
13
15
|
}
|
|
14
16
|
export const ExtractArgs = {
|
|
15
17
|
...logArguments,
|
|
16
|
-
|
|
17
|
-
type:
|
|
18
|
-
long: '
|
|
19
|
-
defaultValue: () => '
|
|
20
|
-
|
|
21
|
-
description: 'Path of Tiles schema json files that define the source layer and schemas',
|
|
18
|
+
schema: option({
|
|
19
|
+
type: Url,
|
|
20
|
+
long: 'schema',
|
|
21
|
+
defaultValue: () => pathToURLFolder('schema'),
|
|
22
|
+
description: 'Path of JSON schema file(s) defining the source layer and schemas. Either a directory containing such files, or a path to a single file.',
|
|
22
23
|
}),
|
|
23
24
|
cache: option({
|
|
24
25
|
type: string,
|
|
25
26
|
long: 'cache',
|
|
26
27
|
description: 'Path of cache location, could be local or s3',
|
|
27
28
|
}),
|
|
28
|
-
|
|
29
|
-
type:
|
|
30
|
-
long: '
|
|
31
|
-
|
|
29
|
+
tileMatrix: option({
|
|
30
|
+
type: oneOf([Nztm2000QuadTms.identifier, GoogleTms.identifier]),
|
|
31
|
+
long: 'tile-matrix',
|
|
32
|
+
description: `Output TileMatrix to use. Either: ${Nztm2000QuadTms.identifier}, or ${GoogleTms.identifier}.`,
|
|
33
|
+
defaultValue: () => GoogleTms.identifier,
|
|
32
34
|
defaultValueIsSerializable: true,
|
|
33
|
-
description: 'Number of layers grouped together, default to 100',
|
|
34
35
|
}),
|
|
35
36
|
};
|
|
36
37
|
export const ExtractCommand = command({
|
|
@@ -40,49 +41,58 @@ export const ExtractCommand = command({
|
|
|
40
41
|
args: ExtractArgs,
|
|
41
42
|
async handler(args) {
|
|
42
43
|
const logger = getLogger(this, args, 'cli-vector');
|
|
43
|
-
const path = pathToURLFolder(args.path);
|
|
44
44
|
const cache = pathToURLFolder(args.cache);
|
|
45
|
+
const tileMatrix = TileMatrixSets.find(args.tileMatrix);
|
|
46
|
+
if (tileMatrix == null)
|
|
47
|
+
throw new Error(`Tile matrix ${args.tileMatrix} is not supported`);
|
|
45
48
|
// Find all lds layers that need to be process
|
|
46
|
-
logger.info({
|
|
47
|
-
const schemaLoader = new SchemaLoader(
|
|
49
|
+
logger.info({ schema: args.schema }, 'Extract: Start');
|
|
50
|
+
const schemaLoader = new SchemaLoader(args.schema, tileMatrix, logger, cache);
|
|
48
51
|
const schemas = await schemaLoader.load();
|
|
49
|
-
const
|
|
52
|
+
const smallLayers = [];
|
|
53
|
+
const largeLayers = [];
|
|
50
54
|
let total = 0;
|
|
51
|
-
|
|
55
|
+
const allFiles = [];
|
|
56
|
+
const vectorStac = new VectorStac(logger);
|
|
52
57
|
for (const schema of schemas) {
|
|
53
58
|
for (const layer of schema.layers) {
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
59
|
+
if (layer.cache == null)
|
|
60
|
+
throw new Error(`Fail to prepare cache path for layer ${schema.name}:${layer.id}`);
|
|
61
|
+
allFiles.push({ path: layer.cache.path.href });
|
|
58
62
|
// Skip if the layer is already processed in cache
|
|
59
|
-
if (layer.cache
|
|
63
|
+
if (layer.cache.exists) {
|
|
60
64
|
logger.info({ layer: schema.name, id: layer.id, cache: layer.cache }, 'Extract: Exists');
|
|
61
65
|
continue;
|
|
62
66
|
}
|
|
63
|
-
//
|
|
64
|
-
logger.info({ layer: schema.name, id: layer.id }, 'Extract:
|
|
65
|
-
const
|
|
67
|
+
// Create stac file for the cache mbtiles
|
|
68
|
+
logger.info({ layer: schema.name, id: layer.id }, 'Extract: StacItem');
|
|
69
|
+
const stacFile = new URL(layer.cache.path.href.replace(/\.mbtiles$/, '.json'));
|
|
70
|
+
const stacLink = await vectorStac.createStacLink(schema.name, layer);
|
|
71
|
+
const options = {
|
|
66
72
|
name: schema.name,
|
|
67
73
|
metadata: schema.metadata,
|
|
74
|
+
tileMatrix: tileMatrix.identifier,
|
|
68
75
|
layer,
|
|
69
76
|
};
|
|
77
|
+
const stacItem = vectorStac.createStacItem([stacLink], layer.cache.fileName, tileMatrix, options);
|
|
78
|
+
await fsa.write(stacFile, JSON.stringify(stacItem, null, 2));
|
|
79
|
+
// Prepare task to process
|
|
80
|
+
logger.info({ layer: schema.name, id: layer.id }, 'Extract: ToProcess');
|
|
70
81
|
// Separate large layer as individual task
|
|
71
82
|
if (layer.largeLayer) {
|
|
72
|
-
|
|
83
|
+
largeLayers.push({ path: stacFile.href });
|
|
73
84
|
}
|
|
74
85
|
else {
|
|
75
|
-
|
|
76
|
-
tasks.push(task);
|
|
86
|
+
smallLayers.push({ path: stacFile.href });
|
|
77
87
|
}
|
|
78
88
|
total++;
|
|
79
89
|
}
|
|
80
90
|
}
|
|
81
|
-
// Push remaining tasks
|
|
82
|
-
toProcess.push({ tasks });
|
|
83
91
|
logger.info({ ToProcess: total }, 'CheckUpdate: Finish');
|
|
84
|
-
await fsa.write(fsa.toUrl('tmp/
|
|
85
|
-
await fsa.write(fsa.toUrl('tmp/
|
|
92
|
+
await fsa.write(fsa.toUrl('/tmp/extract/allCaches.json'), JSON.stringify(allFiles, null, 2));
|
|
93
|
+
await fsa.write(fsa.toUrl('/tmp/extract/smallLayers.json'), JSON.stringify(smallLayers, null, 2));
|
|
94
|
+
await fsa.write(fsa.toUrl('/tmp/extract/largeLayers.json'), JSON.stringify(largeLayers, null, 2));
|
|
95
|
+
await fsa.write(fsa.toUrl('/tmp/extract/updateRequired'), String(total > 0));
|
|
86
96
|
},
|
|
87
97
|
});
|
|
88
98
|
//# sourceMappingURL=cli.extract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.extract.js","sourceRoot":"","sources":["../../src/cli/cli.extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.extract.js","sourceRoot":"","sources":["../../src/cli/cli.extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const JoinArgs: {
|
|
2
|
+
fromFile: 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<URL[]>>;
|
|
4
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
5
|
+
filename: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
6
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<string>>;
|
|
7
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
8
|
+
tileMatrix: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
9
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<string>>;
|
|
10
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
11
|
+
title: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
12
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<string>>;
|
|
13
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
14
|
+
target: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
15
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<URL | undefined>>;
|
|
16
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
17
|
+
verbose: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
18
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<boolean>>;
|
|
19
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/argparser.js").Register & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
20
|
+
extraVerbose: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
21
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<boolean>>;
|
|
22
|
+
} & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/argparser.js").Register & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
|
|
23
|
+
};
|
|
24
|
+
export declare const JoinCommand: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
|
|
25
|
+
parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<{
|
|
26
|
+
fromFile: URL[];
|
|
27
|
+
filename: string;
|
|
28
|
+
tileMatrix: string;
|
|
29
|
+
title: string;
|
|
30
|
+
target: URL | undefined;
|
|
31
|
+
verbose: boolean;
|
|
32
|
+
extraVerbose: boolean;
|
|
33
|
+
}>>;
|
|
34
|
+
} & 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<{
|
|
35
|
+
fromFile: URL[];
|
|
36
|
+
filename: string;
|
|
37
|
+
tileMatrix: string;
|
|
38
|
+
title: string;
|
|
39
|
+
target: URL | undefined;
|
|
40
|
+
verbose: boolean;
|
|
41
|
+
extraVerbose: boolean;
|
|
42
|
+
}, Promise<void>> & {
|
|
43
|
+
run(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<Promise<void>>>;
|
|
44
|
+
} & 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,149 @@
|
|
|
1
|
+
import { TileMatrixSets } from '@basemaps/geo';
|
|
2
|
+
import { fsa, isArgo, Url, UrlArrayJsonFile, urlToString } from '@basemaps/shared';
|
|
3
|
+
import { CliId, CliInfo } from '@basemaps/shared/build/cli/info.js';
|
|
4
|
+
import { getLogger, logArguments } from '@basemaps/shared/build/cli/log.js';
|
|
5
|
+
import { command, option, optional, string } from 'cmd-ts';
|
|
6
|
+
import { mkdir } from 'fs/promises';
|
|
7
|
+
import path, { basename, dirname } from 'path';
|
|
8
|
+
import { createGzip } from 'zlib';
|
|
9
|
+
import { createStacFiles } from '../stac.js';
|
|
10
|
+
import { toTarIndex } from '../transform/covt.js';
|
|
11
|
+
import { toTarTiles } from '../transform/mbtiles.to.ttiles.js';
|
|
12
|
+
import { tileJoin } from '../transform/tippecanoe.js';
|
|
13
|
+
async function download(filePaths, outputPath, logger) {
|
|
14
|
+
const paths = [];
|
|
15
|
+
for (const file of filePaths) {
|
|
16
|
+
if (file.protocol === 'file:') {
|
|
17
|
+
paths.push(file);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const fileName = basename(file.pathname);
|
|
21
|
+
if (fileName == null)
|
|
22
|
+
throw new Error(`Unsupported source pathname ${file.pathname}`);
|
|
23
|
+
const localFile = fsa.toUrl(`${outputPath}/downloads/${fileName}`);
|
|
24
|
+
if (await fsa.exists(localFile)) {
|
|
25
|
+
logger.info({ file: file, localFile, fileName }, 'Download:FileExists');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const stats = await fsa.head(file);
|
|
29
|
+
logger.info({ file: file, localFile, fileName, size: stats?.size }, 'Download:Start');
|
|
30
|
+
const stream = fsa.readStream(file);
|
|
31
|
+
await fsa.write(localFile, stream);
|
|
32
|
+
logger.info({ file: file, localFile, fileName }, 'Download:End');
|
|
33
|
+
}
|
|
34
|
+
paths.push(localFile);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return paths;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Upload output file into s3 bucket
|
|
41
|
+
*
|
|
42
|
+
*/
|
|
43
|
+
async function upload(file, bucketPath, logger) {
|
|
44
|
+
logger.info({ file: file.href }, 'Load:Start');
|
|
45
|
+
let filename = basename(file.pathname);
|
|
46
|
+
let stream = fsa.readStream(file);
|
|
47
|
+
// gzip index file
|
|
48
|
+
if (filename.endsWith('index')) {
|
|
49
|
+
filename = `${filename}.gz`;
|
|
50
|
+
stream = stream.pipe(createGzip());
|
|
51
|
+
}
|
|
52
|
+
// Upload to s3 or copy to local
|
|
53
|
+
let path = new URL(`topographic/${CliId}/${filename}`, bucketPath);
|
|
54
|
+
logger.info({ file: file, path: path }, 'Load:Path');
|
|
55
|
+
if (path.protocol === 'file:')
|
|
56
|
+
await mkdir(dirname(path.pathname), { recursive: true });
|
|
57
|
+
if (filename.endsWith('catalog.json'))
|
|
58
|
+
path = new URL(filename, bucketPath); // Upload catalog to root directory
|
|
59
|
+
await fsa.write(path, stream);
|
|
60
|
+
logger.info({ file: file, path: path }, 'Load:Finish');
|
|
61
|
+
return path;
|
|
62
|
+
}
|
|
63
|
+
export const JoinArgs = {
|
|
64
|
+
...logArguments,
|
|
65
|
+
fromFile: option({
|
|
66
|
+
type: UrlArrayJsonFile,
|
|
67
|
+
long: 'from-file',
|
|
68
|
+
description: 'Path to JSON file containing array of paths to mbtiles.',
|
|
69
|
+
}),
|
|
70
|
+
filename: option({
|
|
71
|
+
type: string,
|
|
72
|
+
long: 'filename',
|
|
73
|
+
description: 'Output filename default topographic',
|
|
74
|
+
defaultValue: () => 'topographic-v2',
|
|
75
|
+
defaultValueIsSerializable: true,
|
|
76
|
+
}),
|
|
77
|
+
tileMatrix: option({
|
|
78
|
+
type: string,
|
|
79
|
+
long: 'tile-matrix',
|
|
80
|
+
description: `Output TileMatrix to use WebMercatorQuad or NZTM2000Quad`,
|
|
81
|
+
defaultValue: () => 'WebMercatorQuad',
|
|
82
|
+
defaultValueIsSerializable: true,
|
|
83
|
+
}),
|
|
84
|
+
title: option({
|
|
85
|
+
type: string,
|
|
86
|
+
long: 'title',
|
|
87
|
+
description: 'Title for the output etl data in the STAC file',
|
|
88
|
+
defaultValue: () => 'Topographic V2',
|
|
89
|
+
defaultValueIsSerializable: true,
|
|
90
|
+
}),
|
|
91
|
+
target: option({
|
|
92
|
+
type: optional(Url),
|
|
93
|
+
long: 'target',
|
|
94
|
+
description: 'Path of target location to upload the processed file, could be local or s3',
|
|
95
|
+
}),
|
|
96
|
+
};
|
|
97
|
+
export const JoinCommand = command({
|
|
98
|
+
name: 'join',
|
|
99
|
+
version: CliInfo.version,
|
|
100
|
+
description: 'Join vector mbtiles',
|
|
101
|
+
args: JoinArgs,
|
|
102
|
+
async handler(args) {
|
|
103
|
+
const logger = getLogger(this, args, 'cli-vector');
|
|
104
|
+
const outputPath = path.resolve('tmp/join/');
|
|
105
|
+
await mkdir(outputPath, { recursive: true });
|
|
106
|
+
const tileMatrix = TileMatrixSets.find(args.tileMatrix);
|
|
107
|
+
if (tileMatrix == null)
|
|
108
|
+
throw new Error(`Tile matrix ${args.tileMatrix} is not supported`);
|
|
109
|
+
const bucketPath = new URL(`vector/${tileMatrix.projection.code}/`, args.target ?? outputPath);
|
|
110
|
+
const filePaths = await download(args.fromFile, outputPath, logger);
|
|
111
|
+
const outputMbtiles = path.join(outputPath, `${args.filename}.mbtiles`);
|
|
112
|
+
logger.info({ files: filePaths.length, outputMbtiles }, 'JoinMbtiles: Start');
|
|
113
|
+
await tileJoin(filePaths, outputMbtiles, logger);
|
|
114
|
+
logger.info({ files: filePaths.length, outputMbtiles }, 'JoinMbtiles: End');
|
|
115
|
+
const outputCotar = path.join(outputPath, `${args.filename}.tar.co`);
|
|
116
|
+
logger.info({ mbtiles: outputMbtiles, outputCotar }, 'ToTartTiles: Start');
|
|
117
|
+
await toTarTiles(outputMbtiles, outputCotar, logger);
|
|
118
|
+
logger.info({ mbtiles: outputMbtiles, outputCotar }, 'ToTartTiles: End');
|
|
119
|
+
const outputIndex = path.join(outputPath, `${args.filename}.tar.index`);
|
|
120
|
+
logger.info({ cotar: outputCotar, outputIndex }, 'toTarIndex: Start');
|
|
121
|
+
await toTarIndex(outputCotar, outputIndex, logger);
|
|
122
|
+
logger.info({ cotar: outputCotar, outputIndex }, 'toTarIndex: End');
|
|
123
|
+
logger.info({ target: bucketPath, tileMatrix: tileMatrix.identifier }, 'CreateStac: Start');
|
|
124
|
+
const stacFiles = await createStacFiles(args.fromFile, bucketPath, args.filename, tileMatrix, args.title, logger);
|
|
125
|
+
logger.info({ cotar: outputCotar, outputIndex }, 'CreateStac: End');
|
|
126
|
+
// Upload output to s3
|
|
127
|
+
logger.info({ target: bucketPath, tileMatrix: tileMatrix.identifier }, 'Upload: Start');
|
|
128
|
+
if (args.target) {
|
|
129
|
+
await upload(fsa.toUrl(outputMbtiles), bucketPath, logger);
|
|
130
|
+
await upload(fsa.toUrl(outputCotar), bucketPath, logger);
|
|
131
|
+
await upload(fsa.toUrl(outputIndex), bucketPath, logger);
|
|
132
|
+
// Upload stac Files
|
|
133
|
+
for (const file of stacFiles) {
|
|
134
|
+
await upload(file, bucketPath, logger);
|
|
135
|
+
}
|
|
136
|
+
logger.info({ target: bucketPath, tileMatrix: tileMatrix.identifier }, 'Upload: End');
|
|
137
|
+
}
|
|
138
|
+
// Write output target for argo tasks to create pull request
|
|
139
|
+
if (isArgo()) {
|
|
140
|
+
const target = new URL(`topographic/${CliId}/${args.filename}.tar.co`, bucketPath);
|
|
141
|
+
await fsa.write(fsa.toUrl('/tmp/target'), urlToString(target));
|
|
142
|
+
const mbTilesTarget = new URL(`topographic/${CliId}/${args.filename}.mbtiles`, bucketPath);
|
|
143
|
+
await fsa.write(fsa.toUrl('/tmp/mbTilesTarget'), mbTilesTarget.toString());
|
|
144
|
+
const analyseTarget = new URL(`topographic/${CliId}/`, bucketPath);
|
|
145
|
+
await fsa.write(fsa.toUrl('/tmp/analyseTarget'), analyseTarget.toString());
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=cli.join.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.join.js","sourceRoot":"","sources":["../../src/cli/cli.join.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,uCAAuC;AAEvC,6CAA6C;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AACvD,MAAM,MAAM,GAAG,MAAM,CAAC;AAoBtB,MAAM,OAAO,OAAO;IAApB;QACE;;;;;WAA4C;IAyC9C,CAAC;IAvCC;;OAEG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;YACrB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAY;QAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;QAEjD,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,UAAU,IAAI,IAAI,IAAI,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,QAAa;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC3E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TileMatrixSet } from '@basemaps/geo';
|
|
2
|
+
import { LogType } from '@basemaps/shared';
|
|
3
|
+
import { Metrics } from '../schema-loader/schema.js';
|
|
4
|
+
import { VectorCreationOptions } from '../stac.js';
|
|
5
|
+
/**
|
|
6
|
+
* Read and modify all ndJson file, then combine into one file,
|
|
7
|
+
*
|
|
8
|
+
* @returns {string} output of joined ndJson filepath
|
|
9
|
+
*/
|
|
10
|
+
export declare function generalize(input: URL, output: URL, tileMatrix: TileMatrixSet, options: VectorCreationOptions, logger: LogType): Promise<Metrics>;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { createWriteStream } from 'fs';
|
|
2
|
+
import readline from 'readline';
|
|
3
|
+
import { modifyFeature } from '../modify/modify.js';
|
|
4
|
+
import { transformNdJson, transformZoom } from '../transform/nztm.js';
|
|
5
|
+
import { createReadStreamSafe } from '../util.js';
|
|
6
|
+
import { simplify } from './simplify.js';
|
|
7
|
+
/**
|
|
8
|
+
* Read and modify all ndJson file, then combine into one file,
|
|
9
|
+
*
|
|
10
|
+
* @returns {string} output of joined ndJson filepath
|
|
11
|
+
*/
|
|
12
|
+
export async function generalize(input, output, tileMatrix, options, logger) {
|
|
13
|
+
logger.info({}, 'Generalize:Start');
|
|
14
|
+
const fileStream = await createReadStreamSafe(input.pathname);
|
|
15
|
+
const simplify = options.layer.simplify;
|
|
16
|
+
const rl = readline.createInterface({
|
|
17
|
+
input: fileStream,
|
|
18
|
+
crlfDelay: Infinity,
|
|
19
|
+
});
|
|
20
|
+
const writeStream = createWriteStream(output);
|
|
21
|
+
let inputCount = 0;
|
|
22
|
+
let outputCount = 0;
|
|
23
|
+
for await (const line of rl) {
|
|
24
|
+
if (line === '')
|
|
25
|
+
continue;
|
|
26
|
+
const feature = JSON.parse(line);
|
|
27
|
+
if (tileMatrix.identifier === 'NZTM2000Quad')
|
|
28
|
+
transformNdJson(feature);
|
|
29
|
+
inputCount++;
|
|
30
|
+
// For simplify, duplicate feature for each zoom level with different tolerance
|
|
31
|
+
if (simplify != null) {
|
|
32
|
+
for (const s of simplify) {
|
|
33
|
+
const vectorGeofeature = tag(tileMatrix, options, feature, s, logger);
|
|
34
|
+
if (vectorGeofeature == null)
|
|
35
|
+
continue;
|
|
36
|
+
writeStream.write(JSON.stringify(vectorGeofeature) + '\n');
|
|
37
|
+
outputCount++;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const vectorGeofeature = tag(tileMatrix, options, feature, null, logger);
|
|
42
|
+
if (vectorGeofeature == null)
|
|
43
|
+
continue;
|
|
44
|
+
writeStream.write(JSON.stringify(vectorGeofeature) + '\n');
|
|
45
|
+
outputCount++;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
await new Promise((resolve) => {
|
|
49
|
+
writeStream.close(resolve);
|
|
50
|
+
});
|
|
51
|
+
const metrics = {
|
|
52
|
+
input: inputCount,
|
|
53
|
+
output: outputCount,
|
|
54
|
+
};
|
|
55
|
+
logger.info({ inputCount, outputCount }, 'Generalize:End');
|
|
56
|
+
return metrics;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Tag feature for layer
|
|
60
|
+
*/
|
|
61
|
+
function tag(tileMatrix, options, feature, simplify, logger) {
|
|
62
|
+
const vectorGeofeature = {
|
|
63
|
+
...structuredClone(feature),
|
|
64
|
+
tippecanoe: {
|
|
65
|
+
layer: options.name,
|
|
66
|
+
minzoom: options.layer.style.minZoom,
|
|
67
|
+
maxzoom: options.layer.style.maxZoom,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
// copy the stac json's tags to the feature (i.e. 'kind')
|
|
71
|
+
Object.entries(options.layer.tags).forEach(([key, value]) => (vectorGeofeature.properties[key] = value));
|
|
72
|
+
// Simplify geometry
|
|
73
|
+
if (simplify != null) {
|
|
74
|
+
// Update the simplified feature zoom level
|
|
75
|
+
vectorGeofeature['tippecanoe'] = {
|
|
76
|
+
layer: options.name,
|
|
77
|
+
minzoom: simplify.style.minZoom,
|
|
78
|
+
maxzoom: simplify.style.maxZoom,
|
|
79
|
+
};
|
|
80
|
+
if (simplify.tolerance != null) {
|
|
81
|
+
const geom = vectorGeofeature.geometry;
|
|
82
|
+
const type = geom.type;
|
|
83
|
+
const geometry = simplifyFeature(type, geom, simplify.tolerance);
|
|
84
|
+
if (geometry == null) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
vectorGeofeature.geometry = geometry;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// adjust the feature's metadata and properties
|
|
91
|
+
const modifiedFeature = modifyFeature(vectorGeofeature, options, logger);
|
|
92
|
+
if (modifiedFeature == null) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
// Skip features that maxzoom is less than minzoom, this could happened after simplification and special tags on zoom levels
|
|
96
|
+
if (modifiedFeature.tippecanoe.maxzoom < modifiedFeature.tippecanoe.minzoom)
|
|
97
|
+
return null;
|
|
98
|
+
// Transform zoom level for NZTM2000Quad
|
|
99
|
+
modifiedFeature.tippecanoe.minzoom = transformZoom(modifiedFeature.tippecanoe.minzoom, tileMatrix);
|
|
100
|
+
modifiedFeature.tippecanoe.maxzoom = transformZoom(modifiedFeature.tippecanoe.maxzoom, tileMatrix);
|
|
101
|
+
// Remove unused properties
|
|
102
|
+
const cleanedFeature = removeAttributes(modifiedFeature, options);
|
|
103
|
+
return cleanedFeature;
|
|
104
|
+
}
|
|
105
|
+
function removeAttributes(feature, options, remove = true) {
|
|
106
|
+
feature = structuredClone(feature);
|
|
107
|
+
// Add existing attributes into keep attributes and update attribute name if needed
|
|
108
|
+
const properties = feature['properties'];
|
|
109
|
+
const mappings = options.layer.attributes;
|
|
110
|
+
const attributes = new Set(options.metadata.attributes);
|
|
111
|
+
if (mappings != null) {
|
|
112
|
+
Object.keys(mappings).forEach((key) => (properties[mappings[key]] = properties[key]));
|
|
113
|
+
}
|
|
114
|
+
// Remove unused attributes
|
|
115
|
+
Object.keys(properties).forEach((key) => {
|
|
116
|
+
// Add id as feature id and remove from properties
|
|
117
|
+
if (key === 'id') {
|
|
118
|
+
feature['id'] = String(properties[key]);
|
|
119
|
+
delete properties[key];
|
|
120
|
+
}
|
|
121
|
+
if (!attributes.has(key) && remove)
|
|
122
|
+
delete properties[key];
|
|
123
|
+
});
|
|
124
|
+
feature.properties = properties;
|
|
125
|
+
return feature;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Simplify geometry by Douglas-Peucker and Radial Distance algorithms.
|
|
129
|
+
* Remove all the points for polygons simplification.
|
|
130
|
+
*/
|
|
131
|
+
function simplifyFeature(type, geometry, tolerance) {
|
|
132
|
+
if (type === 'LineString') {
|
|
133
|
+
const coordinates = geometry.coordinates;
|
|
134
|
+
const line = simplify(coordinates, tolerance);
|
|
135
|
+
return { type, coordinates: line };
|
|
136
|
+
}
|
|
137
|
+
else if (type === 'Polygon' || type === 'MultiLineString') {
|
|
138
|
+
const coordinates = geometry.coordinates;
|
|
139
|
+
const cor = coordinates.slice();
|
|
140
|
+
for (let k = 0; k < cor.length; k++) {
|
|
141
|
+
const point = simplify(cor[k], tolerance);
|
|
142
|
+
cor[k] = point;
|
|
143
|
+
}
|
|
144
|
+
return { type, coordinates: cor };
|
|
145
|
+
}
|
|
146
|
+
else if (type === 'MultiPolygon') {
|
|
147
|
+
let remove = true;
|
|
148
|
+
const coordinates = geometry.coordinates;
|
|
149
|
+
const cor = coordinates.slice();
|
|
150
|
+
for (let k = 0; k < cor.length; k++) {
|
|
151
|
+
for (let l = 0; l < cor[k].length; l++) {
|
|
152
|
+
const point = simplify(cor[k][l], tolerance);
|
|
153
|
+
cor[k][l] = point;
|
|
154
|
+
if (point.length > 2) {
|
|
155
|
+
cor[k][l] = point;
|
|
156
|
+
remove = false;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// remove points
|
|
160
|
+
cor[k][l] = [];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return remove ? undefined : { type, coordinates: cor };
|
|
165
|
+
}
|
|
166
|
+
return geometry;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=generalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generalization.js","sourceRoot":"","sources":["../../src/generalization/generalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// square distance between 2 points
|
|
2
|
+
function getSqDist(p1, p2) {
|
|
3
|
+
const dx = p1[0] - p2[0];
|
|
4
|
+
const dy = p1[1] - p2[1];
|
|
5
|
+
return dx * dx + dy * dy;
|
|
6
|
+
}
|
|
7
|
+
// square distance from a point to a segment
|
|
8
|
+
function getSqSegDist(p, p1, p2) {
|
|
9
|
+
let x = p1[0];
|
|
10
|
+
let y = p1[1];
|
|
11
|
+
let dx = p2[0] - x;
|
|
12
|
+
let dy = p2[1] - y;
|
|
13
|
+
if (dx !== 0 || dy !== 0) {
|
|
14
|
+
const t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);
|
|
15
|
+
if (t > 1) {
|
|
16
|
+
x = p2[0];
|
|
17
|
+
y = p2[1];
|
|
18
|
+
}
|
|
19
|
+
else if (t > 0) {
|
|
20
|
+
x += dx * t;
|
|
21
|
+
y += dy * t;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
dx = p[0] - x;
|
|
25
|
+
dy = p[1] - y;
|
|
26
|
+
return dx * dx + dy * dy;
|
|
27
|
+
}
|
|
28
|
+
// rest of the code doesn't care about point format
|
|
29
|
+
// basic distance-based simplification
|
|
30
|
+
function simplifyRadialDist(points, sqTolerance) {
|
|
31
|
+
let prevPoint = points[0];
|
|
32
|
+
let point = points[1];
|
|
33
|
+
const newPoints = [prevPoint];
|
|
34
|
+
for (let i = 1, len = points.length; i < len; i++) {
|
|
35
|
+
point = points[i];
|
|
36
|
+
if (getSqDist(point, prevPoint) > sqTolerance) {
|
|
37
|
+
newPoints.push(point);
|
|
38
|
+
prevPoint = point;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (prevPoint !== point)
|
|
42
|
+
newPoints.push(point);
|
|
43
|
+
return newPoints;
|
|
44
|
+
}
|
|
45
|
+
function simplifyDPStep(points, first, last, sqTolerance, simplified) {
|
|
46
|
+
let maxSqDist = sqTolerance;
|
|
47
|
+
let index = 0;
|
|
48
|
+
for (let i = first + 1; i < last; i++) {
|
|
49
|
+
const sqDist = getSqSegDist(points[i], points[first], points[last]);
|
|
50
|
+
if (sqDist > maxSqDist) {
|
|
51
|
+
index = i;
|
|
52
|
+
maxSqDist = sqDist;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (maxSqDist > sqTolerance) {
|
|
56
|
+
if (index - first > 1)
|
|
57
|
+
simplifyDPStep(points, first, index, sqTolerance, simplified);
|
|
58
|
+
simplified.push(points[index]);
|
|
59
|
+
if (last - index > 1)
|
|
60
|
+
simplifyDPStep(points, index, last, sqTolerance, simplified);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// simplification using Ramer-Douglas-Peucker algorithm
|
|
64
|
+
function simplifyDouglasPeucker(points, sqTolerance) {
|
|
65
|
+
const last = points.length - 1;
|
|
66
|
+
const simplified = [points[0]];
|
|
67
|
+
simplifyDPStep(points, 0, last, sqTolerance, simplified);
|
|
68
|
+
simplified.push(points[last]);
|
|
69
|
+
return simplified;
|
|
70
|
+
}
|
|
71
|
+
// both algorithms combined for awesome performance
|
|
72
|
+
export function simplify(points, tolerance, highestQuality) {
|
|
73
|
+
if (points.length <= 2)
|
|
74
|
+
return points;
|
|
75
|
+
const sqTolerance = tolerance * tolerance;
|
|
76
|
+
points = highestQuality ? points : simplifyRadialDist(points, sqTolerance);
|
|
77
|
+
points = simplifyDouglasPeucker(points, sqTolerance);
|
|
78
|
+
return points;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=simplify.js.map
|