Skip to content

Commit

Permalink
Adds categoryMetricProperty
Browse files Browse the repository at this point in the history
  • Loading branch information
avmey committed Mar 13, 2024
1 parent 6c03c7e commit a9cd9d6
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 23 deletions.
16 changes: 10 additions & 6 deletions packages/geoprocessing/src/toolbox/geoblaze/rasterStats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import {
GEOBLAZE_RASTER_STATS,
Sketch,
SketchCollection,
MetricDimension,
} from "../../types";
import { Feature, MultiPolygon, FeatureCollection } from "@turf/helpers";
import geoblaze, { Georaster } from "geoblaze";
import { StatsObject, CalcStatsOptions } from "../../types/geoblaze";
import { toRasterProjection, defaultStatValues } from "./geoblaze";
import { forEach } from "lodash";

/**
* options accepted by rasterStats
Expand All @@ -25,9 +25,12 @@ export interface RasterStatsOptions extends CalcStatsOptions {
filterFn?: (cellValue: number) => boolean;
/** Optional number of bands in the raster, defaults to 1, used to initialize zero values */
numBands?: number;
/** For categorical rasters, category is equal to the classId in metricGroup */
/** If categorical raster, set to true */
categorical?: boolean;
categoryClassValues?: string[];
/** If categorical raster, metric property name that categories are organized. Defaults to classId */
categoryMetricProperty?: MetricDimension;
/** If categorical raster, array of values to create metrics for */
categoryMetricValues?: string[];
}

/**
Expand All @@ -46,7 +49,8 @@ export const rasterStats = async (
feature,
filterFn,
categorical = false,
categoryClassValues,
categoryMetricProperty = "classId",
categoryMetricValues,
...restCalcOptions
} = options;

Expand Down Expand Up @@ -84,10 +88,10 @@ export const rasterStats = async (
})
).map((h: any) => {
let hist = {};
if (!categoryClassValues || categoryClassValues.length === 0) {
if (!categoryMetricValues || categoryMetricValues.length === 0) {
return { histogram: h };
} else {
categoryClassValues.forEach((c) => (hist[c] = h[c] ?? 0));
categoryMetricValues.forEach((c) => (hist[c] = h[c] ?? 0));
return { histogram: hist };
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export const rasterStatsToMetrics = (
? categoryClassValues.forEach((category) => {
metrics.push(
createMetric({
metricId: "valid" ?? `${metricIdPrefix}valid`,
metricId: metricIdPrefix ? `${metricIdPrefix}valid` : "valid",
value: truncate
? roundDecimal(value[category], 6, {
keepSmallValues: true,
Expand All @@ -74,7 +74,7 @@ export const rasterStatsToMetrics = (
: Object.keys(value).forEach((category) => {
metrics.push(
createMetric({
metricId: "valid" ?? `${metricIdPrefix}valid`,
metricId: metricIdPrefix ? `${metricIdPrefix}valid` : "valid",
value: truncate
? roundDecimal(value[category], 6, {
keepSmallValues: true,
Expand Down
5 changes: 3 additions & 2 deletions packages/geoprocessing/src/toolbox/rasterMetrics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,10 @@ describe("rasterMetrics tests", () => {
);
const metrics = await rasterMetrics(raster, {
categorical: true,
categoryClassValues: ["1"],
categoryMetricValues: ["1"],
});
expect(metrics.length).toBe(1);
expect(metrics[0].classId).toBe("1");
expect(metrics[0].value).toBe(2);
expect(metrics[0].metricId).toEqual("valid");
});
Expand All @@ -107,7 +108,7 @@ describe("rasterMetrics tests", () => {
const metrics = await rasterMetrics(raster, {
feature: fix.topRightPoly,
categorical: true,
categoryClassValues: ["1"],
categoryMetricValues: ["1"],
});
expect(metrics.length).toBe(1);
expect(metrics[0].value).toBe(0);
Expand Down
27 changes: 15 additions & 12 deletions packages/geoprocessing/src/toolbox/rasterMetrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { rasterStatsToMetrics } from "./geoblaze/rasterStatsToMetrics";

// @ts-ignore
import { Georaster } from "geoblaze";
import { createMetric } from "../metrics";

interface OverlapRasterOptions extends RasterStatsOptions {
/** Optional metricId to be assigned. Don't use if you are calculating more than one stat because you won't be able to tell them apart */
Expand All @@ -20,10 +19,12 @@ interface OverlapRasterOptions extends RasterStatsOptions {
/** If multi-band raster, object mapping band number (starting with 0 index) to unique ID value eg. { 0: 'mangroves', 1: 'coral' }. Defaults to 'band 1', 'band 2' */
bandMetricValues?: string[];
includeChildMetrics?: boolean;
/** If categorical raster, get categoryClassValues (in metric group as classIds) from raster histogram */
/** If categorical raster, set to true */
categorical?: boolean;
/** If categorical raster, metric property name that categories are organized. Defaults to classId */
categoryMetricProperty?: MetricDimension;
categoryClassValues?: string[];
/** If categorical raster, array of values to create metrics for */
categoryMetricValues?: string[];
}

