Python用matplotlib绘制栅格网格带数值时报ValueError如何解决
错误排查与解决
根因分析
rasterio的read()方法默认返回三维数组,维度结构为(波段数, 栅格高度, 栅格宽度)。你参考的原代码适配二维数组,np.ndenumerate()遍历三维数组时会返回3个索引值(波段索引、行索引、列索引),你代码中仅用(i,j)两个变量接收索引,因此触发解包报错。
修复方案
场景1:使用单波段栅格(绝大多数场景)
读取时指定读取第一个波段,将数组降为二维即可,修改array = data.read()为array = data.read(1),完整修改后代码如下:
import rasterio import numpy as np import matplotlib.pyplot as plt with rasterio.open("C:/Users/...raster.tif") as data: # 指定读取第1个波段,得到二维数组 array = data.read(1) fig, ax = plt.subplots() ax.matshow(array, cmap='Greens') ax.axis('off') for (i, j), z in np.ndenumerate(array): ax.text(j, i, '{:0.1f}'.format(z), ha='center', va='center') fig = plt.gcf() plt.savefig("C:/Users/...grid.jpeg") plt.close(fig)
场景2:使用多波段栅格
如果需要处理多波段数据,需要按波段单独绘制网格图,遍历时新增波段索引变量接收返回值,示例如下:
with rasterio.open("C:/Users/...raster.tif") as data: array = data.read() # 遍历每个波段单独绘图 for band_idx in range(array.shape[0]): band_array = array[band_idx] fig, ax = plt.subplots() ax.matshow(band_array, cmap='Greens') ax.axis('off') for (i, j), z in np.ndenumerate(band_array): ax.text(j, i, '{:0.1f}'.format(z), ha='center', va='center') plt.savefig(f"C:/Users/...grid_band{band_idx+1}.jpeg") plt.close()
内容的提问来源于stack exchange,提问作者Carina
相关产品推荐
相关产品推荐

