From a23b829e4494ea2fc40d3c3d6a28addbb05bfd76 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 31 Jul 2025 11:57:23 +0200 Subject: [PATCH] Scripts(offline): skip already existing columns --- scripts/generatePmTilesExtracts.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/scripts/generatePmTilesExtracts.ts b/scripts/generatePmTilesExtracts.ts index 99e1556bc..48c26b231 100644 --- a/scripts/generatePmTilesExtracts.ts +++ b/scripts/generatePmTilesExtracts.ts @@ -3,6 +3,7 @@ import { Tiles } from "../src/Models/TileRange" import { OfflineBasemapManager } from "../src/service-worker/OfflineBasemapManager" import { spawn } from "child_process" +import { existsSync } from "fs" class GeneratePmTilesExtracts extends Script { @@ -33,18 +34,27 @@ class GeneratePmTilesExtracts extends Script { if(maxzoom !== undefined){ maxzoomflag = " --maxzoom="+maxzoom } - return this.startProcess(`extract planet-latest.pmtiles --download-threads=1 --minzoom=${z}${maxzoomflag} --bbox=${[min_lon, min_lat + 0.0001, max_lon, max_lat].join(",")} ${z}-${x}-${y}.pmtiles`) + return this.startProcess(`extract planet-latest.pmtiles --download-threads=1 --minzoom=${z}${maxzoomflag} --bbox=${[min_lon, min_lat + 0.0001, max_lon, max_lat].join(",")} ${this.getFilename(z, x, y)}`) } private* generateField(z: number, maxzoom?: number): Generator> { const boundary = 2 << (z - 1) for (let x = 0; x < boundary; x++) { + if (existsSync(this.getFilename(z, x, boundary))) { + // Skip this column, already exists + console.log("Skipping column ", x, "at zoom", z) + continue + } for (let y = 0; y < boundary; y++) { yield this.generateArchive(z, x, y, maxzoom) } } } + private getFilename(z: number, x: number, y: number) { + return `${z}-${x}-${y}.pmitles` + } + private* generateAll(): Generator> { const zoomlevels: Record = OfflineBasemapManager.zoomelevels for (const key in zoomlevels) { @@ -74,6 +84,12 @@ class GeneratePmTilesExtracts extends Script { console.log("Please specify a target directory") return } + let estimate = 0 + for (const key in OfflineBasemapManager.zoomelevels) { + const z: number = Number(key) + const boundary = 2 << (z - 1) + estimate += boundary * boundary + } console.log("Target dir is:", this.targetDir) const numberOfThreads = 512 const generator = this.generateAll() @@ -83,7 +99,8 @@ class GeneratePmTilesExtracts extends Script { batch = this.createBatch(generator, numberOfThreads) await Promise.all(batch) done += batch.length - console.log("Completed", numberOfThreads, "processes; finished: " + done) + const perc = ("" + ((done / estimate) / 100)).substring(0, 5) + console.log("Completed", numberOfThreads, `processes; ${done} / ${estimate}, ${perc}%`) } while (batch.length > 0) }