in common/src/main/java/org/apache/sedona/common/raster/RasterBandAccessors.java [215:267]
public static Double getZonalStats(
GridCoverage2D raster,
Geometry roi,
int band,
String statType,
boolean allTouched,
boolean excludeNoData,
boolean lenient)
throws FactoryException {
List<Object> objects = getStatObjects(raster, roi, band, allTouched, excludeNoData, lenient);
if (objects == null) {
return null;
}
DescriptiveStatistics stats = (DescriptiveStatistics) objects.get(0);
double[] pixelData = (double[]) objects.get(1);
switch (statType.toLowerCase()) {
case "sum":
if (pixelData.length == 0) {
return null;
} else {
return stats.getSum();
}
case "average":
case "avg":
case "mean":
double mean = stats.getMean();
return Double.isNaN(mean) ? null : mean;
case "count":
return (double) stats.getN();
case "max":
double max = stats.getMax();
return Double.isNaN(max) ? null : max;
case "min":
double min = stats.getMin();
return Double.isNaN(min) ? null : min;
case "stddev":
case "sd":
double stdDev = stats.getStandardDeviation();
return Double.isNaN(stdDev) ? null : stdDev;
case "median":
double median = stats.getPercentile(50);
return Double.isNaN(median) ? null : median;
case "mode":
return zonalMode(pixelData);
case "variance":
double variance = stats.getVariance();
return Double.isNaN(variance) ? null : variance;
default:
throw new IllegalArgumentException(
"Please select from the accepted options. Some of the valid options are sum, mean, stddev, etc.");
}
}