UNPKG

@seasketch/geoprocessing

Version:

Geoprocessing and reporting framework for SeaSketch 2.0

121 lines 4.85 kB
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