From 73260a384982b48131169dfc0f68d7a3e7135457 Mon Sep 17 00:00:00 2001 From: JerryYang Date: Sun, 22 Jul 2018 22:05:37 +0800 Subject: [PATCH 1/2] add area & area_percent statistics --- src/rasterstats/main.py | 16 ++++++++++++++++ src/rasterstats/utils.py | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/rasterstats/main.py b/src/rasterstats/main.py index 5c9eb68..fcbae1e 100644 --- a/src/rasterstats/main.py +++ b/src/rasterstats/main.py @@ -215,6 +215,22 @@ def gen_zonal_stats( feature_stats['mean'] = float(masked.mean()) if 'count' in stats: feature_stats['count'] = int(masked.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'] = feature_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'] = feature_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 From cfa3bdbc8f5a45ad8238040a1350e9348a6dbaaf Mon Sep 17 00:00:00 2001 From: JerryYang Date: Mon, 23 Jul 2018 07:09:58 +0800 Subject: [PATCH 2/2] count is not necessary for area and area_percent --- src/rasterstats/main.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rasterstats/main.py b/src/rasterstats/main.py index fcbae1e..3d804cd 100644 --- a/src/rasterstats/main.py +++ b/src/rasterstats/main.py @@ -213,22 +213,24 @@ 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] + cellsize = rast.src.res[0] * rast.src.res[1] else: cellsize = rast.affine.a * rast.affine.a - feature_stats['area'] = feature_stats['count']*cellsize + 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] + cellsize = rast.src.res[0] * rast.src.res[1] else: cellsize = rast.affine.a * rast.affine.a - feature_stats['area_percent'] = feature_stats['count']*cellsize / geom.area + feature_stats['area_percent'] = stats_count * cellsize / geom.area # optional