move output after finishing

move-after
Mike Barry 2022-06-25 05:54:21 -04:00
rodzic ad567b192a
commit 51c5966969
1 zmienionych plików z 21 dodań i 12 usunięć

Wyświetl plik

@ -27,6 +27,7 @@ import com.onthegomap.planetiler.util.Wikidata;
import com.onthegomap.planetiler.worker.RunnableThatThrows; import com.onthegomap.planetiler.worker.RunnableThatThrows;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
@ -78,7 +79,8 @@ public class Planetiler {
private final PlanetilerConfig config; private final PlanetilerConfig config;
private FeatureGroup featureGroup; private FeatureGroup featureGroup;
private OsmInputFile osmInputFile; private OsmInputFile osmInputFile;
private Path output; private Path tmpOutput;
private Path finalOutput;
private boolean overwrite = false; private boolean overwrite = false;
private boolean ran = false; private boolean ran = false;
// most common OSM languages // most common OSM languages
@ -103,6 +105,7 @@ public class Planetiler {
downloadSources = onlyDownloadSources || arguments.getBoolean("download", "download sources", false); downloadSources = onlyDownloadSources || arguments.getBoolean("download", "download sources", false);
nodeDbPath = arguments.file("temp_nodes", "temp node db location", tmpDir.resolve("node.db")); nodeDbPath = arguments.file("temp_nodes", "temp node db location", tmpDir.resolve("node.db"));
tmpOutput = arguments.file("temp_mbtiles", "temp mbtiles location", tmpDir.resolve("temp.mbtiles"));
multipolygonPath = multipolygonPath =
arguments.file("temp_multipolygons", "temp multipolygon db location", tmpDir.resolve("multipolygon.db")); arguments.file("temp_multipolygons", "temp multipolygon db location", tmpDir.resolve("multipolygon.db"));
featureDbPath = arguments.file("temp_features", "temp feature db location", tmpDir.resolve("feature.db")); featureDbPath = arguments.file("temp_features", "temp feature db location", tmpDir.resolve("feature.db"));
@ -422,7 +425,7 @@ public class Planetiler {
* @see MbtilesWriter * @see MbtilesWriter
*/ */
public Planetiler setOutput(String argument, Path fallback) { public Planetiler setOutput(String argument, Path fallback) {
this.output = arguments.file(argument, "mbtiles output file", fallback); this.finalOutput = arguments.file(argument, "mbtiles output file", fallback);
return this; return this;
} }
@ -453,7 +456,7 @@ public class Planetiler {
if (profile() == null) { if (profile() == null) {
throw new IllegalArgumentException("No profile specified"); throw new IllegalArgumentException("No profile specified");
} }
if (output == null) { if (finalOutput == null) {
throw new IllegalArgumentException("No output specified"); throw new IllegalArgumentException("No output specified");
} }
if (stages.isEmpty()) { if (stages.isEmpty()) {
@ -465,17 +468,18 @@ public class Planetiler {
ran = true; ran = true;
MbtilesMetadata mbtilesMetadata = new MbtilesMetadata(profile, config.arguments()); MbtilesMetadata mbtilesMetadata = new MbtilesMetadata(profile, config.arguments());
FileUtils.deleteFile(tmpOutput);
if (arguments.getBoolean("help", "show arguments then exit", false)) { if (arguments.getBoolean("help", "show arguments then exit", false)) {
System.exit(0); System.exit(0);
} else if (onlyDownloadSources) { } else if (onlyDownloadSources) {
// don't check files if not generating map // don't check files if not generating map
} else if (overwrite || config.force()) { } else if (overwrite || config.force()) {
FileUtils.deleteFile(output); FileUtils.deleteFile(tmpOutput);
} else if (Files.exists(output)) { } else if (Files.exists(finalOutput)) {
throw new IllegalArgumentException(output + " already exists, use the --force argument to overwrite."); throw new IllegalArgumentException(finalOutput + " already exists, use the --force argument to overwrite.");
} }
LOGGER.info("Building {} profile into {} in these phases:", profile.getClass().getSimpleName(), output); LOGGER.info("Building {} profile into {} in these phases:", profile.getClass().getSimpleName(), finalOutput);
if (!toDownload.isEmpty()) { if (!toDownload.isEmpty()) {
LOGGER.info(" download: Download sources {}", toDownload.stream().map(d -> d.id).toList()); LOGGER.info(" download: Download sources {}", toDownload.stream().map(d -> d.id).toList());
@ -492,13 +496,13 @@ public class Planetiler {
} }
} }
LOGGER.info(" sort: Sort rendered features by tile ID"); LOGGER.info(" sort: Sort rendered features by tile ID");
LOGGER.info(" mbtiles: Encode each tile and write to {}", output); LOGGER.info(" mbtiles: Encode each tile and write to {} then {}", tmpOutput, finalOutput);
} }
// in case any temp files are left from a previous run... // in case any temp files are left from a previous run...
FileUtils.delete(tmpDir, nodeDbPath, featureDbPath, multipolygonPath); FileUtils.delete(tmpDir, nodeDbPath, featureDbPath, multipolygonPath);
Files.createDirectories(tmpDir); Files.createDirectories(tmpDir);
FileUtils.createParentDirectories(nodeDbPath, featureDbPath, multipolygonPath, output); FileUtils.createParentDirectories(nodeDbPath, featureDbPath, multipolygonPath, tmpOutput, finalOutput);
if (!toDownload.isEmpty()) { if (!toDownload.isEmpty()) {
download(); download();
@ -529,7 +533,7 @@ public class Planetiler {
stats.monitorFile("nodes", nodeDbPath); stats.monitorFile("nodes", nodeDbPath);
stats.monitorFile("features", featureDbPath); stats.monitorFile("features", featureDbPath);
stats.monitorFile("multipolygons", multipolygonPath); stats.monitorFile("multipolygons", multipolygonPath);
stats.monitorFile("mbtiles", output); stats.monitorFile("mbtiles", tmpOutput);
for (Stage stage : stages) { for (Stage stage : stages) {
stage.task.run(); stage.task.run();
@ -546,9 +550,13 @@ public class Planetiler {
featureGroup.prepare(); featureGroup.prepare();
MbtilesWriter.writeOutput(featureGroup, output, mbtilesMetadata, config, stats); MbtilesWriter.writeOutput(featureGroup, tmpOutput, mbtilesMetadata, config, stats);
overallTimer.stop(); overallTimer.stop();
var moveTimer = stats.startStage("move");
LOGGER.info("Moving output from {} to {}", tmpOutput, finalOutput);
Files.move(tmpOutput, finalOutput, StandardCopyOption.REPLACE_EXISTING);
moveTimer.stop();
LOGGER.info("FINISHED!"); LOGGER.info("FINISHED!");
stats.printSummary(); stats.printSummary();
stats.close(); stats.close();
@ -572,7 +580,8 @@ public class Planetiler {
readPhase.addDisk(featureDbPath, featureSize, "temporary feature storage"); readPhase.addDisk(featureDbPath, featureSize, "temporary feature storage");
writePhase.addDisk(featureDbPath, featureSize, "temporary feature storage"); writePhase.addDisk(featureDbPath, featureSize, "temporary feature storage");
// output only needed during write phase // output only needed during write phase
writePhase.addDisk(output, outputSize, "mbtiles output"); writePhase.addDisk(tmpOutput, outputSize, "mbtiles output");
writePhase.addDisk(finalOutput, outputSize, "mbtiles output");
// if the user opts to remove an input source after reading to free up additional space for the output... // if the user opts to remove an input source after reading to free up additional space for the output...
for (var input : inputPaths) { for (var input : inputPaths) {
if (input.freeAfterReading()) { if (input.freeAfterReading()) {