
在国土空间规划、生态保护修复等工作中生态安全格局的构建与识别是核心环节。然而对于许多刚接触该领域的同学来说面对ArcGIS Pro复杂的界面、Python脚本的编写以及InVEST模型庞杂的参数常常感到无从下手网上资料也多是零散的片段难以形成完整的操作闭环。本文将为你彻底解决这一痛点手把手带你走通从数据准备、模型运行到结果制图的全流程。无论你是地理信息、生态学专业的学生还是相关领域的从业者都能通过本文的详细步骤和完整代码独立完成一次专业的生态安全格局分析。1. 生态安全格局与InVEST模型核心概念在开始实战之前我们有必要厘清几个核心概念这能帮助你更好地理解每一步操作背后的意义而不仅仅是机械地点击按钮。1.1 什么是生态安全格局生态安全格局是指能够维持生态系统结构完整、功能稳定并保障区域生态安全的关键性空间格局。你可以把它想象成区域的“生态骨架”或“生命线”。它通常由一些重要的生态要素构成生态源地指那些对维持生态系统健康与安全具有关键作用、生态功能强大的区域如大型自然保护区、水源涵养林、生物多样性热点区域等。它们是生态过程的“起点”或“核心”。生态廊道连接各个生态源地之间的带状或线状区域用于促进物种迁徙、基因交流、能量流动等生态过程。如同连接城市之间的“高速公路”但服务于野生动物和生态流。生态节点通常指廊道上的一些关键点如廊道狭窄处、交汇处或生态脆弱点这些位置对维护廊道连通性至关重要。构建生态安全格局的目的就是识别出这些源地、廊道和节点从而为国土空间开发保护、生态修复工程布局提供科学的“一张图”依据。1.2 InVEST模型简介与Habitat Quality模块InVESTIntegrated Valuation of Ecosystem Services and Tradeoffs模型是由美国斯坦福大学、大自然保护协会等机构开发的一套用于生态系统服务评估与权衡的开源工具集。它基于栅格数据运行通过模拟土地利用/覆被变化与生态系统过程之间的关系来量化多种生态系统服务如水源涵养、碳储存、生境质量等。本文聚焦于其“生境质量”Habitat Quality模块。该模块的核心功能是评估景观的生境退化程度和质量进而识别出生境质量高、受威胁小的区域这些区域往往就是潜在的生态源地。模型原理主要考虑四个因素土地利用/覆被类型每种地类对特定物种或生物多样性的适宜性生境适宜性。威胁源如建设用地、农田、道路等这些人类活动会对周围生境产生负面影响。威胁源的强度与权重不同威胁源的破坏力大小。威胁源的衰减距离威胁源的影响随距离增加而衰减的规律。模型通过计算每个栅格单元所受的累积威胁程度得到生境退化度再结合生境适宜性最终输出生境质量图。高生境质量的区域即为生态源地的重要候选。1.3 为什么需要ArcGIS Pro和PythonArcGIS Pro作为强大的桌面GIS平台它负责所有空间数据的预处理、可视化、分析和最终成图。InVEST模型本身也提供了ArcGIS工具箱方便在Pro中直接调用。Python在本流程中扮演着“自动化引擎”和“粘合剂”的角色。具体包括批量数据处理例如批量裁剪、重投影、重分类多个栅格数据。驱动InVEST模型通过pyinvest库或调用命令行实现模型的自动化运行避免在图形界面中反复设置参数。结果后处理自动提取源地、计算景观连通性指数、识别廊道等。流程整合将ArcGIS Pro的操作与InVEST模型运行串联成一个完整的脚本实现一键化或半自动化分析。三者结合构成了一个高效、可重复、可扩展的生态安全格局分析技术栈。2. 环境准备与软件安装工欲善其事必先利其器。下面将详细列出所需的软件环境及其安装配置要点。请务必按照顺序操作避免因依赖缺失导致后续步骤失败。2.1 基础软件安装ArcGIS Pro (版本 2.8 或以上建议3.0)获取通过正规机构授权获取安装包。安装过程需要Esri账号。注意安装时确保勾选“Python”相关选项ArcGIS Pro会自带一个名为arcgispro-py3的Python环境。安装后可能会提示安装“Microsoft Edge WebView2 Runtime”按提示安装即可这是其界面渲染所必需的组件。验证安装成功后打开ArcGIS Pro能正常创建工程即可。Python环境管理推荐使用ArcGIS Pro自带环境为了最大程度保证与ArcGIS Pro的兼容性强烈建议直接使用ArcGIS Pro自带的Python环境。其路径通常为C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3。你可以通过ArcGIS Pro的“Python”菜单下的“Python终端”直接访问该环境。2.2 关键Python库安装我们需要在ArcGIS Pro的Python环境中安装运行InVEST模型和分析所需的库。请以管理员身份打开“ArcGIS Pro自带的Python命令提示符”开始菜单中搜索“Python命令提示符(ArcGIS Pro)”。依次执行以下安装命令# 升级pip至最新版本确保安装顺利 python -m pip install --upgrade pip # 安装InVEST模型的核心Python库。这是最关键的一步。 pip install natcap.invest # 安装用于科学计算和数据处理的核心库 pip install numpy pandas scipy # 安装用于读写地理空间栅格/矢量数据的库后续脚本处理会用到 pip install rasterio geopandas # 安装用于景观生态学指数计算的库如MSPA、连通性分析等 pip install pysal landscape-connectivity安装常见问题排查pip安装超时或失败可以使用国内镜像源加速例如pip install natcap.invest -i https://pypi.tuna.tsinghua.edu.cn/simpleGDAL等C库编译错误rasterio和geopandas依赖GDAL。如果安装失败一个更简单的方法是使用conda安装。你可以先安装Miniconda然后创建一个新环境来安装这些库。但对于本教程优先尝试在ArcGIS Pro环境中安装若失败可考虑备用方案。权限错误确保使用管理员身份运行命令提示符。2.3 数据准备清单在开始分析前请准备好以下数据并统一存放在一个清晰的文件夹中如D:\EcoSecurity_Project研究区边界矢量文件study_area.shp。用于后续所有数据的裁剪。土地利用/土地覆盖数据LandUse_2020.tif。建议为GeoTIFF格式坐标系与研究区一致。这是InVEST模型最主要的输入。威胁源数据通常从土地利用数据中提取。例如将建设用地、主要道路、农田等视为威胁源。你需要准备多个栅格文件如threat_urban.tif,threat_road.tif每个文件二值化表示1代表威胁0或无数据代表非威胁。生境适宜性表一个CSV或Excel文件定义每种土地利用类型对目标生物类群或泛指生物多样性的适宜性得分0-1之间。威胁源参数表一个CSV或Excel文件定义每个威胁源的最大影响距离、权重、衰减类型线性或指数等。3. 数据预处理与参数表制作数据质量决定模型结果的可靠性。这一步在ArcGIS Pro中完成。3.1 数据标准化预处理坐标系统一将所有数据栅格、矢量通过“投影”工具统一到同一个投影坐标系下如Albers等积投影以保证面积计算准确。绝对不要使用地理坐标系WGS84进行分析。范围与分辨率统一以study_area.shp为掩膜使用“按掩膜提取”工具批量裁剪所有栅格数据土地利用、威胁源使它们具有完全相同的空间范围。使用“重采样”工具将所有栅格数据的空间分辨率设置为一致如30米。建议与土地利用数据分辨率保持一致。关键步骤使用“创建渔网”工具生成一个与研究区范围、目标分辨率一致的空白栅格模板然后使用“栅格计算器”或“重采样”工具将所有数据对齐到此模板。这是保证后续栅格计算无误的基础。威胁源栅格创建在ArcGIS Pro中使用“栅格计算器”或“重分类”工具从土地利用数据中提取特定类型并二值化。# 示例在ArcGIS Pro的Python窗口中或独立脚本中使用arcpy创建建设用地威胁源 import arcpy from arcpy.sa import * arcpy.CheckOutExtension(Spatial) # 假设土地利用栅格中代码‘10’代表城镇建设用地 lulc_raster rD:\EcoSecurity_Project\LandUse_2020.tif out_threat_urban rD:\EcoSecurity_Project\threats\threat_urban.tif # 使用Con函数进行条件赋值是建设用地的赋值为1否则为0 urban_threat Con(Raster(lulc_raster) 10, 1, 0) urban_threat.save(out_threat_urban) print(建设用地威胁源栅格已创建。)3.2 制作InVEST模型输入参数表这是模型运行的核心需要仔细准备两个CSV文件。生境适宜性表 (habitat_table.csv)lucodelulc_deschabitatsensitivity_urbansensitivity_road...10城镇建设用地000...21有林地0.90.80.6...31草地0.70.70.5.....................lucode: 土地利用类型代码必须与你的栅格值完全对应。lulc_desc: 类型描述可选。habitat: 生境适宜性得分0-1。0代表完全非生境如建设用地1代表最优生境。sensitivity_[threat_name]: 该地类对特定威胁源的敏感度0-1。例如有林地对建设用地的敏感度(sensitivity_urban)很高0.8而对道路的敏感度(sensitivity_road)可能稍低0.6。注意威胁源名称必须与威胁源栅格文件名不含扩展名或后续威胁表中的名称严格一致。威胁源数据表 (threats_table.csv)THREATMAX_DISTWEIGHTDECAYCUR_PATHurban100.8exponentialD:\EcoSecurity_Project\threats\threat_urban.tifroad20.6linearD:\EcoSecurity_Project\threats\threat_road.tifTHREAT: 威胁源名称与适宜性表中的sensitivity_列名后缀对应。MAX_DIST: 最大影响距离单位栅格像元数。例如建设用地的影响可能达10个像元300米。WEIGHT: 该威胁源的全局权重0-1。所有威胁源权重之和通常为1。DECAY: 衰减函数linear线性或exponential指数。CUR_PATH:威胁源栅格文件的绝对路径。这是最容易出错的地方路径中不要有中文或特殊字符。4. 核心实战运行InVEST生境质量模型我们将采用Python脚本来驱动模型运行这比图形界面操作更高效、可追溯。4.1 编写Python驱动脚本创建一个新的Python脚本文件如run_habitat_quality.py。# run_habitat_quality.py import sys import os from natcap.invest import habitat_quality def main(): # 1. 设置工作空间和路径 workspace_dir rD:\EcoSecurity_Project\outputs os.makedirs(workspace_dir, exist_okTrue) # 2. 定义模型输入参数字典 args { workspace_dir: workspace_dir, results_suffix: _hq2020, # 输出结果文件后缀用于区分不同次运行 lulc_cur_path: rD:\EcoSecurity_Project\LandUse_2020_aligned.tif, threats_table_path: rD:\EcoSecurity_Project\threats_table.csv, habitat_table_path: rD:\EcoSecurity_Project\habitat_table.csv, half_saturation_constant: 0.5, # 半饱和常数通常使用默认值0.5 accessibility_threshold: 0.0, # 可达性阈值通常设为0完全可达 n_workers: -1, # 使用所有可用的CPU核心并行计算-1表示自动检测 } # 3. 执行模型 print(开始运行InVEST生境质量模型...) try: habitat_quality.execute(args) print(模型运行成功) except Exception as e: print(f模型运行失败错误信息{e}) sys.exit(1) # 4. 指定关键输出文件路径模型会自动生成 habitat_quality_raster os.path.join(workspace_dir, habitat_quality_cur_hq2020.tif) degradation_raster os.path.join(workspace_dir, deg_sum_cur_hq2020.tif) print(f生境质量结果{habitat_quality_raster}) print(f生境退化度结果{degradation_raster}) if __name__ __main__: main()4.2 运行脚本并验证结果运行脚本在ArcGIS Pro的“Python”窗格中点击“运行脚本”按钮选择你刚创建的run_habitat_quality.py文件。或者在“Python终端”中导航到脚本目录执行python run_habitat_quality.py。监控输出控制台会显示运行进度。完成后会在指定的workspace_dir中生成一系列文件。结果验证在ArcGIS Pro中将输出的habitat_quality_cur_hq2020.tif添加到地图。其像元值应在0-1之间值越高代表生境质量越好。使用“分类”渲染或“拉伸”渲染来可视化结果。通常我们将值大于0.6或0.7的区域初步判定为高质量生境斑块这些是生态源地的重要候选。5. 生态安全格局要素提取与构建获得生境质量图后我们需要从中提取具体的生态源地、廊道等要素。5.1 识别生态源地源地识别并非简单地将高值区全部选出通常需要结合面积阈值和空间聚集性。# extract_sources.py import arcpy from arcpy.sa import * import os arcpy.CheckOutExtension(Spatial) def extract_ecological_sources(habitat_quality_raster, output_sources_shp, quality_threshold0.7, area_threshold_ha10): 从生境质量栅格中提取生态源地。 参数 habitat_quality_raster: 输入生境质量栅格路径 output_sources_shp: 输出源地矢量面路径 quality_threshold: 生境质量阈值大于此值的像元才被考虑 area_threshold_ha: 最小源地面积阈值公顷 print(步骤1按阈值提取高生境质量区域...) # 条件提取质量 threshold 的赋值为1否则为NoData high_quality_raster Con(Raster(habitat_quality_raster) quality_threshold, 1) high_quality_raster_path os.path.join(arcpy.env.scratchFolder, high_quality.tif) high_quality_raster.save(high_quality_raster_path) print(步骤2区域分组识别独立斑块...) # 使用RegionGroup识别连通的斑块并为每个斑块分配唯一ID region_group_raster RegionGroup(high_quality_raster_path, FOUR, WITHIN, NO_LINK) region_group_raster_path os.path.join(arcpy.env.scratchFolder, region_group.tif) region_group_raster.save(region_group_raster_path) print(步骤3计算每个斑块的面积...) # 获取栅格像元大小单位米 cell_size_x arcpy.GetRasterProperties_management(habitat_quality_raster, CELLSIZEX) cell_size float(cell_size_x.getOutput(0)) cell_area_sq_m cell_size * cell_size # 单个像元面积平方米 # 将栅格转为矢量面 region_polygons os.path.join(arcpy.env.scratchGDB, region_polygons) arcpy.RasterToPolygon_conversion(region_group_raster_path, region_polygons, NO_SIMPLIFY, VALUE) # 添加面积字段并计算公顷 arcpy.AddField_management(region_polygons, Area_HA, DOUBLE) arcpy.CalculateGeometryAttributes_management(region_polygons, [[Area_HA, AREA_GEODESIC]], area_unitHECTARES) print(f步骤4筛选面积大于 {area_threshold_ha} 公顷的斑块作为源地...) # 使用选择工具筛选 sources_lyr sources_lyr arcpy.MakeFeatureLayer_management(region_polygons, sources_lyr) arcpy.SelectLayerByAttribute_management(sources_lyr, NEW_SELECTION, fArea_HA {area_threshold_ha}) # 将筛选结果导出为最终源地Shapefile arcpy.CopyFeatures_management(sources_lyr, output_sources_shp) print(f生态源地已提取并保存至{output_sources_shp}) # 清理中间数据可选 # arcpy.Delete_management(region_polygons) # ... if __name__ __main__: # 输入输出路径 hq_raster rD:\EcoSecurity_Project\outputs\habitat_quality_cur_hq2020.tif output_shp rD:\EcoSecurity_Project\outputs\ecological_sources.shp extract_ecological_sources(hq_raster, output_shp, quality_threshold0.65, area_threshold_ha20)5.2 构建生态廊道最小成本路径法识别源地后我们采用最小累积阻力模型MCR和最小成本路径方法来识别潜在廊道。这需要一张“阻力面”。# build_corridors.py import arcpy from arcpy.sa import * import os arcpy.CheckOutExtension(Spatial) def create_resistance_surface(lulc_raster, resistance_dict): 根据土地利用类型创建阻力面。 参数 lulc_raster: 土地利用栅格 resistance_dict: 字典键为土地利用代码值为阻力值1-100值越大表示穿越阻力越大 print(创建阻力面...) # 使用重分类工具 remap_list [] for code, resistance in resistance_dict.items(): remap_list.append([code, resistance]) # 格式[原始值, 新值] # 执行重分类 out_reclass Reclassify(lulc_raster, Value, RemapValue(remap_list)) return out_reclass def calculate_corridors(sources_shp, resistance_raster, output_corridor_raster): 计算源地之间的最小成本路径廊道。 使用成本距离和成本路径工具。 这是一个简化示例实际中可能需要计算所有源地两两之间的路径或使用电路理论等方法。 print(计算成本距离...) # 成本距离计算从每个源到空间中每一点的最小累积阻力 out_cost_distance CostDistance(sources_shp, resistance_raster, , , , ) out_cost_distance_path os.path.join(arcpy.env.scratchFolder, cost_distance.tif) out_cost_distance.save(out_cost_distance_path) print(计算成本回溯链接...) out_backlink CostBackLink(sources_shp, resistance_raster, , ) out_backlink_path os.path.join(arcpy.env.scratchFolder, cost_backlink.tif) out_backlink.save(out_backlink_path) print(生成最小成本路径示例从第一个源到第二个源...) # 注意这里需要你手动指定目标源另一个源地的位置。 # 更复杂的实现需要遍历所有源地对。这里仅为流程演示。 # 假设我们有两个源获取它们的几何中心点 sources_desc arcpy.Describe(sources_shp) if sources_desc.shapeType Polygon: # 将面源地转换为点质心 source_points os.path.join(arcpy.env.scratchGDB, source_points) arcpy.FeatureToPoint_management(sources_shp, source_points, INSIDE) # 这里简化处理实际应选择特定的两个点进行计算 # 以下代码仅为示意无法直接运行需要你根据实际情况调整 # target_point_feature ... # 你需要指定第二个源地的点要素 # corridor CostPath(target_point_feature, out_cost_distance_path, out_backlink_path, EACH_CELL) # corridor.save(output_corridor_raster) print(提示此处需要具体指定目标源要素来计算路径。请手动在ArcGIS Pro中使用成本路径工具或完善脚本逻辑。) else: print(输入源地数据不是面要素。) if __name__ __main__: # 定义阻力值字典示例需根据生态学知识设定 resistance_values { 10: 100, # 城镇建设用地 - 阻力极大 21: 10, # 有林地 - 阻力小 31: 20, # 草地 - 阻力较小 43: 60, # 农田 - 阻力中等 # ... 补充所有地类 } lulc rD:\EcoSecurity_Project\LandUse_2020_aligned.tif resistance_surface create_resistance_surface(lulc, resistance_values) resistance_surface.save(rD:\EcoSecurity_Project\outputs\resistance_surface.tif) sources rD:\EcoSecurity_Project\outputs\ecological_sources.shp output_corridor rD:\EcoSecurity_Project\outputs\potential_corridors.tif # calculate_corridors(sources, resistance_surface, output_corridor) # 需要完善目标点逻辑注意完整的廊道网络分析如使用Linkage Mapper工具、Circuitscape软件或landscape-connectivity库进行电路理论分析更为复杂。上述脚本提供了创建阻力面和成本路径的基本框架。对于生产性工作建议使用成熟的工具或编写更完善的脚本。6. 结果可视化与制图分析结果的最终呈现至关重要。符号化渲染生境质量图使用“拉伸”色彩渲染从红色低质量到绿色高质量渐变。生态源地使用鲜明的填充色如深绿色和轮廓。生态廊道使用醒目的线型如亮蓝色虚线或实线表示。地图布局在ArcGIS Pro的“布局”视图中添加图名、图例、比例尺、指北针、数据来源说明等地图要素。导出成果将布局导出为高分辨率图片如PNG、PDF或制作成网页地图。7. 常见问题与解决方案问题现象可能原因解决方案运行InVEST模型时提示“缺少模块”或“ImportError”Python环境中未正确安装natcap.invest或其依赖。1. 确认在ArcGIS Pro的Python环境中安装。2. 尝试使用conda install -c conda-forge invest安装需先安装conda。3. 检查环境变量PATH是否包含正确的Python路径。模型运行成功但输出栅格全为0或NoData1. 威胁源路径错误模型未读取到威胁栅格。2. 生境适宜性表中sensitivity列名与威胁表THREAT列名不匹配。3. 土地利用栅格值与适宜性表lucode不匹配。1. 仔细检查threats_table.csv中CUR_PATH的绝对路径是否正确且文件存在。2. 确保适宜性表中sensitivity_urban的urban与威胁表中THREAT列的urban完全一致大小写敏感。3. 使用ArcGIS Pro的“查找相同项”或Python的numpy.unique检查土地利用栅格的所有值确保都在适宜性表中有定义。ArcGIS Pro Python窗口运行脚本报错arcpy相关错误ArcGIS Pro的Python环境未正确加载arcpy模块或未获取Spatial Analyst扩展许可。1. 确保在ArcGIS Pro自带的Python环境中运行脚本。2. 在脚本开头添加arcpy.CheckOutExtension(Spatial)。3. 重启ArcGIS Pro。提取的源地斑块数量过多、过于破碎生境质量阈值(quality_threshold)设置过低或面积阈值(area_threshold_ha)设置过小。1. 提高生境质量阈值如从0.6提高到0.7。2. 根据研究区实际情况增大最小源地面积阈值如从10公顷提高到50公顷。3. 在提取前可先对生境质量图进行“众数滤波”或“聚合”操作平滑细小斑块。构建廊道时成本路径工具报错输入的源数据或阻力面数据存在问题如坐标系不一致、存在无效值。1. 确保源地矢量、阻力面栅格、成本距离栅格具有完全相同的坐标系和空间范围。2. 检查阻力面是否有NoData值使用Con(IsNull(raster), 100, raster)等方式填充。3. 确保源地点要素确实位于阻力面数据范围内。8. 最佳实践与工程化建议项目目录结构标准化建立清晰的文件夹结构例如/Data/Raw,/Data/Processed,/Scripts,/Models,/Outputs,/Docs。所有路径在脚本中使用绝对路径或相对于项目根目录的相对路径。参数配置文件化将生境质量阈值、面积阈值、阻力值字典等关键参数写入一个单独的JSON或YAML配置文件如config.yaml。主脚本读取该配置文件使得修改参数无需改动代码。# config.yaml habitat_quality: threshold: 0.65 min_source_area_ha: 20 resistance: values: 10: 100 21: 10 31: 20日志记录在Python脚本中使用logging模块记录运行状态、警告和错误信息便于调试和追溯。import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[logging.FileHandler(analysis.log), logging.StreamHandler()])版本控制使用Git管理你的脚本和配置文件。对于输入数据至少记录其来源、版本和处理过程说明。敏感性分析生态安全格局的识别受阈值影响很大。应进行敏感性分析例如尝试不同的生境质量阈值0.6, 0.65, 0.7, 0.75和面积阈值观察源地数量和空间分布的稳定性为决策提供区间参考。交叉验证不要完全依赖单一模型InVEST的结果。可以结合其他方法如形态学空间格局分析MSPA、电路理论识别源地与廊道进行交叉对比提高结果的可信度。明确不确定性在最终报告或图中需要说明分析的不确定性来源如数据精度、模型参数设定威胁权重、衰减距离、阈值选择的主观性等。掌握从数据预处理、模型运行到结果提取与可视化的完整链条你就能独立应对大多数区域的生态安全格局分析任务。核心在于理解每个步骤的地理意义和模型原理而不仅仅是操作步骤。当遇到问题时多检查数据本身范围、值域、投影、参数表的对应关系以及文件路径。尝试将整个流程脚本化不仅能提升效率更是对自身GIS分析与编程能力的极大锻炼。接下来你可以进一步探索如何将识别出的生态安全格局与国土空间规划“三区三线”进行叠加分析或评估不同发展情景下的生态安全格局变化让分析成果真正服务于科学决策。