当前位置:   article > 正文

ArcGIS批量裁剪栅格数据(ArcPy方法)

arcgis批量裁剪栅格数据

遥感数据处理系列

一些项目及科研中遇到的小需求,一方面记录自己的学习历程,另一方面帮助大家学习。本系列文章的开发环境为: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 的方式进行。本文总结了批处理的两种场景。


一、栅格数据裁剪

1. 原理简介

栅格数据裁剪主要使用ArcPy的ExtractByMask函数。

函数使用:

ExtractByMask(in_raster, in_mask_data)
  • 1

常用参数简介:

	in_raster:待裁剪的栅格数据
	in_mask_data:用于定义裁剪范围的输入掩膜数据
		    掩膜数据为栅格
		        -> 将在输出栅格中为掩膜数据中的 NoData 像元指定 NoData 值。
		        
            掩膜为要素数据 (常用)
                -> 输入栅格中像元的中心位于要素周长范围内,则会在输出中包含这些像元,
                -> 其中心落在要素周长之外的像元将会收到 NoData。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意:掩膜操作时常用shp数据进行按掩膜提取(裁剪),如果为栅格数据格式亦可以通过ArcGIS的 Conversion Tools -> From Raster 具转为shp。

2. 代码

文件组织架构:

inws MYD09.2011.001.tif MYD09.2011.002.tif ... outws 空白文件夹

输入:

  1. 一个含有若干栅格数据的文件夹(本例为“.tif”格式)
  2. 待提取空间范围的参考文件(本例为“.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 "         ---- 全部裁剪完成 ----         "

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

上例可实现对输入路径文件夹下的所有栅格数据的按掩膜提取,但多年的数据都需要裁剪怎么办?
修改逻辑为进入二级目录、三级目录…然后调用核心函数即可。

二、多文件夹场景

栅格按掩膜提取倒不算费时,却是费事、费心思?想挂机处理?Perfect,继续来!

1. 二级目录

输入路径文件组织架构:

2009 2010 2011 MYD09.2011.001.tif MYD09.2011.002.tif ... inws 包含文件夹
inws  -> 200820092010...(若干年份文件夹里存放了若干tif文件)
outws -> 200820092010...(新建若干个空的年份文件夹,与输入路径文件组织架构相同)
  • 1
  • 2

代码如下:

# -*- 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!   ---   ")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

注意:这里懒了一步,就是要保持输入路径和输出路径的文件组织架构相同,如:输入路径包括三个文件夹,那输出路径也新建三个。为保持头脑清醒,每次都检查下输出是否正确,故每次都新建若干文件夹。

2. 三级目录

输入路径文件组织架构:

2008 2009 GLDAS.2009001.Qle.tif GLDAS.2009002.Qle.tif ... inws TMP PRS RHU 2008 2009 ... OtherFolder 包含文件夹 包含文件夹

输出路径文件组织架构:

2008 2009 空白文件夹 outws TMP PRS RHU 2008 2009 ... OtherFolder 包含文件夹 包含文件夹
-> inws  
    -> TMP、PRS、RHU...(二级目录)
        -> 200820092010...(若干年份文件夹里存放了若干tif文件)
-> outws
    -> TMP、PRS、RHU...(三级目录)
        -> 200820092010...(若干空白的年份文件夹)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

代码如下:

# -*- 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!   ---   ")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

总结

ArcPy牛皮!毕业万岁!中期快乐!
一两个栅格数据的处理,那怎么都好说,数十参数的数十年数据处理,那可就是python真香喽~(这个裁剪的脚本真好用)

后记

写博客的初衷是分享我的一些经验,同时也方便自己在其他电脑上进行数据处理。帮了很多人,但评论区小伙伴也有遇到问题的,那么:知识付费,我的时间和经验正好可以解决你的问题。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/310528?site
推荐阅读
相关标签
  

闽ICP备14008679号