源码技术
php
java
python
Linux
当前位置:
首页
>
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 支持的栅格
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:596563534@qq.com 。
到底如何学习Python?
【第125期】13套Python编程从入门到精通(含爬虫,数据分析)(共计893.67MB)
最新文章
到底如何学习Python?
Python学到什么程度可以接私活?【内附Python学习礼包】
嵩天《python语言程序设计基础》第三版电子版PDF
2026年3月全广东口碑好的python应用开发培训机构是哪个
PHPinclude-labs靶场差点通关WP-(探姬)-第二章(共两章)
0 基础也能会!用 Python 实现报表自动化(附案例)
【一起学 Python】第 33 天:64-__name__ == __main__ 的作用
一图总结python开发中最重要的库和框架!
Python 怎么学?牢记这9 个核心核心概念就够了
Python|【Pytorch】基于小波时频图与SwinTransformer的轴承故障诊断研究
热门文章
Python从入门到精通day50
Python实现图片形状转换器:让你的照片变身艺术品
Python 机器学习 入门Pandas的使用
复旦大佬终于把Python做成了连环画!!
如何系统学python!!!
10分钟用 Python 做一个自己的 ChatGPT(完整教程)
新书推介:《媒介数据分析与实战基础——Python语言》
微信 Linux 4.1.1 发布:聊天记录管理上线,桌面生态正在改变
重定向日志文件并每行加时间戳【linux运维小技巧之ts命令】
Linux文件的隐藏属性: Isattr、chattr
随机文章
10个月宝宝每天需要喝多少奶粉?
「4个月27万star,超越Linux」:OpenClaw凭什么让全球开发者疯了?
虚拟化与WSL系列--Linux 文件管理器
摆脱云端大模型依赖:Kali Linux推出纯本地自然语言驱动的离线渗透测试方案
25万星标碾压Linux!2026年3月,AI圈彻底变天了
Linux部署OpenClaw
Linus看到Linux的Github星星数被OpenClaw超过会有什么看法?
Linux ELF 符号覆盖问题分析:动态链接库中同名函数的符号冲突
MinIO 环境搭建:Linux 上安装与配置
数据无价!适用于 Linux 的 8 个文件备份程序
Linux PCIe 电源管理软件架构与流程