@basemaps/cli-vector 8.0.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.
- 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 +207 -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 +9 -0
- package/build/generalization/generalization.js +159 -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 +122 -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 +27 -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 +53 -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_polygons.d.ts +13 -0
- package/build/modify/layers/water_polygons.js +85 -0
- package/build/modify/layers/water_polygons.js.map +1 -0
- package/build/modify/modify.d.ts +11 -0
- package/build/modify/modify.js +48 -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 +4 -0
- package/build/modify/shared.js +38 -0
- package/build/modify/shared.js.map +1 -0
- package/build/schema-loader/parser.d.ts +8 -0
- package/build/schema-loader/parser.js +1 -0
- package/build/schema-loader/parser.js.map +1 -1
- package/build/schema-loader/schema.d.ts +19 -5
- package/build/schema-loader/schema.loader.js +10 -5
- 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/ogr2ogr.d.ts +7 -0
- package/build/transform/ogr2ogr.js +20 -0
- package/build/transform/ogr2ogr.js.map +1 -0
- package/build/transform/tippecanoe.d.ts +14 -0
- package/build/transform/tippecanoe.js +68 -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 +20753 -9551
- 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/stac.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BoundingBox, TileMatrixSet } from '@basemaps/geo';
|
|
2
|
+
import { LogType } from '@basemaps/shared';
|
|
3
|
+
import { StacCatalog, StacCollection, StacItem, StacLink } from 'stac-ts';
|
|
4
|
+
import { Layer, SchemaMetadata } from './schema-loader/schema.js';
|
|
5
|
+
export interface VectorCreationOptions {
|
|
6
|
+
/** Schema name for the layer*/
|
|
7
|
+
name: string;
|
|
8
|
+
/**Schema metadata for creation vector tiles */
|
|
9
|
+
metadata: SchemaMetadata;
|
|
10
|
+
/** Tile matrix to create the tiles against */
|
|
11
|
+
tileMatrix: string;
|
|
12
|
+
/** Individual layer options */
|
|
13
|
+
layer: Layer;
|
|
14
|
+
}
|
|
15
|
+
export interface GeneratedProperties {
|
|
16
|
+
/** Package name that generated the file */
|
|
17
|
+
package: string;
|
|
18
|
+
/** Version number that generated the file */
|
|
19
|
+
version: string;
|
|
20
|
+
/** Git commit hash that the file was generated with */
|
|
21
|
+
hash: string;
|
|
22
|
+
/** ISO date of the time this file was generated */
|
|
23
|
+
datetime: string;
|
|
24
|
+
}
|
|
25
|
+
export type VectorStacItem = StacItem & {
|
|
26
|
+
properties: {
|
|
27
|
+
'linz_basemaps:generated': GeneratedProperties;
|
|
28
|
+
'linz_basemaps:options'?: VectorCreationOptions;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export declare class VectorStac {
|
|
32
|
+
logger: LogType;
|
|
33
|
+
/** List of bounding boxes for the layer, to union as collection bbox */
|
|
34
|
+
bboxArr: BoundingBox[];
|
|
35
|
+
constructor(logger: LogType);
|
|
36
|
+
createStacLink(targetLayer: string, layer: Layer): Promise<StacLink>;
|
|
37
|
+
createStacItem(layers: StacLink[], filename: string, tileMatrix: TileMatrixSet, options?: VectorCreationOptions): VectorStacItem;
|
|
38
|
+
createStacCollection(bbBox: number[], layers: StacLink[], filename: string, title: string): StacCollection;
|
|
39
|
+
createStacCatalog(): StacCatalog;
|
|
40
|
+
}
|
|
41
|
+
export declare function createStacFiles(filePaths: URL[], targetPath: URL, filename: string, tileMatrix: TileMatrixSet, title: string, logger: LogType): Promise<URL[]>;
|
package/build/stac.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Bounds } from '@basemaps/geo';
|
|
2
|
+
import { fsa } from '@basemaps/shared';
|
|
3
|
+
import { CliDate, CliId, CliInfo } from '@basemaps/shared/build/cli/info.js';
|
|
4
|
+
import { LDS_CACHE_BUCKET } from './extract.js';
|
|
5
|
+
import { zLayer } from './schema-loader/parser.js';
|
|
6
|
+
const providers = [
|
|
7
|
+
{ name: 'Land Information New Zealand', url: 'https://www.linz.govt.nz/', roles: ['processor', 'host'] },
|
|
8
|
+
];
|
|
9
|
+
export class VectorStac {
|
|
10
|
+
constructor(logger) {
|
|
11
|
+
Object.defineProperty(this, "logger", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: void 0
|
|
16
|
+
});
|
|
17
|
+
/** List of bounding boxes for the layer, to union as collection bbox */
|
|
18
|
+
Object.defineProperty(this, "bboxArr", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true,
|
|
22
|
+
value: []
|
|
23
|
+
});
|
|
24
|
+
this.logger = logger;
|
|
25
|
+
}
|
|
26
|
+
async createStacLink(targetLayer, layer) {
|
|
27
|
+
if (layer.source.startsWith(LDS_CACHE_BUCKET)) {
|
|
28
|
+
// Create stac link for lds layer
|
|
29
|
+
this.logger.info({ layer: layer.id }, 'VectorStac: CreateLdsStacLink');
|
|
30
|
+
const collectionPath = new URL('collection.json', layer.source);
|
|
31
|
+
const sourceCollection = await fsa.readJson(collectionPath);
|
|
32
|
+
const spatialExtents = sourceCollection.extent.spatial.bbox;
|
|
33
|
+
this.bboxArr.push(...spatialExtents.map((b) => Bounds.fromBbox(b)));
|
|
34
|
+
const stacLink = {
|
|
35
|
+
rel: 'lds:layer',
|
|
36
|
+
'lds:id': layer.id,
|
|
37
|
+
'lds:name': layer.name,
|
|
38
|
+
'lds:title': sourceCollection.title,
|
|
39
|
+
'lds:version': layer.version,
|
|
40
|
+
'basemaps:layers': [targetLayer],
|
|
41
|
+
href: `https://data.linz.govt.nz/services/api/v1/layers/${layer.id}/versions/${layer.version}/`,
|
|
42
|
+
};
|
|
43
|
+
if (layer.metrics != null) {
|
|
44
|
+
stacLink['lds:feature_count'] = layer.metrics.input;
|
|
45
|
+
}
|
|
46
|
+
return stacLink;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.logger.info({ layer: layer.id }, 'VectorStac: CreateExternalStacLink');
|
|
50
|
+
// Create stac link for external layer
|
|
51
|
+
const stacLink = {
|
|
52
|
+
rel: 'layer',
|
|
53
|
+
id: layer.id,
|
|
54
|
+
name: layer.name,
|
|
55
|
+
'basemaps:layers': targetLayer,
|
|
56
|
+
href: `https://data.linz.govt.nz/services/api/v1/layers/${layer.id}/versions/${layer.version}/`,
|
|
57
|
+
};
|
|
58
|
+
return stacLink;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
createStacItem(layers, filename, tileMatrix, options) {
|
|
62
|
+
this.logger.info({ filename }, 'VectorStac: CreateStacItem');
|
|
63
|
+
const item = {
|
|
64
|
+
id: `${CliId}/${filename}`,
|
|
65
|
+
type: 'Feature',
|
|
66
|
+
collection: CliId,
|
|
67
|
+
stac_version: '1.0.0',
|
|
68
|
+
stac_extensions: [],
|
|
69
|
+
geometry: null,
|
|
70
|
+
bbox: [-180, -90, 180, 90],
|
|
71
|
+
links: [
|
|
72
|
+
{ href: `./${filename}.json`, rel: 'self' },
|
|
73
|
+
{ href: './collection.json', rel: 'collection' },
|
|
74
|
+
{ href: './collection.json', rel: 'parent' },
|
|
75
|
+
...layers,
|
|
76
|
+
],
|
|
77
|
+
properties: {
|
|
78
|
+
'proj:epsg': tileMatrix.projection.code,
|
|
79
|
+
'linz_basemaps:generated': {
|
|
80
|
+
package: CliInfo.package,
|
|
81
|
+
hash: CliInfo.hash,
|
|
82
|
+
version: CliInfo.version,
|
|
83
|
+
datetime: CliDate,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
assets: {},
|
|
87
|
+
};
|
|
88
|
+
// Set options for individual mbtiles stac file
|
|
89
|
+
if (options != null)
|
|
90
|
+
item.properties['linz_basemaps:options'] = options;
|
|
91
|
+
return item;
|
|
92
|
+
}
|
|
93
|
+
createStacCollection(bbBox, layers, filename, title) {
|
|
94
|
+
return {
|
|
95
|
+
stac_version: '1.0.0',
|
|
96
|
+
stac_extensions: [],
|
|
97
|
+
type: 'Collection',
|
|
98
|
+
license: 'CC-BY-4.0',
|
|
99
|
+
id: 'sc_' + CliId,
|
|
100
|
+
title,
|
|
101
|
+
description: 'Linz Vector Basemaps.',
|
|
102
|
+
extent: {
|
|
103
|
+
spatial: {
|
|
104
|
+
bbox: [bbBox],
|
|
105
|
+
},
|
|
106
|
+
temporal: { interval: [[CliDate, null]] },
|
|
107
|
+
},
|
|
108
|
+
links: [
|
|
109
|
+
{ rel: 'self', href: './collection.json', type: 'application/json' },
|
|
110
|
+
{ rel: 'item', href: `./${filename}.json` },
|
|
111
|
+
...layers,
|
|
112
|
+
],
|
|
113
|
+
providers,
|
|
114
|
+
summaries: {},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
createStacCatalog() {
|
|
118
|
+
return {
|
|
119
|
+
stac_version: '1.0.0',
|
|
120
|
+
stac_extensions: [],
|
|
121
|
+
type: 'Catalog',
|
|
122
|
+
title: 'ETL',
|
|
123
|
+
description: 'ETL process to generate LINZ Vector Basemaps',
|
|
124
|
+
id: 'sl_' + CliId,
|
|
125
|
+
links: [{ rel: 'self', href: './catalog.json', type: 'application/json' }],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export async function createStacFiles(filePaths, targetPath, filename, tileMatrix, title, logger) {
|
|
130
|
+
const vectorStac = new VectorStac(logger);
|
|
131
|
+
// Prepare stac item links
|
|
132
|
+
const bboxArr = [];
|
|
133
|
+
const layersMap = new Map();
|
|
134
|
+
for (const file of filePaths) {
|
|
135
|
+
const stacPath = fsa.toUrl(`${file.href.split('.mbtiles')[0]}.json`);
|
|
136
|
+
const stac = await fsa.readJson(stacPath);
|
|
137
|
+
if (stac.bbox)
|
|
138
|
+
bboxArr.push(Bounds.fromBbox(stac.bbox));
|
|
139
|
+
const layer = zLayer.parse(stac.properties['linz_basemaps:options'].layer);
|
|
140
|
+
const name = stac.properties['linz_basemaps:options'].name;
|
|
141
|
+
const layerLink = stac.links.find((l) => l.rel === 'lds:layer' && l['lds:id'] === layer.id);
|
|
142
|
+
if (layerLink == null)
|
|
143
|
+
throw new Error(`Layer link not found for ${layer.id} in ${stacPath.href}`);
|
|
144
|
+
const existing = layersMap.get(layer.id);
|
|
145
|
+
if (existing != null) {
|
|
146
|
+
existing['basemaps:layers'].push(name);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
layersMap.set(layer.id, layerLink);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const layers = Array.from(layersMap.values());
|
|
153
|
+
// Create stac item
|
|
154
|
+
const stacItem = vectorStac.createStacItem(layers, filename, tileMatrix);
|
|
155
|
+
// Union bbox
|
|
156
|
+
const unionBound = Bounds.union(bboxArr);
|
|
157
|
+
const unionBbox = unionBound.toBbox();
|
|
158
|
+
stacItem.bbox = unionBbox;
|
|
159
|
+
stacItem.geometry = {
|
|
160
|
+
type: 'Polygon',
|
|
161
|
+
coordinates: unionBound.toPolygon(),
|
|
162
|
+
};
|
|
163
|
+
// Create stac collection
|
|
164
|
+
const stacCollection = vectorStac.createStacCollection(unionBbox, layers, filename, title);
|
|
165
|
+
// Create stac catalog
|
|
166
|
+
let stacCatalog = vectorStac.createStacCatalog();
|
|
167
|
+
const catalogPath = new URL('catalog.json', targetPath);
|
|
168
|
+
if (await fsa.exists(catalogPath))
|
|
169
|
+
stacCatalog = await fsa.readJson(catalogPath);
|
|
170
|
+
// Add link for new collection
|
|
171
|
+
stacCatalog.links.push({
|
|
172
|
+
rel: 'child',
|
|
173
|
+
href: `./${CliId}/collection.json`,
|
|
174
|
+
created: CliDate,
|
|
175
|
+
type: 'application/json',
|
|
176
|
+
});
|
|
177
|
+
const item = fsa.toUrl(`tmp/join/${filename}.json`);
|
|
178
|
+
await fsa.write(item, JSON.stringify(stacItem, null, 2));
|
|
179
|
+
const collection = fsa.toUrl('tmp/join/collection.json');
|
|
180
|
+
await fsa.write(collection, JSON.stringify(stacCollection, null, 2));
|
|
181
|
+
const catalog = fsa.toUrl('tmp/join/catalog.json');
|
|
182
|
+
await fsa.write(catalog, JSON.stringify(stacCatalog, null, 2));
|
|
183
|
+
return [item, collection, catalog];
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=stac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stac.js","sourceRoot":"","sources":["../src/stac.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { fsa, SourceMemory } from '@basemaps/shared';
|
|
2
|
+
import { CotarIndexBuilder, TarReader } from '@cotar/builder';
|
|
3
|
+
import { CotarIndex } from '@cotar/core';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
/**
|
|
6
|
+
* Create index for the COVT tar file
|
|
7
|
+
*/
|
|
8
|
+
export async function toTarIndex(input, output, logger) {
|
|
9
|
+
logger.info({ output: output }, 'Cotar.Index:Start');
|
|
10
|
+
const fd = await fs.open(input, 'r');
|
|
11
|
+
const opts = { packingFactor: 1.25, maxSearch: 50 }; // Default package rule.
|
|
12
|
+
const { buffer, count } = await CotarIndexBuilder.create(fd, opts);
|
|
13
|
+
const index = await CotarIndex.create(new SourceMemory('index', buffer));
|
|
14
|
+
await TarReader.validate(fd, index);
|
|
15
|
+
await fs.writeFile(output, buffer);
|
|
16
|
+
await fs.appendFile(input, buffer);
|
|
17
|
+
await fd.close();
|
|
18
|
+
if (!(await fsa.exists(fsa.toUrl(output))))
|
|
19
|
+
throw new Error('Error - Cotar.Index creation Failure.');
|
|
20
|
+
logger.info({ index, count }, 'Cotar.Index:Done');
|
|
21
|
+
return output;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=covt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"covt.js","sourceRoot":"","sources":["../../src/transform/covt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAW,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAqB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc,EAAE,MAAe;IAC7E,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAErD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAErC,MAAM,IAAI,GAAsB,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,wBAAwB;IAChG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAErG,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LogType } from '@basemaps/shared';
|
|
2
|
+
export interface TileTable {
|
|
3
|
+
zoom_level: number;
|
|
4
|
+
tile_column: number;
|
|
5
|
+
tile_row: number;
|
|
6
|
+
tile_data: Buffer;
|
|
7
|
+
}
|
|
8
|
+
export declare function xyzToPath(x: number | string, y: number | string, z: number | string, compressed?: boolean): string;
|
|
9
|
+
export declare function readMbTiles(fileName: string, limit: number | undefined, logger: LogType): Generator<{
|
|
10
|
+
tile: TileTable;
|
|
11
|
+
index: number;
|
|
12
|
+
total: number;
|
|
13
|
+
}, null>;
|
|
14
|
+
export declare function toTarTiles(input: string, output: string, logger: LogType, limit?: number): Promise<void>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import sq from 'node:sqlite';
|
|
2
|
+
import { createWriteStream } from 'fs';
|
|
3
|
+
import * as tar from 'tar-stream';
|
|
4
|
+
export function xyzToPath(x, y, z, compressed = true) {
|
|
5
|
+
return `tiles/${z}/${x}/${y}.pbf` + (compressed ? '.gz' : '');
|
|
6
|
+
}
|
|
7
|
+
export function* readMbTiles(fileName, limit = -1, logger) {
|
|
8
|
+
logger.debug({ file: fileName }, 'ReadMbTiles:Start');
|
|
9
|
+
const db = new sq.DatabaseSync(fileName);
|
|
10
|
+
let limitQuery = '';
|
|
11
|
+
if (limit > 0)
|
|
12
|
+
limitQuery = `LIMIT ${limit}`;
|
|
13
|
+
const getAll = db.prepare('SELECT count(*) as count FROM tiles;');
|
|
14
|
+
const totalRow = getAll.get();
|
|
15
|
+
const total = totalRow ? totalRow['count'] : 0;
|
|
16
|
+
const getTiles = db.prepare(`SELECT * FROM tiles ORDER BY zoom_level ${limitQuery}`);
|
|
17
|
+
const tiles = getTiles.all();
|
|
18
|
+
let index = 0;
|
|
19
|
+
for (const data of tiles) {
|
|
20
|
+
const tile = {
|
|
21
|
+
zoom_level: data['zoom_level'],
|
|
22
|
+
tile_column: data['tile_column'],
|
|
23
|
+
tile_row: data['tile_row'],
|
|
24
|
+
tile_data: Buffer.from(data['tile_data']),
|
|
25
|
+
};
|
|
26
|
+
yield { tile, index: index++, total };
|
|
27
|
+
}
|
|
28
|
+
logger.debug({ file: fileName }, 'ReadMbTiles:End');
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
export async function toTarTiles(input, output, logger, limit = -1) {
|
|
32
|
+
const packer = tar.pack();
|
|
33
|
+
const startTime = Date.now();
|
|
34
|
+
let writeCount = 0;
|
|
35
|
+
const writeProm = new Promise((resolve) => packer.on('end', resolve));
|
|
36
|
+
packer.pipe(createWriteStream(output));
|
|
37
|
+
let startTileTime = Date.now();
|
|
38
|
+
for await (const { tile, index, total } of readMbTiles(input, limit, logger)) {
|
|
39
|
+
if (index === 0)
|
|
40
|
+
logger.info({ path: output, count: total }, 'Covt.Tar:Start');
|
|
41
|
+
const z = tile.zoom_level;
|
|
42
|
+
const x = tile.tile_column;
|
|
43
|
+
const y = tile.tile_row;
|
|
44
|
+
const tileName = xyzToPath(x, y, z);
|
|
45
|
+
const tileData = tile.tile_data;
|
|
46
|
+
packer.entry({ name: tileName }, tileData);
|
|
47
|
+
if (writeCount % 25_000 === 0) {
|
|
48
|
+
const percent = ((writeCount / index) * 100).toFixed(2);
|
|
49
|
+
const duration = Date.now() - startTileTime;
|
|
50
|
+
startTileTime = Date.now();
|
|
51
|
+
logger.debug({ current: writeCount, total: total, percent, duration }, 'Covt.Tar:WriteTile');
|
|
52
|
+
}
|
|
53
|
+
writeCount++;
|
|
54
|
+
}
|
|
55
|
+
logger.debug('Covt.Tar:Finalize');
|
|
56
|
+
packer.finalize();
|
|
57
|
+
await writeProm;
|
|
58
|
+
logger.info({ path: output, count: writeCount, duration: Date.now() - startTime }, 'Covt.Tar:Done');
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=mbtiles.to.ttiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mbtiles.to.ttiles.js","sourceRoot":"","sources":["../../src/transform/mbtiles.to.ttiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AASlC,MAAM,UAAU,SAAS,CAAC,CAAkB,EAAE,CAAkB,EAAE,CAAkB,EAAE,UAAU,GAAG,IAAI;IACrG,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,WAAW,CAC1B,QAAgB,EAChB,KAAK,GAAG,CAAC,CAAC,EACV,MAAe;IAEf,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEtD,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC;QAAE,UAAU,GAAG,SAAS,KAAK,EAAE,CAAC;IAE7C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,QAAQ,CAAC,OAAO,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAc;YACtB,UAAU,EAAE,IAAI,CAAC,YAAY,CAAW;YACxC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAW;YAC1C,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAW;YACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAe,CAAC;SACxD,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc,EAAE,MAAe,EAAE,KAAK,GAAG,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QAC7E,IAAI,KAAK,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAE/E,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAExB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,UAAU,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;YAC5C,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC/F,CAAC;QACD,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAClC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAClB,MAAM,SAAS,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LogType } from '@basemaps/shared';
|
|
2
|
+
/**
|
|
3
|
+
* ogr2ogr GeoJSONSeq usage, return cmd for ogr2ogr
|
|
4
|
+
*
|
|
5
|
+
* @returns {cmd: string, args: string[]} cmd and arguments for ogr2ogr
|
|
6
|
+
*/
|
|
7
|
+
export declare function ogr2ogrNDJson(input: URL, output: URL, logger: LogType): Promise<void>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Epsg } from '@basemaps/geo';
|
|
2
|
+
import { Command } from '@linzjs/docker-command';
|
|
3
|
+
/**
|
|
4
|
+
* ogr2ogr GeoJSONSeq usage, return cmd for ogr2ogr
|
|
5
|
+
*
|
|
6
|
+
* @returns {cmd: string, args: string[]} cmd and arguments for ogr2ogr
|
|
7
|
+
*/
|
|
8
|
+
export async function ogr2ogrNDJson(input, output, logger) {
|
|
9
|
+
const cmd = Command.create('ogr2ogr');
|
|
10
|
+
cmd.args.push('-f', 'GeoJSONSeq');
|
|
11
|
+
cmd.args.push(output.pathname);
|
|
12
|
+
cmd.args.push('-t_srs', Epsg.Wgs84.toEpsgString());
|
|
13
|
+
cmd.args.push(input.pathname);
|
|
14
|
+
const res = await cmd.run();
|
|
15
|
+
if (res.exitCode !== 0) {
|
|
16
|
+
logger.fatal({ Gdal: res }, 'Failure');
|
|
17
|
+
throw new Error('Gdal failed to run');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ogr2ogr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ogr2ogr.js","sourceRoot":"","sources":["../../src/transform/ogr2ogr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAU,EAAE,MAAW,EAAE,MAAe;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEtC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE9B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;IAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LogType } from '@basemaps/shared';
|
|
2
|
+
import { Layer } from '../schema-loader/schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* tippecanoe usage, return cmd for tippecanoe
|
|
5
|
+
*
|
|
6
|
+
* @returns { cmd: string; args: string[] } cmd and arguments for tippecanoe docker command
|
|
7
|
+
*/
|
|
8
|
+
export declare function tippecanoe(input: URL, output: URL, layer: Layer, logger: LogType): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* tippecanoe tile-join usage, return cmd for tile-join
|
|
11
|
+
*
|
|
12
|
+
* @returns { cmd: string; args: string[] } cmd and arguments for tippecanoe tile-join docker command
|
|
13
|
+
*/
|
|
14
|
+
export declare function tileJoin(inputs: URL[], output: string, logger: LogType): Promise<void>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Epsg } from '@basemaps/geo';
|
|
2
|
+
import { urlToString } from '@basemaps/shared';
|
|
3
|
+
import { Command } from '@linzjs/docker-command';
|
|
4
|
+
import path, { dirname } from 'path';
|
|
5
|
+
/**
|
|
6
|
+
* tippecanoe usage, return cmd for tippecanoe
|
|
7
|
+
*
|
|
8
|
+
* @returns { cmd: string; args: string[] } cmd and arguments for tippecanoe docker command
|
|
9
|
+
*/
|
|
10
|
+
export async function tippecanoe(input, output, layer, logger) {
|
|
11
|
+
const cmd = Command.create('tippecanoe');
|
|
12
|
+
// parallel processing for line-delimited geojson file.
|
|
13
|
+
cmd.args.push('--read-parallel');
|
|
14
|
+
// Config projection
|
|
15
|
+
cmd.args.push('-s', Epsg.Wgs84.toEpsgString());
|
|
16
|
+
// Config detail
|
|
17
|
+
if (layer.style != null) {
|
|
18
|
+
cmd.args.push(`-Z${layer.style.minZoom}`);
|
|
19
|
+
cmd.args.push(`-z${layer.style.maxZoom}`);
|
|
20
|
+
if (layer.style.detail != null)
|
|
21
|
+
cmd.args.push(`--full-detail=${layer.style.detail}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Default to 0-15
|
|
25
|
+
cmd.args.push(`-z15`);
|
|
26
|
+
}
|
|
27
|
+
cmd.mount(dirname(input.pathname));
|
|
28
|
+
cmd.mount(dirname(output.pathname));
|
|
29
|
+
cmd.args.push('-o', output.pathname);
|
|
30
|
+
// Add tippecanoe options
|
|
31
|
+
if (layer.tippecanoe != null) {
|
|
32
|
+
for (const arg of layer.tippecanoe) {
|
|
33
|
+
cmd.args.push(arg);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
cmd.args.push(input.pathname);
|
|
37
|
+
cmd.args.push('--force');
|
|
38
|
+
const res = await cmd.run();
|
|
39
|
+
logger.debug('tippecanoe ' + cmd.args.join(' '));
|
|
40
|
+
if (res.exitCode !== 0) {
|
|
41
|
+
logger.fatal({ Tippecanoe: res }, 'Failure');
|
|
42
|
+
throw new Error('Tippecanoe Docker failed to run');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* tippecanoe tile-join usage, return cmd for tile-join
|
|
47
|
+
*
|
|
48
|
+
* @returns { cmd: string; args: string[] } cmd and arguments for tippecanoe tile-join docker command
|
|
49
|
+
*/
|
|
50
|
+
export async function tileJoin(inputs, output, logger) {
|
|
51
|
+
const cmd = Command.create('tile-join');
|
|
52
|
+
cmd.mount(path.resolve(dirname(output)));
|
|
53
|
+
cmd.args.push('-pk');
|
|
54
|
+
cmd.args.push('-o', output);
|
|
55
|
+
for (const input of inputs) {
|
|
56
|
+
if (input.href.endsWith('mbtiles')) {
|
|
57
|
+
cmd.mount(dirname(urlToString(input)));
|
|
58
|
+
cmd.args.push(urlToString(input));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
cmd.args.push('--force');
|
|
62
|
+
const res = await cmd.run();
|
|
63
|
+
if (res.exitCode !== 0) {
|
|
64
|
+
logger.fatal({ Tippecanoe: res }, 'Failure');
|
|
65
|
+
throw new Error('Tippecanoe Docker failed to run');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tippecanoe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tippecanoe.js","sourceRoot":"","sources":["../../src/transform/tippecanoe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorGeoFeature.js","sourceRoot":"","sources":["../../src/types/VectorGeoFeature.ts"],"names":[],"mappings":""}
|
package/build/util.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ReadStream } from 'fs';
|
|
2
|
+
export declare const projection: string;
|
|
3
|
+
export declare const ContentType: {
|
|
4
|
+
readonly gpkg: "application/x-ogc-gpkg";
|
|
5
|
+
readonly shp: "application/x-ogc-shp";
|
|
6
|
+
readonly geojson: "application/geo+json";
|
|
7
|
+
};
|
|
8
|
+
export declare function createReadStreamSafe(filename: string): Promise<ReadStream>;
|
|
9
|
+
export interface TmpPaths {
|
|
10
|
+
/**
|
|
11
|
+
* @example "local-cache/layerId/{layerId}_{version}_{hash}.json"
|
|
12
|
+
* @example "s3://linz-lds-cache/layerId/{layerId}_{version}_{hash}.json"
|
|
13
|
+
*/
|
|
14
|
+
origin: URL;
|
|
15
|
+
source: {
|
|
16
|
+
/** @example "tmp/create/layers/50248/50248.gpkg" */
|
|
17
|
+
path: URL;
|
|
18
|
+
/** @example "gpkg" */
|
|
19
|
+
format: keyof typeof ContentType;
|
|
20
|
+
/** @example "application/x-ogc-gpkg" */
|
|
21
|
+
contentType: (typeof ContentType)[keyof typeof ContentType];
|
|
22
|
+
};
|
|
23
|
+
/** @example "tmp/create/layers/50248/50248.ndjson" */
|
|
24
|
+
ndjson: URL;
|
|
25
|
+
/** @example "tmp/create/transform/aerialways/50248/50248-gen.ndjson" */
|
|
26
|
+
genNdjson: URL;
|
|
27
|
+
/** @example "tmp/create/transform/aerialways/50248/50248.mbtiles" */
|
|
28
|
+
mbtiles: URL;
|
|
29
|
+
/**
|
|
30
|
+
* @example "local-cache/layerId/{layerId}_{version}_{hash}.mbtiles"
|
|
31
|
+
* @example "s3://linz-lds-cache/layerId/{layerId}_{version}_{hash}.mbtiles"
|
|
32
|
+
*/
|
|
33
|
+
mbtilesCopy: URL;
|
|
34
|
+
}
|
|
35
|
+
export declare function prepareTmpPaths(tmpPath: URL, path: URL, layerId: string, format: keyof typeof ContentType, shortbreadLayer: string): TmpPaths;
|
package/build/util.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { Epsg } from '@basemaps/geo';
|
|
3
|
+
import { createReadStream } from 'fs';
|
|
4
|
+
export const projection = Epsg.Wgs84.toEpsgString();
|
|
5
|
+
export const ContentType = {
|
|
6
|
+
gpkg: 'application/x-ogc-gpkg',
|
|
7
|
+
shp: 'application/x-ogc-shp',
|
|
8
|
+
geojson: 'application/geo+json',
|
|
9
|
+
};
|
|
10
|
+
export function createReadStreamSafe(filename) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const fileStream = createReadStream(filename);
|
|
13
|
+
fileStream.on('error', reject).on('open', () => {
|
|
14
|
+
resolve(fileStream);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function prepareTmpPaths(tmpPath, path, layerId, format, shortbreadLayer) {
|
|
19
|
+
/** @example "tmp/create/layers/50248/" */
|
|
20
|
+
const LayersDir = new URL(`layers/${layerId}/`, tmpPath);
|
|
21
|
+
if (!existsSync(LayersDir)) {
|
|
22
|
+
mkdirSync(LayersDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
/** @example "tmp/create/transform/aerialways/50248/" */
|
|
25
|
+
const TransformDir = new URL(`transform/${shortbreadLayer}/${layerId}/`, tmpPath);
|
|
26
|
+
if (!existsSync(TransformDir)) {
|
|
27
|
+
mkdirSync(TransformDir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
const tmpPaths = {
|
|
30
|
+
origin: path,
|
|
31
|
+
source: {
|
|
32
|
+
path: new URL(`${layerId}.${format}`, LayersDir),
|
|
33
|
+
format,
|
|
34
|
+
contentType: ContentType[format],
|
|
35
|
+
},
|
|
36
|
+
ndjson: new URL(`${layerId}.ndjson`, LayersDir),
|
|
37
|
+
genNdjson: new URL(`${layerId}-gen.ndjson`, TransformDir),
|
|
38
|
+
mbtiles: new URL(`${layerId}.mbtiles`, TransformDir),
|
|
39
|
+
mbtilesCopy: new URL(path.href.replace(/\.json$/, '.mbtiles')),
|
|
40
|
+
};
|
|
41
|
+
return tmpPaths;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAc,MAAM,IAAI,CAAC;AAElD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,wBAAwB;IAC9B,GAAG,EAAE,uBAAuB;IAC5B,OAAO,EAAE,sBAAsB;CACvB,CAAC;AAEX,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YAC7C,OAAO,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAoCD,MAAM,UAAU,eAAe,CAC7B,OAAY,EACZ,IAAS,EACT,OAAe,EACf,MAAgC,EAChC,eAAuB;IAEvB,0CAA0C;IAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,wDAAwD;IACxD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,aAAa,eAAe,IAAI,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;IAClF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE;YACN,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,OAAO,IAAI,MAAM,EAAE,EAAE,SAAS,CAAC;YAChD,MAAM;YACN,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC;SACjC;QACD,MAAM,EAAE,IAAI,GAAG,CAAC,GAAG,OAAO,SAAS,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,IAAI,GAAG,CAAC,GAAG,OAAO,aAAa,EAAE,YAAY,CAAC;QACzD,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,OAAO,UAAU,EAAE,YAAY,CAAC;QACpD,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;KAC/D,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|