当前位置:首页>python>基于Python代码实现批量提取栅格数据

基于Python代码实现批量提取栅格数据

  • 2026-09-12 02:30:06
基于Python代码实现批量提取栅格数据

一、前言

Arcgis中很多空间分析在具体分析过程中基本是重复进行的,所以批量操作可以极大提高效率,所以今天带来源码用于Arcgis批量提取栅格数据,提取栅格数据分为两种常见场景,一是按掩膜提取(矢量边界裁剪);二是按照属性提取(栅格值筛选)两种常见场景,栅格数据主要包含tif和img两种格式,举个例子,手上有全国2000-2025年的夜光数据(tif),想要提取广东省的夜间灯光数据,这种情景下就很适用。或者手里面有全国2000-2025年的夜光数据(tif),想要提取出DN大于20的夜间灯光范围,以上举的两种案例均非常适用。

二、具体代码

-- coding: cp1252 -- # ArcGIS 10.3 Python2.7 专属编码声明,解决中文乱码

import arcpy
import os
import sys
import traceback

= 第一步:ArcGIS 10.3 环境初始化(批量提取核心配置)=

def init_arcgis_env(output_folder, scratch_folder=None):
"""
初始化ArcGIS 10.3运行环境,解决批量提取常见问题
:param output_folder: 提取结果输出文件夹
:param scratch_folder: 临时文件存储路径(可选)
:return: 环境配置成功返回True,失败返回False
"""
try:

核心环境参数(批量提取必设)

arcpy.env.overwriteOutput = True

允许覆盖重复结果,避免批量中断

arcpy.env.addOutputsToMap = False

关闭自动加载图层,提升提取速度

arcpy.env.workspace = output_folder

设置默认工作空间

arcpy.env.scratchWorkspace = scratch_folder if scratch_folder else arcpy.env.scratchWorkspace
arcpy.env.parallelProcessingFactor = "100%"

启用多核并行,加快批量提取

授权空间分析扩展(栅格提取必备)

if arcpy.CheckExtension("Spatial") == "Available":
arcpy.CheckOutExtension("Spatial")
print(u"✅ 空间分析扩展模块授权成功")
else:
raise Exception(u"❌ 空间分析扩展未授权,请检查ArcGIS 10.3许可")

Python2.7 中文编码修复(ArcGIS 10.3 关键)

reload(sys)
sys.setdefaultencoding('utf-8')

创建输出/临时文件夹(避免路径不存在报错)

if not os.path.exists(output_folder):
os.makedirs(output_folder)
if scratch_folder and not os.path.exists(scratch_folder):
os.makedirs(scratch_folder)
print(u"✅ ArcGIS 10.3 环境初始化完成")
return True
except Exception as e:
print(u"❌ 环境初始化失败:{}".format(str(e)))
traceback.print_exc()
return False

=第二步:批量栅格提取核心函数 =

def batch_extract_raster(
input_raster_folder,

待提取栅格文件夹

extract_type,

提取类型:"mask"(掩膜提取)/"attribute"(属性提取)

output_folder,

结果输出文件夹

mask_shp=None,

掩膜提取用的矢量边界(extract_type="mask"时必填)

raster_value=None,

属性提取的栅格值(extract_type="attribute"时必填,如">15")

scratch_folder=None

临时文件路径

):
"""
ArcGIS 10.3 批量提取栅格数据(支持掩膜/属性两种提取方式)
:param input_raster_folder: 待提取栅格文件夹(支持tif/img/bil等格式)
:param extract_type: 提取类型,可选 "mask" 或 "attribute"
:param output_folder: 结果输出文件夹
:param mask_shp: 掩膜矢量边界路径(如.shp),mask模式必填
:param raster_value: 属性提取的栅格值条件(如">15"、"==1"),attribute模式必填
:param scratch_folder: 临时文件路径(可选)
"""

先初始化环境

if not init_arcgis_env(output_folder, scratch_folder):
sys.exit(1)
try:

1. 筛选文件夹内所有栅格数据(ArcGIS 10.3 支持的栅格格式)

arcpy.env.workspace = input_raster_folder

切换到输入文件夹

raster_list = arcpy.ListRasters()

自动识别所有栅格格式,比手动遍历更适配ArcGIS

if not raster_list:
raise Exception(u"❌ 输入文件夹{}中未找到栅格数据".format(input_raster_folder))
total_count = len(raster_list)
print(u"\n📌 共检测到{}个栅格数据,开始批量提取...".format(total_count))

2. 批量处理每个栅格

for idx, raster_name in enumerate(raster_list):

拼接完整路径

input_raster = os.path.join(input_raster_folder, raster_name)

输出文件名(保留原名称+提取类型后缀)

raster_base = os.path.splitext(raster_name)[0]
output_raster = os.path.join(output_folder, u"{}_{}_extract.tif".format(raster_base, extract_type))
print(u"\n🔍 正在处理 {}/{}:{}".format(idx+1, total_count, raster_name))

3. 按提取类型执行操作

