You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rasterstats的zonal_stats遇width and height must be >0错误求助

解决rasterstats zonal_stats报错及统计值为None的问题

我需要用Python的rasterstats包中的zonal_stats函数,批量从.tif栅格文件提取.shp矢量文件中每个面要素的栅格统计值(QGIS中可正常执行,但需处理200+文件,故需自动化)。

初始代码

import rasterio
import geopandas as gpd
import numpy as np
from rasterio.plot import show
from rasterstats import zonal_stats
from rasterio.transform import Affine


# 导入栅格文件
raster = rasterio.open(r'M:\PUBLIC\Felipe Dias\Pesquisa\Interpolação Espacial\Arroz_2019-03.tif')

# 读取栅格数值
array = raster.read(1)

# 获取仿射变换参数
affine = raster.transform

# 导入矢量文件
shapefile =  gpd.read_file(r'M:\PUBLIC\Felipe Dias\Pesquisa\Interpolação Espacial\Setores_Censit_SP_WGS84.shp')

# 计算分区统计
zs_shapefile = zonal_stats(shapefile, array, affine = affine,
                        stats=['min', 'max', 'mean', 'median', 'majority'])

运行报错

Input In [1] in <cell line: 22>
    zs_shapefile = zonal_stats(shapefile, array, affine = affine,

  File ~\Anaconda3\lib\site-packages\rasterstats\main.py:32 in zonal_stats
    return list(gen_zonal_stats(*args, **kwargs))

  File ~\Anaconda3\lib\site-packages\rasterstats\main.py:164 in gen_zonal_stats
    rv_array = rasterize_geom(geom, like=fsrc, all_touched=all_touched)

  File ~\Anaconda3\lib\site-packages\rasterstats\utils.py:41 in rasterize_geom
    rv_array = features.rasterize(

  File ~\Anaconda3\lib\site-packages\rasterio\env.py:387 in wrapper
    return f(*args, **kwds)

  File ~\Anaconda3\lib\site-packages\rasterio\features.py:353 in rasterize
    raise ValueError("width and height must be > 0")

尝试的解决方案及新问题

我尝试修改栅格的Affine符号,代码如下:

''' 尝试修改Affine参数 '''

old_tif = rasterio.open(r'M:\PUBLIC\Felipe Dias\Pesquisa\Interpolação Espacial\Arroz_2019-03.tif')
print(old_tif.profile) # 复制输出并修改符号

new_tif_profile = old_tif.profile

# 原Affine参数:
# Affine(0.004611149999999995, 0.0, -46.828504575,
#        0.0, 0.006521380000000008, -24.01169169)


new_tif_profile['transform'] = Affine(0.004611149999999995, 0.0, -46.828504575,
                                      0.0, -0.006521380000000008, 24.01169169)

new_tif_array = old_tif.read(1)
new_tif_array = np.fliplr(np.flip(new_tif_array))

with rasterio.open(r'M:\PUBLIC\Felipe Dias\Pesquisa\Interpolação Espacial\tentativa.tif', "w", **new_tif_profile) as dest:
    dest.write(new_tif_array, indexes=1)


dem = rasterio.open(r'M:\PUBLIC\Felipe Dias\Pesquisa\Interpolação Espacial\tentativa.tif')

# 读取栅格数值
array = dem.read(1)

# 获取仿射变换参数
affine = dem.transform

# 导入矢量文件
shapefile =  gpd.read_file(r'M:\PUBLIC\Felipe Dias\Pesquisa\Interpolação Espacial\Setores_Censit_SP_WGS84.shp')

# 计算分区统计
zs_shapefile = zonal_stats(shapefile, array, affine=affine,
                        stats=['min', 'max', 'mean', 'median', 'majority'])

修改后不再出现"width and height must be >0"错误,但zs_shapefile中的所有统计值均为None,无法满足需求。

请问该错误的原因是什么?我需要修改哪个符号才能解决问题?


内容的提问来源于stack exchange,提问作者femdias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:20:18