@seasketch/geoprocessing
Version:
Geoprocessing and reporting framework for SeaSketch 2.0
50 lines • 2.36 kB
JavaScript
import path from "node:path";
import { $ } from "zx";
import fs from "fs-extra";
import { getDatasetBucketName } from "../../../src/datasources/index.js";
import { genRasterConfig } from "./genRasterConfig.js";
import { createOrUpdateDatasource } from "./datasources.js";
import { publishDatasource } from "./publishDatasource.js";
$.verbose = true;
export async function importRasterDatasource(projectClient, options, extraOptions) {
const { newDatasourcePath, newDstPath, doPublish = false } = extraOptions;
const config = await genRasterConfig(projectClient, options, newDstPath);
// Ensure dstPath is created
fs.ensureDirSync(config.dstPath);
await genCog(config);
if (doPublish) {
await Promise.all(config.formats.map((format) => {
return publishDatasource(config.dstPath, format, config.datasourceId, getDatasetBucketName(config));
}));
}
const timestamp = new Date().toISOString();
const newVectorD = {
src: config.src,
band: config.band,
geo_type: "raster",
datasourceId: config.datasourceId,
formats: config.formats,
created: timestamp,
lastUpdated: timestamp,
noDataValue: config.noDataValue,
measurementType: config.measurementType,
precalc: config.precalc,
};
await createOrUpdateDatasource(newVectorD, newDatasourcePath);
return newVectorD;
}
export async function genCog(config) {
const { src } = config;
const warpDst = getCogPath(config.dstPath, config.datasourceId, "_4326");
const dst = getCogPath(config.dstPath, config.datasourceId);
// reproject
await $ `gdalwarp -t_srs "EPSG:6933" -dstnodata ${config.noDataValue} --config GDAL_PAM_ENABLED NO --config GDAL_CACHEMAX 500 -wm 500 -multi -wo NUM_THREADS=ALL_CPUS ${src} ${warpDst}`;
// cloud-optimize
await $ `gdal_translate -b ${config.band} -r nearest --config GDAL_PAM_ENABLED NO --config GDAL_CACHEMAX 500 -co COMPRESS=LZW -co NUM_THREADS=ALL_CPUS -of COG -stats ${warpDst} ${dst}`;
await $ `rm ${warpDst}`;
}
/** Returns a full pathname to a COG given dst path, datasourceID, and optional postfix name */
export function getCogPath(dstPath, datasourceId, postfix) {
return path.join(dstPath, datasourceId) + (postfix ? postfix : "") + ".tif";
}
//# sourceMappingURL=importRasterDatasource.js.map