简介这是一份面向景观生态学研究者的景观格局指数速查表系统梳理了面积指标、密度大小及差异、边缘指标、形状指标四大类常见指数。每个指标均给出英文缩写、全称、应用尺度、单位与取值范围例如斑块面积 AREA、斑块数量 NP、边缘对比度 EDCON、分维数 FRACT、景观形状指数 LSI 等覆盖斑块、类型、景观三个层级。配套说明还列出了核心面积指标及统计变量可直接用于 Fragstats、ArcGIS 等软件的参数查阅。资源为 1 个 PDF 电子文档大小仅 12KB便于离线对照。目前已有 2013 人浏览学习。对撰写生态学论文、开展土地利用格局分析或完成课程作业的读者来说是一份高效精炼的参考工具。1. 一份“景观格局指数.pdf”背后是栅格计算链路景观格局指数.pdf 看起来只是一份报告文件但真正要交付的不是 PDF 排版而是从 landcover 栅格里算出可靠数字的整条链路。任何景观格局指数都建立在分类栅格之上指数本身的含义全靠那一格一格的数值去解释同一份栅格换一种邻域定义或者漏掉背景值处理算出来的 NP、ED、SHDI 就可能完全不同。常见做法是把这套流程拆成三段拿到分类后的栅格数据选一个能批量算景观格局指数的工具再把结果整理成可交付的 PDF。最容易出问题的是中段因为景观格局指数不是一个函数而是一组定义在不同空间层级上的度量族斑块面积、数量密度、边界长度、邻接关系、多样性都各有各的计算规则。这篇博文按“指标体系 → 工具选型 → 实际计算 → 数值校验 → 渲染成 PDF”的顺序展开直接落到 PyLandStats 和命令行工具上让你照着就能把一份“景观格局指数.pdf”从零做出来。新手可以跟上步骤熟手关注参数边界和那些最容易让结果不可复现的口径问题。2. 景观格局指数的三类指标与四条工具路线2.1 三档指标体系斑块、类别与景观层面的度量景观格局指数不是一个独立的统计量而是按空间层级组织的。最低一层是斑块patch也就是每个独立图斑自己的属性中间一层是类别class按地物类型聚合最高一层是整个景观 (landscape)。做成 PDF 报告时三层的表通常都会出现但用途完全不同。斑块层级常用的是 AREA图斑面积、PERIMETER图斑周长、GYRATE回转半径它们用于描述单个图斑不适合做全局比较。类别层级适合回答“这个类别占了多大比例、碎不碎、边界复不复杂”常见指标包括 PLAND斑块占景观面积百分比、NP斑块数量、PD斑块密度、ED边缘密度、LSI景观形状指数、AI聚集度。景观层级对应“整个区域内不同地类之间的搭配关系”常用 Shannon 多样性指数 SHDI、均匀度指数 SHEI、蔓延度 CONTAG、连接性相关指标 COHESION。层级代表指标解决的问题典型用途斑块AREA、PERIMETER、GYRATE单个图斑本身多大、多长识别特大斑块或破碎图斑类别PLAND、NP、PD、ED、LSI、AI每类地物占多少、碎不碎、边界规则与否比较耕地与建设用地的破碎化程度景观SHDI、SHEI、CONTAG、COHESION整个区域的异质性与连通程度评估生态格局变化、城市扩张影响注意 PLAND、NP、PD 这类基础指标即使在闭源软件里都算一致但 AI、LSI、ED 这类与邻域定义相关的指数会因为“4 邻域还是 8 邻域”产生差异。写报告时必须在方法论里写清楚邻域口径否则别人很难用相同数据复现你的数字。2.2 四条工具路线Fragstats、LecoS、landscapemetrics 与 PyLandStats行业内最经典的是 Fragstats一款需要手动配置 .land 参数文件再运行批处理的桌面程序。它的结果是论文里的“标准答案”但自动化程度低参数文件格式不直观在 Linux 服务器或 CI 流程里很难集成。如果你只处理一两个研究区用 Fragstats 没问题一旦要做多期影像批量计算它就不合适了。QGIS 里常见的插件叫 LecoS适合在桌面环境快速出表。它把计算封装成按钮适合教学和验证但指标覆盖有限更新节奏也慢。R 社区有 landscapemetrics与 sf、terra 生态协作好适合做完空间分析后直接在 R 里出图表缺点是 R 环境里要花时间处理栅格对象的转换。Python 生态里的 PyLandStats 则是目前批量计算最顺的一条路。它直接读取 TIFF 栅格输出 pandas DataFrame便于接进 matplotlib、Quarto 或 LaTeX 流水线。下面这张表是选型时的快速对照工具使用方式适合场景主要限制Fragstats图形界面 .land 配置文件论文终稿、小范围复核自动化差参数文件靠手写QGIS LecoS插件按钮快速试探性计算指标集合有限R landscapemetricsR 包需要与统计建模连贯R 环境依赖较重PyLandStatsPython API批量、可复现、接入报告流水线需要处理 GDAL 相关的安装依赖2.3 选型策略批量处理和可复现优先时选 PyLandStats如果你最终要交付的是“景观格局指数.pdf”这种周期性更新的报告我会优先选 PyLandStats。理由是它能把“输入栅格 → 计算指数 → 导出 CSV → 绘制图表”全部写进同一个 Python 脚本任何人拿到脚本和输入影像就能得到相同结果。这种可复现性对工程交付非常关键避免每次靠鼠标点出不同数值。提示PyLandStats 底层依赖 rasterio安装时如果遇到编译问题优先从预编译 wheel 安装 rasterio再安装 pylandstats不要直接从源码折腾。选型定下来后下一步就是把原始分类栅格处理成它能接受的输入。这一步看起来简单却决定了指标算得对不对。3. 用 PyLandStats 对栅格算全套景观格局指数3.1 数据准备投影一致、重分类后才能喂给程序拿到手的数据往往不是干净的 landcover 分类结果。常见情况包括投影带不统一、栅格外围是 NoData 而分类值从 1 开始、原始类别值有 5 个但实际上只需要分 3 类。直接把这些数据丢进 PyLandStats计算会被背景值和多余类别干扰PLAND 总和就可能小于 100%。我一般会先用 GDAL 命令行把影像重投影到统一坐标系再做一次重分类。假设原始source.tif里类别 1、2 要合并为新类别 1类别 3、4 合并为新类别 2背景 5 设为 0命令大致是这样的gdal_translate -of GTiff -a_nodata 0 source_crs.tif source_nodata.tif gdal_calc.py -A source_nodata.tif --outfilereclass.tif --typeByte \ --calc((A1)|(A2))*1 ((A3)|(A4))*2 ((A0))*0第一行先把 NoData 值统一为 0避免后续计算把空白区当成有效类别。第二行的表达式会把输入的 1、2 类映射为新类别 13、4 类映射为新类别 2背景 0 保持为 0。--typeByte是为了输出 8 位整型栅格如果保留浮点型之后算边缘长度和面积时会产生不必要的精度噪音。提示gdal_calc.py对语法很敏感|和两边都要加括号否则会得到错误分类结果。跑完之后顺手用 QGIS 打开检查一遍类别值再继续。3.2 最小计算脚本读取 TIFF、按类别算指标、导出 CSV重分类完成后计算脚本可以写得很短。下面这段是把类别层级和景观层级的常用指标一次算出来并分别导出为 CSV 的完整脚本import pylandstats as pls landscape pls.Landscape(reclass.tif, nodata0, neighbours8) class_metrics landscape.compute_class_metrics_df( metrics[np, pd, pland, ed, lsi, ai] ) land_metrics landscape.compute_landscape_metrics_df( metrics[shdi, shei, contag, cohesion] ) class_metrics.to_csv(class_metrics.csv, indexFalse) land_metrics.to_csv(landscape_metrics.csv, indexFalse) print(class_metrics.head()) print(land_metrics.head())这里Landscape(reclass.tif, nodata0, neighbours8)指定了三个关键参数输入文件、NoData 值、邻域方式。neighbours8表示用 8 邻域定义空间邻接关系与 Fragstats 默认一致如果后面要和某篇使用 4 邻域的文献对照必须改成 4。metrics参数里传的是指标英文缩写官方文档推荐用小写脚本里的大小写不能写错。compute_class_metrics_df返回的是每行一个类别的表格列名就是对应的指标缩写compute_landscape_metrics_df返回一行代表整个景观的多样性、均匀度和连通性。值得注意的是景观层级的指标在 PyLandStats 里返回的列名可能带聚合后缀例如shdi在数据框里显示为shdi不要因为后缀不同而误判。3.3 计算参数怎么改指标清单、邻域定义与类别白名单很多第一次用 PyLandStats 的人会把“全指标”当成默认目标直接跑空参数版本。空参数版本会输出几十个指标其中不少是冗余的还会拖慢计算速度。实际报告里常用的指标组合有限按类别层级和景观层级列出来大概是下面这些指标全称计算特征报告里的用途NPNumber of Patches直接统计图斑个数判断破碎化程度PDPatch DensityNP 除以景观面积消除总面积差异的影响PLANDPercentage of Landscape类别面积占比各类地物的面积结构EDEdge Density总边界长度除以景观面积边界复杂度和碎裂程度LSILandscape Shape Index实际边界与规则边界的比值形状复杂度AIAggregation Index基于邻接关系的聚集程度破碎化与聚集度判断SHDIShannon Diversity Index考虑类别数量与面积占比景观异质性SHEIShannon Evenness IndexSHDI 与最大多样性的比值各类别面积是否均匀CONTAGContagion Index斑块类型间的蔓延程度景观连通与聚集趋势除了metricsLandscape(classes[1, 2])这类白名单也可以常用。当你只关心耕地与建设用地两类时直接排除水体等背景类别避免它们干扰 LSI 和连通度计算。这样一张表算下来CSV 可以直接进 pandas 加工成图表为最后生成 PDF 做数据准备。4. 景观格局指数的数值边界分辨率、背景值与聚合度口径4.1 分辨率变化会直接改写指标量级景观格局指数对空间分辨率极其敏感。同一块区域10 米影像和 30 米重采样影像算出来的 NP、ED、PD 几乎不可能一致差别也不是线性关系。分辨率变粗时小斑块会被合并或抹掉NP 明显下降ED 也随之改变但 PLAND 和 SHDI 通常保持相对稳定因为面积占比在聚合中损失较小。这就是为什么报告里必须写明“输入栅格的分辨率”并且所有期次的对比影像必须统一重采样到同一个格网。处理多期数据时我会先取所有年份里分辨率最粗的一期作为基准其余年份用gdalwarp -tr 30 30重采样对齐。凡是跨期计算出来的 NP、ED 变化只要没有统一分辨率任何生态解释都站不住脚。对比项10m 栅格30m 栅格影响程度NP偏高偏低明显ED偏高偏低明显PLAND基本稳定基本稳定小SHDI相对稳定相对稳定小4.2 栅格边缘的 NoData 和背景值处理另一个高频坑是 NoData 被当成有效类别参与计算。PyLandStats 构造 Landscape 对象时如果漏传nodata参数背景区域会被视为一个巨大斑块NP 多出一个、PLAND 被严重稀释、AI 指数也因为大片背景而失真。正确的做法在第 3.1 节已经提到重分类时把背景统一设为 0脚本里明确写nodata0。但这里有一个容易忽略的细节gdal_translate -a_nodata 0只是给栅格追加元数据不修改像素值而gdal_calc.py用表达式把背景算成 0 是真正改写像素值。两个思路必须保持一致否则栅格里的背景值可能是 0但 NoData 元数据却是 255最终 Landscape 对象读取时就会产生两种空值。提示处理完任何一步影像预处理都先用rasterio打开栅格检查nodata属性与像素分布。宁可多花两分钟也别在计算完才发现背景混进了指标里。4.3 容易误用的几个指数AI、COHESION、SHDI 边界AI聚集度和 COHESION斑块凝聚指数都描述“连通”但口径完全不同。AI 基于像元邻接关系计算对边缘细节和格网方向敏感COHESION 更接近物理意义上的连接程度衡量的是斑块间是否真的通过中间斑块连成一体。用 AI 描述“连接度”是错误的它描述的是聚集程度不是通路可达性。SHDI 的边界也有讲究。它是基于类别数量算的不包含类别之间的空间位置关系同样的 SHDI 值可能是“均匀混合”也可能是“棋盘式分割”。所以报告中不能单看 SHDI必须搭配 CONTAG 或 AI 一起读。如果只允许放一张图我一般会放类别层面 PLAND 的堆叠柱状图加 SHDI 的折线这样能同时解释结构与多样性变化。5. 一个快捷做法用 Matplotlib 和 Quarto 一键渲染景观格局指数 PDF5.1 用 Python 批量出图写进 qmd 报告计算完 CSV 之后直接进入交付阶段。我会把 Matplotlib 绘图和 Quarto 渲染串成一条命令。先在 Python 里把指标表画成图保存为 PDF 格式import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Noto Sans CJK SC] plt.rcParams[axes.unicode_minus] False df class_metrics df.plot.bar(xclass, y[pland, ed], figsize(8, 4)) plt.title(类别层次景观格局指数) plt.tight_layout() plt.savefig(class_metrics.pdf, bbox_inchestight)这里先设置中文字体避免 PDF 中中文变成方块。xclass是第 3.2 节导出 CSV 中的类别列名如果列名不同就改成实际列名。savefig用 PDF 格式保存比 PNG 清晰也方便后续嵌入到 PDF 报告里。5.2 在 Quarto 里组装报告并用 xelatex 渲染把图表和指标表格放进一个report.qmd头部配置写清楚输出格式和中文字体。Quarto 的优势是不用手工调整 Word 排版表格直接用 markdown 写图表自动嵌入。--- title: 景观格局指数分析报告 format: pdf: pdf-engine: xelatex mainfont: Noto Sans CJK SC ---在 qmd 正文里用![]()引用图片路径再用read_csv或直接插入 markdown 表格把主要指标列出。渲染命令只需要一行quarto render report.qmd --to pdf首次运行会检查 LaTeX 环境缺少 xelatex 时需要安装之后每次更新数据后重跑上面这条命令就能刷新 PDF。整个流程从原始栅格到最终 PDF 可以完全脚本化不需要人工操作 Fragstats 界面。5.3 交付前的三类自查PDF 生成后不要直接发出去先做三个验证。第一打开 CSV 检查类别层级 PLAND 总和是否接近 100如果远低于 100大概率是 NoData 没有正确排除。第二用 Fragstats 或另一个工具对同一栅格复核 NP 和 PLAND这两个指标不应因为工具不同而出现差异ED、LSI 这类邻域相关指标若有出入确认两边的邻域设置是否一致。第三用pdftotext提取 PDF 里的关键数字与 CSV 抽查对齐确保渲染过程没丢表或错序。最后还有一个小技巧把脚本和输入影像放进同一个目录并在脚本开头用assert os.path.exists(reclass.tif)做输入检查这样任何一期的“景观格局指数.pdf”都能在几分钟内重新生成而不需要依赖当初手动点过的 Fragstats 配置。本文还有配套的精品资源点击获取