diff --git a/src/rasterstats/main.py b/src/rasterstats/main.py index 5c9eb68..3d804cd 100644 --- a/src/rasterstats/main.py +++ b/src/rasterstats/main.py @@ -213,8 +213,26 @@ def gen_zonal_stats( feature_stats['max'] = float(masked.max()) if 'mean' in stats: feature_stats['mean'] = float(masked.mean()) + + stats_count = int(masked.count()) if 'count' in stats: - feature_stats['count'] = int(masked.count()) + feature_stats['count'] = stats_count + + if 'area' in stats: + if rast.src is not None: + cellsize = rast.src.res[0] * rast.src.res[1] + else: + cellsize = rast.affine.a * rast.affine.a + feature_stats['area'] = stats_count * cellsize + + if 'area_percent' in stats: + if rast.src is not None: + cellsize = rast.src.res[0] * rast.src.res[1] + else: + cellsize = rast.affine.a * rast.affine.a + feature_stats['area_percent'] = stats_count * cellsize / geom.area + + # optional if 'sum' in stats: feature_stats['sum'] = float(masked.sum()) diff --git a/src/rasterstats/utils.py b/src/rasterstats/utils.py index c3ad76f..846d8ca 100644 --- a/src/rasterstats/utils.py +++ b/src/rasterstats/utils.py @@ -9,7 +9,7 @@ DEFAULT_STATS = ['count', 'min', 'max', 'mean'] VALID_STATS = DEFAULT_STATS + \ - ['sum', 'std', 'median', 'majority', 'minority', 'unique', 'range', 'nodata', 'nan'] + ['sum', 'std', 'median', 'majority', 'minority', 'unique', 'range', 'nodata', 'nan', 'area', 'area_percent'] # also percentile_{q} but that is handled as special case