资讯动态

斑块密度(PD)计算全攻略:从图斑统计到景观破碎化分析

发布时间:2026/10/20 10:10:50 来源:尧图企业网站定制
做景观格局分析、绿地系统规划这些年斑块密度Patch DensityPD算是我接触最多、最基础、却也最容易算错的一个指数。很多人拿着GIS里统计出来的图斑数量直接除以总面积就交差但等到横向比较不同城市、不同尺度数据的时候才发现分母口径和单位换算上的坑一个接一个。这篇就把从图斑统计到指数测算的完整链路拆开讲清楚适合正在做城市绿地景观格局评价、生态环境本底调查、绿地系统规划或者论文里需要计算景观指数的朋友参考也适合刚接触景观生态学的学生系统理解这类指数的计算逻辑。1. 斑块密度的底层逻辑公式背后是破碎化程度1.1 斑块密度不是简单的“数量除以面积”很多人把斑块密度理解成“数个数、除面积”这个方向没错但容易忽略这个指数真正想表达的东西景观破碎化程度。斑块密度的标准公式是 PD N / AN是统计范围内某种或全部绿地斑块的数量A是对应范围的面积常用单位是“个/公顷”或“个/100公顷”。举个例子就清楚了。假定两个片区绿地总面积都是10公顷一个片区是一整块中央公园另一个片区被市政道路均匀切成了20块。前者的斑块密度是0.1个/公顷后者是2个/公顷数值相差20倍。这20倍不是数字游戏它背后是生境连续性、物种迁移便利度、边缘效应的剧烈差异。同样面积的一片绿一整块的时候鸟类可以从中心区域稳定栖息碎成20块之后每一块都变成“小岛”内部物种受边缘干扰的程度完全不同。这也是为什么斑块密度高通常被解读为生境质量下降的信号。这里有个类比特别好用想象同样一百件衣服整整齐齐叠成一摞放在衣柜里和东一件西一件塞满十个抽屉取用效率和空间感受完全不一样。面积就像衣服总量斑块数量就像被塞进了多少个地方斑块密度衡量的就是这种“散落程度”。需要特别注意斑块密度高不等于一定差。有的地方天然就是碎片化格局比如山地城市受地形切割绿地的斑块密度天然就高。做分析时不要只盯着PD一个数还要结合其他指数判断后面会细说。1.2 类型口径与景观口径动手前先分清斑块密度有两个常见计算口径一个是类别水平Class Level一个是景观水平Landscape Level。类别水平的公式是 PD_i n_i / A_i其中n_i是第i类绿地的斑块数量A_i是第i类绿地的总面积。景观水平的公式是 PD N / A其中N是全部绿地斑块的数量A是整个研究区或整个景观的面积。这两个口径解决的问题不同。类别水平回答的是“公园绿地是不是比防护绿地更破碎”景观水平回答的是“整个城市的绿色空间分布得散不散”。最常见的问题就是分母选错有人算绿地斑块密度分母用建设用地面积有人算景观水平密度分母用绿地总面积。虽然不能说绝对错但每个口径对应的方法学定义完全不同写论文或出报告时必须和指标定义对得上。在专业软件里这两个口径是默认分开的。例如Fragstats里类别水平输出按类别分别给出PD景观水平输出只有一个全景观PD。如果在GIS里手工算就必须自己明确我的分母到底是谁。以我个人的项目经验做绿地系统专项规划时一般用绿地自身总面积做分母描述绿色空间内部的破碎化做城市间横向生态质量比较时用研究区总面积做分母描述绿地在城市空间中的分布密度。两种口径都有效但必须在方法部分写清楚否则读者完全没法复现和横向比较。2. 数据准备与预处理算得准的根基全在这一步2.1 绿地图斑数据从哪里来格式怎么选斑块密度计算的第一步不是开软件而是先确认手上的绿地数据经不经得起推敲。常见数据来源有四类高分遥感影像人工解译或半自动解译结果精度看解译尺度和人工经验通常能保留较多细节园林部门的绿线数据、绿地普查台账行政属性清晰但有时更新滞后国土调查、森林资源调查中的地类图斑覆盖完整但土地利用分类和绿地分类不一定对应开源土地覆盖产品分辨率30米或10米获取方便但城市尺度下容易漏掉零散小斑块。格式上矢量Shapefile、GeoPackage、FileGDB和栅格TIFF都能算。矢量统计的是“真图斑”适合做精细的图斑计数栅格数据则需要先做连通性分析才能确定斑块边界。我的建议是能用矢量不用栅格除非你本来就打算用Fragstats做整套景观指数那栅格输入反而是标准流程。这里有一个特别容易被低估的点数据分辨率/比例尺对斑块密度结果影响巨大。同样一块城市绿地在30米分辨率的土地覆盖数据里15米宽的道路可能不足以把两侧绿地在像元上分开两片绿地被合并成一个大斑块换成2米分辨率的影像解译结果它们就是两个独立斑块。斑块数量可能相差数倍。所以做任何研究之前第一步就是统一数据源、统一分辨率并在文档里写明数据粒度否则后面所有对比都是空中楼阁。2.2 坐标系、面积字段与拓扑检查三项缺一不可算面积之前最基础的一件事把数据统一到合适的投影坐标系。地理坐标系经纬度下的面要素虽然也能显示面积但那是用球面坐标近似计算的数值误差很大绝对不能作为最终统计依据。常见的做法是按城市所在位置选择高斯-克吕格投影带或UTM分带。国内常用的CGCS2000 / 国家2000投影分带、西安80、北京54等都可以关键是要保证整个数据集统一。面积字段本身也要注意。很多矢量数据里自带一个面积字段或者shape_area字段但那有可能是数据当年生产时按原始坐标系算的。稳妥的做法是自己重新计算一个面积字段字段类型设成双精度Double然后在新字段里用当前坐标系的平面面积填充。在ArcGIS里可以直接用 !shape.area!在QGIS里用 $area。如果数据在投影坐标系下这两个表达式都会按当前投影计算平面面积单位是平方米。拓扑问题同样不能跳过。最常见的情况是图斑重叠和缝隙。重叠会导致面积重复统计缝隙会导致面积被低估最终都会传导到斑块密度上。ArcGIS里可以先跑“修复几何”Repair Geometry再用“查找重叠”工具检查QGIS则用“检查几何”Check Geometries插件做批量检测。有一点要提醒拓扑修复后的数据一定要另存一份不要在原数据上直接改方便回溯和处理错误。2.3 碎斑清理与合并千万别按属性一键Dissolve解译出来的绿地数据里经常有大量“碎斑”——面积很小的零散图斑比如行道树绿带、街头小绿地、停车场隔离带。这些碎斑不是噪声但会把斑块密度推得异常高。实践经验是先设定一个最小图斑面积阈值比如0.01公顷或0.05公顷小于阈值的图斑要么剔除并记录数量要么用“消除”Eliminate工具把它合并到相邻的最大图斑上。关键在于阈值设定和剔除数量必须在方法里写清楚否则别人拿你的数据和别的研究对比时完全不知道口径。还有一个我见过无数人踩进去的坑有人为了提高数据规整度直接按“绿地大类”字段做Dissolve融合结果整个城市几百个绿地图斑被合并成一个或几个巨型多部件要素后续统计出来的斑块数量严重偏少斑块密度完全失真。正确的思路是只合并空间上相邻的同类型图斑不相邻的同类型图斑必须保持独立。在ArcGIS里做Dissolve时有一个“创建多部分要素”的选项默认是勾选的必须取消勾选——这样融合工具会保留每个不相连的部分为单独要素而不是把所有同类合并成一个多部件要素。在QGIS里则用“合并面”工具注意同样要选择保留不相邻独立要素的选项。这个细节直接决定N的值N不准后面PD全废。3. 图斑统计实操三个关键动作一次讲清3.1 按类型提取绿地图斑图斑统计的第一步是把绿地数据按照研究需求拆出来。假设原始数据里有一个字段叫“TYPE”里面记录了公园绿地、防护绿地、附属绿地等类型现在只统计绿地就需要用属性查询筛选。在ArcGIS里打开按属性选择对话框输入类似下面这样的SQL表达式TYPE IN (公园绿地, 防护绿地, 附属绿地)如果是QGIS用表达式工具操作TYPE IN (公园绿地, 防护绿地, 附属绿地)这里有一个小坑如果“TYPE”字段是中文ArcGIS在个别环境下会碰到编码识别问题表达式里的字符串有时候要切换输入法或检查数据源的编码格式GBK还是UTF-8。筛选完成后最好把结果右键导出成一个独立图层比如“green_extract.shp”这样后续的所有操作都有明确的操作对象也可以随时回溯。如果绿地类型不止一种建议保留TYPE字段这样后面可以用分组统计一次性把所有类型都算出来而不是一类一类手工数。3.2 面积计算与字段管理面积计算看似简单但这里影响最终结果的因素极多。我一般的流程是给提取后的图斑图层增加两个字段一个叫AREA_M2面积平方米一个叫AREA_HA面积公顷字段类型都设为Double在AREA_M2字段上用字段计算器写入 !shape.area!这样能确保按当前投影坐标系重新计算面积然后在AREA_HA字段上写 !AREA_M2! / 10000。在QGIS里同样操作表达式分别是 $area 和 $area / 10000。计算完成后最好用“汇总统计”核验一下总面积数量级是否合理。例如一个中等城市建成区绿地总面积通常在上百到上千公顷如果算出来只有几公顷那大概率是投影坐标系出问题了或者选取范围不对。这里要特别强调不要在编辑状态下直接改面积字段先把编辑保存或退出编辑模式再做字段计算否则ArcGIS经常报“正在编辑无法计算”之类的错误。另外如果数据里本身有自带的面积字段不要直接拿来用务必自己重新计算一次。3.3 汇总统计数量、面积、占比一次拿全面积字段准备好之后就可以做汇总统计了。这一步的本质是以TYPE为分组字段统计每个类型下的斑块数量Count和总面积Sum。在ArcGIS里右键AREA_HA字段 → 汇总Summarize分组字段选“TYPE”统计字段选AREA_HA汇总方式选“总和”和“计数”。输出结果是一张dbf表通常会包含三列TYPE、Count、Sum_AREA_HA。在QGIS里可以用“按类别统计”工具或者用GroupStats插件操作更直观还能顺便算出平均值、最大值、最小值。一个典型的输出结果类似下面这样示例数据非真实项目绿地类型斑块数量总面积公顷平均斑块面积公顷公园绿地126212.401.69防护绿地8764.200.74附属绿地310180.600.58区域绿地42106.302.53这张表就是后续所有指数计算的起点。有了数量、总面积、平均面积斑块密度和相关指数就可以直接套公式算出来了。如果觉得每次都点菜单太麻烦可以用脚本一键完成。比如ArcGIS环境下的Python脚本可以这样写import arcpy fc rD:\data\green_extract.shp type_field TYPE area_field AREA_HA stats {} with arcpy.da.SearchCursor(fc, [type_field, area_field]) as cursor: for t, a in cursor: if t not in stats: stats[t] {count: 0, area: 0.0} stats[t][count] 1 stats[t][area] a for t, s in stats.items(): pd s[count] / s[area] # 个/公顷 print(f{t}: 斑块数{s[count]}, 面积{s[area]:.2f}ha, PD{pd:.4f} 个/ha)这一步做完你在GIS里的统计工作基本就结束了剩下的就是指数测算。4. 斑块密度测算从统计表到指数值4.1 分类型斑块密度的计算全过程有了上面的汇总表分类型的斑块密度就能直接算出来了。以之前那张示例表为例公园绿地PD 126 / 212.40 0.593 个/公顷防护绿地PD 87 / 64.20 1.355 个/公顷附属绿地PD 310 / 180.60 1.716 个/公顷区域绿地PD 42 / 106.30 0.395 个/公顷。这个结果说明什么四个类型里附属绿地最破碎平均下来几乎每公顷就有接近两块绿地区域绿地最完整斑块大且数量少。这对规划决策是有直接含义的附属绿地虽然总 площади 不小但被道路、建筑切割成大量碎片生态功能有限未来需要通过绿道串联或与公园绿地连通来提升整体性。这里我还要多说一句单位。很多论文里会出现“个/100公顷”这是因为Fragstats默认的就是每100公顷多少个斑块。如果你从Fragstats直接输出结果看到一个大几十或者上百的PD数值不要惊讶那很可能是“个/100公顷”而不是“个/公顷”。换算很简单除以100就是“个/公顷”。我的习惯是论文统一用“个/公顷”因为生态学文献里最常见而且数值区间更直观。4.2 景观整体斑块密度的口径选择景观整体的斑块密度有两种常用的口径我前面提过这里再展开对比一下。第一种研究区为整个城市或建成区范围N为全部绿地斑块数量A为研究区总面积。这个口径描述的是绿地在城市空间中的分布密度。举例某城市研究区总面积4200公顷全部绿地斑块213块那PD213/4200≈0.051个/公顷。这个数值适合做城市之间、片区之间的横向对比能直接说明“这个城市里绿色空间是不是被摊得很碎”。第二种研究区为绿地自身范围N不变A为全部绿地总面积。举个例子如果上面那213块绿地总面积是318.2公顷那PD213/318.2≈0.669个/公顷。这个口径描述的是绿地内部的破碎化。这两种结果数值差出十几倍如果不写清楚用的是哪个别人完全无法判断你的数据是否合理。以我的经验做绿地系统专项规划、公园体系评估时第二种口径更常用因为它关注的是绿地自身的形态做城市生态质量评价、横向比较时第一种口径更合理。可靠的做法是在方法部分写一句“本文的景观水平斑块密度定义为绿地斑块总数与研究区总面积之比”把所有口径一次性锁死。4.3 与边缘密度、平均斑块面积搭配解读斑块密度虽然重要但单独使用很容易误导。密度相同不代表格局相同——一个区域可能既有大型核心绿地又有大量细碎小斑块另一个区域可能斑块大小均匀。这两个区域的PD可能一样但生态意义完全不同。所以实践经验里至少要搭配两个指数一起看。平均斑块面积AREA_MN也叫MPS总面积除以斑块数量。当口径一致时它和PD是倒数关系但比PD更直观。比如“平均每块绿地面积才0.58公顷”比“密度每公顷1.716个”更容易让规划人员理解。边缘密度ED总边缘长度除以总面积单位一般是米/公顷。它反映斑块边界被暴露的程度。一个细长条形的绿地和同样面积的正圆形绿地PD可能完全不同但它们对边缘生境的贡献差异很大ED能把这个差异捕捉出来。最大斑块指数LPI最大斑块面积占景观总面积的比例。LPI高说明区域内有核心绿地存在LPI低说明即使总面积可观也缺少能承载大型生态过程的优势斑块。组合解读的逻辑大致是这样PD高、MPS小、LPI低说明极度破碎没有核心斑块PD低、MPS大、LPI高说明整体完整且有核心PD高但同时MPS也不算太小往往是“核心斑块大量碎片”并存需要结合绿道规划做连通性优化。所有只看一个PD就下结论的报告我一般都会建议补上ED和LPI再重新评估。5. 常见问题与排查技巧实录5.1 图斑数量对不上先从这三处排查斑块数量是PD计算的分子它一旦出错结果全乱。实际项目里图斑数量对不上的情况非常常见我总结下来主要来源于三个地方。第一属性筛选漏选或多选。比如字段值里有空格、换行符、全角字符导致“公园绿地”和“公园绿地 ”匹配不上或者SQL表达式里单双引号转义错误。排查方法是统计一下“SELECT * FROM 图层 WHERE TYPE IS NOT NULL”看有效记录数再逐个对比。第二多部件要素的数量陷阱。一个面要素内部如果包含多个不相连的“岛”在GIS里它仍然只算一条记录即一个要素。如果一个绿地图斑被内部水域分成了几个互不相连的部分但生产数据时被存成了多部件要素你统计出来就会比真实斑块数量偏少。解决办法是先跑一遍“多部件转单部件”Multipart To Singlepart再重新统计。第三边界裁剪产生边缘碎斑。研究区是一个行政区边界绿地跨边界被切碎边界上会出现大量细长条图斑。这些图斑本身面积很小但数量很大会把PD推高。处理方式是设定最小面积阈值并剔除边界碎斑同时在方法说明里写明剔除规则。一张常见问题排查表供参考现象可能原因排查思路斑块数量比预想少很多多部件要素未拆分先做“多部件转单部件”再统计斑块数量异常多栅格解译椒盐碎斑过多设定最小面积阈值并消除碎斑总面积与统计年鉴差异大坐标系或拓扑问题统一投影修复几何重算面积PD数值大得离谱单位没换算 / 分母口径选错统一用公顷检查分母定义同一份数据两次统计结果不同处理过程不可复现保存每一步中间图层记录参数5.2 单位换算与尺度口径导致的数字“漂移”斑块密度这个指数对单位极其敏感。面积单位从平方米换成公顷PD直接缩水一万倍斑块密度单位从“个/公顷”换成“个/100公顷”数值又放大100倍。很多人在文献里看到别人PD数值很大或很小第一反应是自己算错了其实很可能只是单位口径不同。常见的单位换算有三个关键点公顷ha和平方米m²之间是10000倍很多原始统计字段是平方米直接拿来当公顷用是灾难Fragstats默认输出的是“个/100公顷”换算成“个/公顷”要除以100如果使用栅格数据且像元大小不是1平方米像元面积计算要先换算到公顷比如30米分辨率的一个像元面积是900平方米等于0.09公顷。还有一个容易被忽略的点面要素的周长和面积在动态投影下的差异。矢量数据的shape_area字段可能保存的是数据生产时坐标系下的面积而你现在用的显示坐标系可能是另一个投影两者不一致时数值会漂移。所以我在每次项目开始时会固定一个标准投影并且所有面积字段重新计算不信任任何来历不明的面积字段。5.3 跨区域比较时最容易忽略的三个坑如果要把不同城市或不同年份的斑块密度拿来对比有三个坑我几乎每次都会遇到。数据源不一致是第一大坑。一个区域用30米土地覆盖产品另一个区域用2米高分影像解译结果完全不可比。比较前必须统一数据源精度或者至少在结论中说明分辨率差异对PD可能带来的数量级影响。最小图斑阈值不统一是第二大坑。有人剔除0.05公顷以下图斑有人保留所有小到街角花坛的碎片这两个数据的斑块数量很可能差出几倍。跨区域比较时设定统一的最小图斑面积阈值是必须的通常建议0.01公顷或0.1公顷视研究尺度而定。研究区边界不统一是第三大坑。景观水平PD的分母是研究区总面积研究区划得大还是划得小直接影响分子和分母的比例关系。做横向对比时必须明确“建成区范围”“中心城区范围”这些空间边界在不同年份是否有变化。如果边界变了PD的差异可能完全来自边界调整而不是真实的绿地格局变化。我的习惯是所有参与对比的数据统一做一次预处理包括重新投影到同一坐标系、统一字段结构、统一最小面积阈值、统一分母口径。做完以后再算PD这样出来的数字才是真正可比较的。最后说点个人的实操感受。斑块密度这个指数看着简单真正把它算明白、能在论文或规划文本里讲清楚破碎化含义靠的不是跑通一次流程而是对数据口径和数据质量死磕。我刚开始做这类分析时也困惑过为什么同一个城市不同论文里的PD能差出几十倍后来才发现多半是分母口径不一致、单位没写清楚、或者碎斑处理规则不透明。我的建议是所有原始图斑、统计过程表和计算脚本全部存档在文档开头写明数据来源、投影坐标系、面积单位和阈值设定这样即便半年后再回看也能完整复现。如果你能养成这个习惯斑块密度这个“一步到位”的计算流程才算真正为你所用了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