/**
Expand All @@ -43,8 +44,8 @@ export async function rasterMetrics(
bandMetricValues,
includeChildMetrics = true,
categorical = false,
categoryMetricProperty,
categoryClassValues,
categoryMetricProperty = "classId",
categoryMetricValues,
...statOptions
} = options;
let metrics: Metric[] = [];
Expand All @@ -64,7 +65,8 @@ export async function rasterMetrics(
feature: curSketch,
numBands,
categorical,
categoryClassValues,
categoryMetricProperty,
categoryMetricValues,
...(statOptions ?? {}),
})
);
Expand Down Expand Up @@ -95,7 +97,7 @@ export async function rasterMetrics(
bandMetricValues,
categorical,
categoryMetricProperty,
categoryMetricValues: categoryClassValues,
categoryMetricValues,
});
metrics = metrics.concat(curMetrics);
});
Expand All @@ -107,7 +109,8 @@ export async function rasterMetrics(
feature: options?.feature,
numBands,
categorical,
categoryClassValues,
categoryMetricProperty,
categoryMetricValues,
...(statOptions ?? {}),
});

Expand All @@ -133,7 +136,7 @@ export async function rasterMetrics(
bandMetricValues,
categorical,
categoryMetricProperty,
categoryMetricValues: categoryClassValues,
categoryMetricValues,
});
metrics = metrics.concat(collMetrics);
}
Expand All @@ -142,10 +145,10 @@ export async function rasterMetrics(
const wholeStats = await rasterStats(raster, {
numBands,
categorical,
categoryClassValues,
categoryMetricProperty,
categoryMetricValues,
...(statOptions ?? {}),
});
console.log(wholeStats);

const wholeMetrics = rasterStatsToMetrics(wholeStats, {
metricId,
Expand All @@ -154,7 +157,7 @@ export async function rasterMetrics(
bandMetricValues,
categorical,
categoryMetricProperty,
categoryMetricValues: categoryClassValues,
categoryMetricValues,
});
metrics = metrics.concat(wholeMetrics);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/geoprocessing/src/types/geoblaze.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export const GEOBLAZE_RASTER_STATS: ReadonlyArray<string> = [
export type GEOBLAZE_RASTER_STAT = typeof GEOBLAZE_RASTER_STATS[number];

/** Additional raster stats calculated by geoprocessing library */
export const EXTRA_RASTER_STATS: ReadonlyArray<string> = ["area"];
export const EXTRA_RASTER_STATS: ReadonlyArray<string> = ["area", "histogram"];
export type EXTRA_RASTER_STAT = typeof EXTRA_RASTER_STATS[number];

/** Combined raster stats supported by geoprocessing library */
Expand Down

0 comments on commit a9cd9d6

Please sign in to comment.