一些项目及科研中遇到的小需求,一方面记录自己的学习历程,另一方面帮助大家学习。本系列文章的开发环境为:ArcGIS 10.2.2 + Python 2.7、ENVI 5.3 + IDL 8.5
ArcGIS批量计算栅格数据平均值(ArcPy方法)
GLDAS数据下载及处理(NC转TIF)
ArcGIS批量裁剪栅格数据(ArcPy方法)
ArcGIS批量栅格重采样(ArcPy方法)
ArcGIS批量裁剪栅格数据(ArcPy方法)
长时序数据怎么处理?一大堆的遥感数据如何批量裁剪?又如何处理为相同范围的栅格数据?那么,一个NB的批处理脚本派上了用场!祭出ArcPy
在文章ArcGIS批量裁剪栅格数据中总结了使用ArcGIS进行栅格数据裁剪的三种方式,但其中适用于批量数据处理最方便的还是使用 Python + ArcPy 的方式进行。本文总结了批处理的两种场景。
栅格数据裁剪主要使用ArcPy的ExtractByMask函数。
函数使用:
ExtractByMask(in_raster, in_mask_data)
常用参数简介:
in_raster:待裁剪的栅格数据
in_mask_data:用于定义裁剪范围的输入掩膜数据
掩膜数据为栅格
-> 将在输出栅格中为掩膜数据中的 NoData 像元指定 NoData 值。
掩膜为要素数据 (常用)
-> 输入栅格中像元的中心位于要素周长范围内,则会在输出中包含这些像元,
-> 其中心落在要素周长之外的像元将会收到 NoData。
注意:掩膜操作时常用shp数据进行按掩膜提取(裁剪),如果为栅格数据格式亦可以通过ArcGIS的 Conversion Tools -> From Raster 具转为shp。
文件组织架构:
输入:
输出: 在输出路径文件夹下生成若干指定空间范围的tif格式数据
代码实例:
# -*- coding: UTF-8 -*-
import arcpy
import glob
import os
'''
批量裁剪:
对输入文件夹下的数据,根据shp文件,进行批量裁剪,结果存放于输出文件夹
需要修改:
inws:输入路径(必选)
outws:输出路径(必选)
mask:参考范围的shp文件(必选)
nameT:建议进行规范化,文件名的易读性(可选)
'''
arcpy.CheckOutExtension('Spatial')
# 输入路径 应该注意,中文路径,会导致读不出文件
inws = r"F:\MODIS09-17\500m\b1\2009"
# 输出路径
outws = r"F:\MODIS09-17\500m-clp\b1\2009"
# 指定shp范围边界文件,即目标区域的边界
mask = r"G:\shp\AidesLake_full.shp"
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters = glob.glob(os.path.join(inws, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for ras in rasters:
# nameT:输出文件名
nameT = os.path.basename(ras) + "_clp.tif"
outname = os.path.join(outws, nameT) # 合并输出文件名+输出路径
out_extract = arcpy.sa.ExtractByMask(ras, mask) # 执行按掩模提取操作
out_extract.save(outname) # 保存数据
print os.path.basename(ras) + " ---- 裁剪完成"
print " ---- 全部裁剪完成 ---- "
上例可实现对输入路径文件夹下的所有栅格数据的按掩膜提取,但多年的数据都需要裁剪怎么办?
修改逻辑为进入二级目录、三级目录…然后调用核心函数即可。
栅格按掩膜提取倒不算费时,却是费事、费心思?想挂机处理?Perfect,继续来!
输入路径文件组织架构:
inws -> 2008、2009、2010...(若干年份文件夹里存放了若干tif文件)
outws -> 2008、2009、2010...(新建若干个空的年份文件夹,与输入路径文件组织架构相同)
代码如下:
# -*- coding: UTF-8 -*-
import arcpy
import glob
import os
'''
批量裁剪(二级目录):
对输入文件夹下的数据,根据shp文件,进行批量裁剪,结果存放于输出文件夹
需要修改:
inws:输入路径(必选)
outws:输出路径(必选)
mask:参考范围的shp文件(必选)
nameT:建议进行规范化,文件名的易读性(可选)
'''
arcpy.CheckOutExtension('Spatial')
# 输入路径 应该注意,中文路径,会导致读不出文件
inws = r"F:\Data_CLDAS\TMP"
# 输出路径
outws = r"F:\TopLeft\CLDAS\TMP"
# 指定shp范围边界文件,即目标区域的边界
mask = r"F:\shp\Mekong_TopLeft.shp"
# 以下逻辑为:
# 获得子目录全路径,并进入子目录
# 执行文件夹批量掩膜操作
path_list = os.listdir(inws) # 如果是存了三年的数据,那里面有三个文件夹,每个文件夹直接放了每年的数据
target_path_list = os.listdir(outws) # 输出路径,也是里面有三个年份的文件夹
for i in range(len(path_list)):
path = inws + "\\" + path_list[i] # 文件夹列表 # 那这里就得到了年份的路径
target_path = outws + "\\" + target_path_list[i] # 进入年份的路径,是处理后的数据存放的地方
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters = glob.glob(os.path.join(path, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for ras in rasters:
nameT = os.path.basename(ras).split(".")[0] + ".tif"
outname = os.path.join(target_path, nameT) # 合并输出文件名+输出路径
out_extract = arcpy.sa.ExtractByMask(ras, mask) # 执行按掩模提取操作
out_extract.save(outname) # 保存数据
print os.path.basename(ras) + " OK!"
print path_list[i] + " --- OK!"
print(" --- All project is OK! --- ")
注意:这里懒了一步,就是要保持输入路径和输出路径的文件组织架构相同,如:输入路径包括三个文件夹,那输出路径也新建三个。为保持头脑清醒,每次都检查下输出是否正确,故每次都新建若干文件夹。
输入路径文件组织架构:
输出路径文件组织架构:
-> inws
-> TMP、PRS、RHU...(二级目录)
-> 2008、2009、2010...(若干年份文件夹里存放了若干tif文件)
-> outws
-> TMP、PRS、RHU...(三级目录)
-> 2008、2009、2010...(若干空白的年份文件夹)
代码如下:
# -*- coding: UTF-8 -*-
import arcpy
import glob
import os
'''
批量裁剪(三级目录):
对输入文件夹下的数据,根据shp文件,进行批量裁剪,结果存放于输出文件夹
需要修改:
inws:输入路径(必选)
outws:输出路径(必选)
mask:参考范围的shp文件(必选)
nameT:建议进行规范化,文件名的易读性(可选)
'''
arcpy.CheckOutExtension('Spatial')
# 输入路径 应该注意,中文路径,会导致读不出文件
inws = r"F:\MODIS09-17\500m"
# 输出路径
outws = r"F:\MODIS09-17\500m-clp"
# 指定shp范围边界文件,即目标区域的边界
mask = r"F:\TopLeft\shp\Mekong_TopLeft.shp"
# 以下逻辑为:
# 获得子目录全路径,并进入子目录
# 执行文件夹批量掩膜操作
path_list = os.listdir(inws) # 如果这里是存了三个参数,那每个参数文件夹又存放了年份文件夹,年份文件夹存放每年的数据
target_path_list = os.listdir(outws) # 输出路径,也对应个三个参数文件夹*若干年份文件夹
# 进入二级目录
for i in range(len(path_list)):
path = inws + "\\" + path_list[i] # 得到年份文件夹路径
target_path = outws + "\\" + target_path_list[i] # 进入了年份的路径,是处理后的数据存放的地方
# 进入三级目录
# 输入路径inws -> 二级目录多年 -> 三级目录待处理文件存放的文件夹
path_list_3 = os.listdir(path) # 输入路径,第三级目录
path_list_3.sort() # python list字符按数字大小排序可用 "key=int" --https://blog.csdn.net/zmlovelx/article/details/94554406
for ii in range(len(path_list_3)): # 第三级目录里的内容
path_3 = path + "\\" + path_list_3[ii] # 第三级目录的完整路径,如:./\TIFF-8day\2008\1
target_path_3 = target_path + "\\" + path_list_3[ii]
# 数据处理核心部分
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters = glob.glob(os.path.join(path_3, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for ras in rasters:
nameT = os.path.basename(ras) + ".tif"
outname = os.path.join(target_path_3, nameT) # 合并输出文件名+输出路径
out_extract = arcpy.sa.ExtractByMask(ras, mask) # 执行按掩模提取操作
out_extract.save(outname) # 保存数据
print os.path.basename(ras) + " OK!"
print path_list[i] + " --- OK!"
print(" --- All project is OK! --- ")
ArcPy牛皮!毕业万岁!中期快乐!
一两个栅格数据的处理,那怎么都好说,数十参数的数十年数据处理,那可就是python真香喽~(这个裁剪的脚本真好用)
写博客的初衷是分享我的一些经验,同时也方便自己在其他电脑上进行数据处理。帮了很多人,但评论区小伙伴也有遇到问题的,那么:知识付费,我的时间和经验正好可以解决你的问题。