QGIS中无属性表栅格的植被密度类覆盖占比查询求助
QGIS大栅格植被密度类别占比计算方案
针对你提到的大栅格无属性表、无法用直方图/矢量融合方法统计的问题,以下是几个高效可行的解决方案:
方法1:使用GRASS工具r.stats(最适合超大栅格)
这是GRASS GIS内置的轻量级统计工具,无需导出大量数据,直接统计栅格类别像素数:
- 打开QGIS顶部菜单栏的「处理」→「工具箱」,搜索
r.stats并打开 - 参数配置:
- 输入栅格:选择你的植被密度栅格图层
- 勾选「Count cells」选项,开启像素数量统计
- 输出可选择「Save to file」保存为文本,或直接在「Log」面板查看结果
- 运行完成后,结果会按每个数值区间输出对应像素数,用**类别像素数 ÷ 栅格总像素数(宽×高)×100%**即可算出占比
方法2:PyQGIS脚本直接计算(无需中间文件)
通过Python脚本批量遍历类别区间,直接输出占比,避免导出数据:
- 打开QGIS的「Python控制台」(底部面板或菜单栏「Plugins」→「Python Console」)
- 粘贴以下代码,替换
layer_name为你的栅格图层名称后运行:
# 替换为你的栅格图层名称 layer_name = "植被密度栅格" layer = QgsProject.instance().mapLayersByName(layer_name)[0] # 定义5个植被密度类别区间 classes = [ ("<0.2%", -float('inf'), 0.2), ("0.2%-0.4%", 0.2, 0.4), ("0.4%-0.6%", 0.4, 0.6), ("0.6%-0.8%", 0.6, 0.8), ("0.8%-0.9%", 0.8, 0.9) ] # 计算栅格总像素数 total_pixels = layer.width() * layer.height() # 统计并输出结果 print("=== 植被密度类别占比统计 ===") for class_name, min_val, max_val in classes: # 构建栅格筛选表达式 if class_name == "<0.2%": expr = f'"{layer_name}" < {max_val}' else: expr = f'"{layer_name}" >= {min_val} AND "{layer_name}" < {max_val}' # 生成临时筛选栅格 temp_raster = processing.run("qgis:rastercalculator", { 'INPUT_A': layer, 'BAND_A': 1, 'FORMULA': expr, 'OUTPUT': 'TEMPORARY_OUTPUT' })['OUTPUT'] # 统计当前类别像素数 band_stats = temp_raster.dataProvider().bandStatistics(1, QgsRasterBandStats.All) class_pixel_count = band_stats.count - band_stats.noDataCount # 计算并打印占比 percentage = (class_pixel_count / total_pixels) * 100 print(f"{class_name}: {percentage:.2f}% (像素数:{class_pixel_count})")
方法3:重分类+区域统计(适合有研究区边界的场景)
如果你有指定的研究区矢量边界,可先对栅格重分类再统计:
- 栅格重分类:
- 在工具箱搜索
Reclassify by table,打开后设置:- 输入栅格:你的植被密度栅格
- 重分类表:按你的5个区间映射为整数(例如<0.2%→1,0.2-0.4%→2,以此类推)
- 输出保存为临时栅格
- 在工具箱搜索
- 区域统计:
- 搜索
Zonal Statistics,设置:- 输入矢量图层:研究区边界
- 输入栅格图层:重分类后的栅格
- 勾选「Count」统计项
- 运行后,矢量属性表会新增每个类别的像素数,再结合总像素数计算占比
- 搜索
为什么之前的方法失效?
栅格转矢量再融合的方式,会因大栅格的拓扑复杂度导致精度丢失、运算崩溃,且无法保证类别映射准确,因此不推荐用于超大栅格的统计需求。
内容的提问来源于stack exchange,提问作者Heather Shaw
相关产品推荐
相关产品推荐

