@basemaps/cli-vector 8.1.0 → 8.2.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 (94) hide show
  1. package/build/bin.js +2 -2
  2. package/build/cli/cli.analyse.d.ts +34 -0
  3. package/build/cli/cli.analyse.js +152 -0
  4. package/build/cli/cli.analyse.js.map +1 -0
  5. package/build/cli/cli.create.d.ts +39 -0
  6. package/build/cli/cli.create.js +207 -0
  7. package/build/cli/cli.create.js.map +1 -0
  8. package/build/cli/cli.extract.d.ts +8 -17
  9. package/build/cli/cli.extract.js +43 -33
  10. package/build/cli/cli.extract.js.map +1 -1
  11. package/build/cli/cli.join.d.ts +44 -0
  12. package/build/cli/cli.join.js +149 -0
  13. package/build/cli/cli.join.js.map +1 -0
  14. package/build/extract.js.map +1 -0
  15. package/build/generalization/generalization.d.ts +9 -0
  16. package/build/generalization/generalization.js +159 -0
  17. package/build/generalization/generalization.js.map +1 -0
  18. package/build/generalization/simplify.d.ts +2 -0
  19. package/build/generalization/simplify.js +80 -0
  20. package/build/generalization/simplify.js.map +1 -0
  21. package/build/index.d.ts +83 -5
  22. package/build/index.js +7 -1
  23. package/build/index.js.map +1 -1
  24. package/build/modify/consts.d.ts +1 -0
  25. package/build/modify/consts.js +23 -0
  26. package/build/modify/consts.js.map +1 -0
  27. package/build/modify/layers/__test__/contours.test.d.ts +1 -0
  28. package/build/modify/layers/__test__/contours.test.js +59 -0
  29. package/build/modify/layers/__test__/contours.test.js.map +1 -0
  30. package/build/modify/layers/contours.d.ts +28 -0
  31. package/build/modify/layers/contours.js +90 -0
  32. package/build/modify/layers/contours.js.map +1 -0
  33. package/build/modify/layers/place_labels.d.ts +18 -0
  34. package/build/modify/layers/place_labels.js +122 -0
  35. package/build/modify/layers/place_labels.js.map +1 -0
  36. package/build/modify/layers/pois.d.ts +11 -0
  37. package/build/modify/layers/pois.js +27 -0
  38. package/build/modify/layers/pois.js.map +1 -0
  39. package/build/modify/layers/public_transport.d.ts +12 -0
  40. package/build/modify/layers/public_transport.js +53 -0
  41. package/build/modify/layers/public_transport.js.map +1 -0
  42. package/build/modify/layers/street_labels.d.ts +12 -0
  43. package/build/modify/layers/street_labels.js +34 -0
  44. package/build/modify/layers/street_labels.js.map +1 -0
  45. package/build/modify/layers/streets.d.ts +12 -0
  46. package/build/modify/layers/streets.js +72 -0
  47. package/build/modify/layers/streets.js.map +1 -0
  48. package/build/modify/layers/water_polygons.d.ts +13 -0
  49. package/build/modify/layers/water_polygons.js +85 -0
  50. package/build/modify/layers/water_polygons.js.map +1 -0
  51. package/build/modify/modify.d.ts +11 -0
  52. package/build/modify/modify.js +48 -0
  53. package/build/modify/modify.js.map +1 -0
  54. package/build/modify/parser.d.ts +47 -0
  55. package/build/modify/parser.js +24 -0
  56. package/build/modify/parser.js.map +1 -0
  57. package/build/modify/schema.d.ts +17 -0
  58. package/build/modify/schema.js +2 -0
  59. package/build/modify/schema.js.map +1 -0
  60. package/build/modify/shared.d.ts +4 -0
  61. package/build/modify/shared.js +38 -0
  62. package/build/modify/shared.js.map +1 -0
  63. package/build/schema-loader/parser.d.ts +8 -0
  64. package/build/schema-loader/parser.js +1 -0
  65. package/build/schema-loader/parser.js.map +1 -1
  66. package/build/schema-loader/schema.d.ts +19 -5
  67. package/build/schema-loader/schema.loader.js +10 -5
  68. package/build/schema-loader/schema.loader.js.map +1 -1
  69. package/build/stac.d.ts +41 -0
  70. package/build/stac.js +185 -0
  71. package/build/stac.js.map +1 -0
  72. package/build/transform/covt.d.ts +5 -0
  73. package/build/transform/covt.js +23 -0
  74. package/build/transform/covt.js.map +1 -0
  75. package/build/transform/mbtiles.to.ttiles.d.ts +14 -0
  76. package/build/transform/mbtiles.to.ttiles.js +60 -0
  77. package/build/transform/mbtiles.to.ttiles.js.map +1 -0
  78. package/build/transform/ogr2ogr.d.ts +7 -0
  79. package/build/transform/ogr2ogr.js +20 -0
  80. package/build/transform/ogr2ogr.js.map +1 -0
  81. package/build/transform/tippecanoe.d.ts +14 -0
  82. package/build/transform/tippecanoe.js +68 -0
  83. package/build/transform/tippecanoe.js.map +1 -0
  84. package/build/types/VectorGeoFeature.d.ts +9 -0
  85. package/build/types/VectorGeoFeature.js +2 -0
  86. package/build/types/VectorGeoFeature.js.map +1 -0
  87. package/build/util.d.ts +35 -0
  88. package/build/util.js +43 -0
  89. package/build/util.js.map +1 -0
  90. package/dist/index.cjs +20753 -9551
  91. package/package.json +23 -8
  92. package/build/extract/extract.js.map +0 -1
  93. /package/build/{extract/extract.d.ts → extract.d.ts} +0 -0
  94. /package/build/{extract/extract.js → extract.js} +0 -0
