@seasketch/geoprocessing
Version:
Geoprocessing and reporting framework for SeaSketch 2.0
121 lines • 4.85 kB
JavaScript
import { isFeatureCollection, isSketch, isSketchCollection, } from "../helpers/index.js";
import { featureEach } from "@turf/turf";
import { rasterStats } from "./geoblaze/index.js";
import { rasterStatsToMetrics } from "./geoblaze/rasterStatsToMetrics.js";
/**
* Calculates summary metrics (stats/area) on given raster, optionally intersecting raster with provided feature (zonal statistics).
* If feature is a collection, then calculate metrics for each individual feature as well as the collection as a whole.
* This can be disabled with includeChildMetrics: false. Defaults to assuming a continuous raster but also supports categorical option
*/
export async function rasterMetrics(
/** Cloud-optimized geotiff, loaded via loadCog or geoblaze.parse() */
raster, options = {}) {
const { metricId, metricIdPrefix, feature = options.feature, bandMetricProperty, bandMetricValues, includeChildMetrics = true, categorical = false, categoryMetricProperty = "classId", categoryMetricValues, ...statOptions } = options;
let metrics = [];
// Feature/Sketch level metrics
const promises = [];
const features = [];
const numBands = bandMetricValues ? Object.keys(bandMetricValues).length : 1;
if (feature) {
if (includeChildMetrics) {
featureEach(feature, async (curSketch) => {
// accumulate individual feature/sketch level stat promises
promises.push(rasterStats(raster, {
feature: curSketch,
numBands,
categorical,
categoryMetricProperty,
categoryMetricValues,
...statOptions,
}));
features.push(curSketch);
});
// convert individual feature/sketch level stats to metrics
for (const [index, curStats] of (await Promise.all(promises)).entries()) {
const curFeature = features[index];
const metricPartial = (() => {
if (isSketch(curFeature)) {
return {
sketchId: curFeature.properties.id,
extra: {
sketchName: curFeature.properties.name,
},
};
}
else {
return {};
}
})();
const curMetrics = rasterStatsToMetrics(curStats, {
metricId,
metricIdPrefix,
metricPartial,
bandMetricProperty,
bandMetricValues,
categorical,
categoryMetricProperty,
categoryMetricValues,
});
metrics = metrics.concat(curMetrics);
}
}
// SketchCollection level metrics
if (isFeatureCollection(feature)) {
const collStats = await rasterStats(raster, {
feature: options?.feature,
numBands,
categorical,
categoryMetricProperty,
categoryMetricValues,
...statOptions,
});
const metricPartial = (() => {
if (isSketchCollection(feature)) {
return {
sketchId: feature.properties.id,
extra: {
sketchName: feature.properties.name,
isCollection: true,
},
};
}
else {
return {};
}
})();
const collMetrics = rasterStatsToMetrics(collStats, {
metricId,
metricIdPrefix,
metricPartial,
bandMetricProperty,
bandMetricValues,
categorical,
categoryMetricProperty,
categoryMetricValues,
});
metrics = metrics.concat(collMetrics);
}
}
else {
// Whole raster metrics (no sketch)
const wholeStats = await rasterStats(raster, {
numBands,
categorical,
categoryMetricProperty,
categoryMetricValues,
...statOptions,
});
const wholeMetrics = rasterStatsToMetrics(wholeStats, {
metricId,
metricIdPrefix,
bandMetricProperty,
bandMetricValues,
categorical,
categoryMetricProperty,
categoryMetricValues,
});
metrics = metrics.concat(wholeMetrics);
}
return metrics;
}
//# sourceMappingURL=rasterMetrics.js.map