if extract_type == "mask":

掩膜提取(矢量边界裁剪栅格)

if not mask_shp or not os.path.exists(mask_shp):
raise Exception(u"❌ mask模式必须指定有效的矢量边界文件")
arcpy.gp.ExtractByMask_sa(input_raster, mask_shp, output_raster)
elif extract_type == "attribute":

属性提取(按栅格值筛选)

if not raster_value:
raise Exception(u"❌ attribute模式必须指定栅格值条件(如'>15')")

构建提取条件(ArcGIS 10.3 ExtractByAttributes 语法)

where_clause = u"VALUE {}".format(raster_value)
arcpy.gp.ExtractByAttributes_sa(input_raster, where_clause, output_raster)
else:
raise Exception(u"❌ 不支持的提取类型{},仅支持mask/attribute".format(extract_type))
print(u"✅ 提取完成:{}".format(output_raster))
print(u"\n🎉 所有栅格提取完成!结果保存至:{}".format(output_folder))
except Exception as e:
print(u"❌ 批量提取失败:{}".format(str(e)))
traceback.print_exc()

打印详细报错堆栈,便于排查ArcGIS 10.3专属问题

finally:

释放扩展模块(ArcGIS 10.3 必须手动释放,否则会占用许可)

arcpy.CheckInExtension("Spatial")
print(u"\n🔍 空间分析扩展模块已释放")

=第三步:主函数(参数配置)=

if __name__ == "__main__":

-------------------------- 请根据需求修改以下参数 --------------------------

基础参数

INPUT_RASTER_FOLDER = r"E:\data\night_light"

待提取栅格文件夹(如夜光数据)

OUTPUT_FOLDER = r"E:\data\extract_result"

提取结果输出文件夹

SCRATCH_FOLDER = r"E:\data\scratch"

临时文件文件夹(可选)

提取类型配置(二选一,注释掉不用的)

【选项1:掩膜提取(矢量裁剪)】

EXTRACT_TYPE = "mask"
MASK_SHP = r"E:\data\city_boundary.shp"

城市边界矢量(掩膜用)

RASTER_VALUE = None

mask模式无需设置

【选项2:属性提取(栅格值筛选)】

EXTRACT_TYPE = "attribute"

MASK_SHP = None # attribute模式无需设置

RASTER_VALUE = ">15" # 筛选栅格值>15的区域(如夜光数据提取建成区)

-------------------------------------------------------------------

执行批量提取

batch_extract_raster(
input_raster_folder=INPUT_RASTER_FOLDER,
extract_type=EXTRACT_TYPE,
output_folder=OUTPUT_FOLDER,
mask_shp=MASK_SHP,
raster_value=RASTER_VALUE,
scratch_folder=SCRATCH_FOLDER
)

三、代码关键说明

环境适配:
开头

-- coding: cp1252 --是 ArcGIS 10.3 Python 2.7 的专属编码声明,解决中文乱码;

arcpy.ListRasters()替代手动遍历文件夹,更适配 ArcGIS 10.3 支持的栅格格式(如 img/bil 等);
强制释放Spatial扩展模块,避免 ArcGIS 10.3 许可被占用。
核心功能:
掩膜提取(mask):通过矢量边界(如城市 shp)裁剪栅格,适合按行政边界提取区域栅格;
属性提取(attribute):按栅格值筛选(如夜光数据 > 15 的像素),适合提取建成区、碳排放相关栅格。
参数说明:
RASTER_VALUE支持的条件:>15(大于 15)、<10(小于 10)、==1(等于 1)、>=5(大于等于 5),符合 ArcGIS 10.3 栅格计算器语法;
输入文件夹支持多格式栅格(tif/img/bil 等),无需手动筛选。

四、ArcGIS 10.3 运行步骤(快速落地)

修改参数:将代码中INPUT_RASTER_FOLDER、OUTPUT_FOLDER等路径替换为本地实际路径;
选择提取模式:注释 / 取消注释EXTRACT_TYPE,配置对应参数(mask 模式填矢量路径,attribute 模式填栅格值条件);
运行脚本:按之前教的 ArcGIS 10.3 运行方式(Python 窗口 / IDLE/CMD),以管理员身份执行;
查看结果:输出文件夹中会生成「原文件名_提取类型_extract.tif」格式的栅格,可直接在 ArcMap 中加载验证。

五、常见问题解决(ArcGIS 10.3 专属)

问题现象
解决方法
提示 “ExtractByMask_sa 不存在”
未授权 Spatial 扩展,手动在 ArcMap 中勾选「自定义→扩展模块→Spatial Analyst」
中文路径提取结果乱码
确保脚本开头编码声明正确,输出文件夹路径用英文,避免空格 / 特殊字符
批量提取卡死
关闭 ArcMap 中多余图层,设置arcpy.env.addOutputsToMap = False,清理临时文件夹
提示 “栅格格式不支持”
用arcpy.ListRasters()替代手动遍历(代码已内置),避免识别非 ArcGIS 支持的栅格

最新文章

随机文章