@@ -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 { fsa } from '@chunkd/fs';
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
- path: option({
17
- type: string,
18
- long: 'path',
19
- defaultValue: () => './schema/',
20
- defaultValueIsSerializable: true,
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
- group: option({
29
- type: number,
30
- long: 'group',
31
- defaultValue: () => 100,
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({ path }, 'Extract: Start');
47
- const schemaLoader = new SchemaLoader(new URL(path), logger, cache);
49
+ logger.info({ schema: args.schema }, 'Extract: Start');
50
+ const schemaLoader = new SchemaLoader(args.schema, logger, cache);
48
51
  const schemas = await schemaLoader.load();
49
- const toProcess = [];
52
+ const smallLayers = [];
53
+ const largeLayers = [];
50
54
  let total = 0;
51
- let tasks = [];
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 (tasks.length >= args.group) {
55
- toProcess.push({ tasks });
56
- tasks = [];
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 && (await fsa.exists(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
- // Prepare task to process
64
- logger.info({ layer: schema.name, id: layer.id }, 'Extract: ToProcess');
65
- const task = {
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
- toProcess.push({ tasks: [task] });
83
+ largeLayers.push({ path: stacFile.href });
73
84
  }
74
85
  else {
75
- // Group the tasks together
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/vector/toProcess.json'), JSON.stringify(toProcess, null, 2));
85
- await fsa.write(fsa.toUrl('tmp/vector/updateRequired'), String(total > 0));
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":"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"}
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 } 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'), JSON.stringify([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,9 @@
1
+ import { LogType } from '@basemaps/shared';
2
+ import { Metrics } from '../schema-loader/schema.js';
3
+ import { VectorCreationOptions } from '../stac.js';
4
+ /**
5
+ * Read and modify all ndJson file, then combine into one file,
6
+ *
7
+ * @returns {string} output of joined ndJson filepath
8
+ */
9
+ export declare function generalize(input: URL, output: URL, options: VectorCreationOptions, logger: LogType): Promise<Metrics>;
@@ -0,0 +1,159 @@
1
+ import { createWriteStream } from 'fs';
2
+ import readline from 'readline';
3
+ import { modifyFeature } from '../modify/modify.js';
4
+ import { createReadStreamSafe } from '../util.js';
5
+ import { simplify } from './simplify.js';
6
+ /**
7
+ * Read and modify all ndJson file, then combine into one file,
8
+ *
9
+ * @returns {string} output of joined ndJson filepath
10
+ */
11
+ export async function generalize(input, output, options, logger) {
12
+ logger.info({}, 'Generalize:Start');
13
+ const fileStream = await createReadStreamSafe(input.pathname);
14
+ const simplify = options.layer.simplify;
15
+ const rl = readline.createInterface({
16
+ input: fileStream,
17
+ crlfDelay: Infinity,
18
+ });
19
+ const writeStream = createWriteStream(output);
20
+ let inputCount = 0;
21
+ let outputCount = 0;
22
+ for await (const line of rl) {
23
+ if (line === '')
24
+ continue;
25
+ inputCount++;
26
+ // For simplify, duplicate feature for each zoom level with different tolerance
27
+ if (simplify != null) {
28
+ for (const s of simplify) {
29
+ const feature = tag(options, line, s, logger);
30
+ if (feature == null)
31
+ continue;
32
+ writeStream.write(JSON.stringify(feature) + '\n');
33
+ outputCount++;
34
+ }
35
+ }
36
+ else {
37
+ const feature = tag(options, line, null, logger);
38
+ if (feature == null)
39
+ continue;
40
+ writeStream.write(JSON.stringify(feature) + '\n');
41
+ outputCount++;
42
+ }
43
+ }
44
+ await new Promise((resolve) => {
45
+ writeStream.close(resolve);
46
+ });
47
+ const metrics = {
48
+ input: inputCount,
49
+ output: outputCount,
50
+ };
51
+ logger.info({ inputCount, outputCount }, 'Generalize:End');
52
+ return metrics;
53
+ }
54
+ /**
55
+ * Tag feature for layer
56
+ */
57
+ function tag(options, line, simplify, logger) {
58
+ const feature = {
59
+ ...JSON.parse(line),
60
+ tippecanoe: {
61
+ layer: options.name,
62
+ minzoom: options.layer.style.minZoom,
63
+ maxzoom: options.layer.style.maxZoom,
64
+ },
65
+ };
66
+ // copy the stac json's tags to the feature (i.e. 'kind')
67
+ Object.entries(options.layer.tags).forEach(([key, value]) => (feature.properties[key] = value));
68
+ // adjust the feature's metadata and properties
69
+ const modifiedFeature = modifyFeature(feature, options, logger);
70
+ if (modifiedFeature == null) {
71
+ return null;
72
+ }
73
+ // Simplify geometry
74
+ if (simplify != null) {
75
+ // Update the simplified feature zoom level
76
+ modifiedFeature['tippecanoe'] = {
77
+ layer: options.name,
78
+ minzoom: simplify.style.minZoom,
79
+ maxzoom: simplify.style.maxZoom,
80
+ };
81
+ if (simplify.tolerance != null) {
82
+ const geom = modifiedFeature.geometry;
83
+ const type = geom.type;
84
+ const coordinates = simplifyFeature(type, geom, simplify.tolerance);
85
+ if (coordinates == null) {
86
+ return null;
87
+ }
88
+ modifiedFeature.geometry = coordinates;
89
+ }
90
+ }
91
+ // Remove unused properties
92
+ // REVIEW: this function just removes the special tags. something isn't right here
93
+ const cleanedFeature = removeAttributes(modifiedFeature, options);
94
+ return cleanedFeature;
95
+ }
96
+ function removeAttributes(feature, options, remove = true) {
97
+ feature = structuredClone(feature);
98
+ // Add existing attributes into keep attributes and update attribute name if needed
99
+ const properties = feature['properties'];
100
+ const mappings = options.layer.attributes;
101
+ const attributes = new Set(options.metadata.attributes);
102
+ if (mappings != null) {
103
+ Object.keys(mappings).forEach((key) => (properties[mappings[key]] = properties[key]));
104
+ }
105
+ // Remove unused attributes
106
+ Object.keys(properties).forEach((key) => {
107
+ // Add id as feature id and remove from properties
108
+ if (key === 'id') {
109
+ feature['id'] = String(properties[key]);
110
+ delete properties[key];
111
+ }
112
+ if (!attributes.has(key) && remove)
113
+ delete properties[key];
114
+ });
115
+ feature.properties = properties;
116
+ return feature;
117
+ }
118
+ /**
119
+ * Simplify geometry by Douglas-Peucker and Radial Distance algorithms.
120
+ * Remove all the points for polygons simplification.
121
+ */
122
+ function simplifyFeature(type, geometry, tolerance) {
123
+ if (type === 'LineString') {
124
+ const coordinates = geometry.coordinates;
125
+ const line = simplify(coordinates, tolerance);
126
+ return { type, coordinates: line };
127
+ }
128
+ else if (type === 'Polygon' || type === 'MultiLineString') {
129
+ const coordinates = geometry.coordinates;
130
+ const cor = coordinates.slice();
131
+ for (let k = 0; k < cor.length; k++) {
132
+ const point = simplify(cor[k], tolerance);
133
+ cor[k] = point;
134
+ }
135
+ return { type, coordinates: cor };
136
+ }
137
+ else if (type === 'MultiPolygon') {
138
+ let remove = true;
139
+ const coordinates = geometry.coordinates;
140
+ const cor = coordinates.slice();
141
+ for (let k = 0; k < cor.length; k++) {
142
+ for (let l = 0; l < cor[k].length; l++) {
143
+ const point = simplify(cor[k][l], tolerance);
144
+ cor[k][l] = point;
145
+ if (point.length > 2) {
146
+ cor[k][l] = point;
147
+ remove = false;
148
+ }
149
+ else {
150
+ // remove points
151
+ cor[k][l] = [];
152
+ }
153
+ }
154
+ }
155
+ return remove ? undefined : { type, coordinates: cor };
156
+ }
157
+ return geometry;
158
+ }
159
+ //# 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,2 @@
1
+ export type Point = [number, number];
2
+ export declare function simplify(points: Point[], tolerance: number, highestQuality?: boolean): Point[];
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../../src/generalization/simplify.ts"],"names":[],"mappings":"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"}