+关注
已关注

分类  

yield(0)

面向对象(0)

三元运算(0)

字典(0)

列表(0)

标签  

字典(0)

列表(0)

面向对象(0)

模块(0)

函数(0)

日期归档  

2019-03(1)

2019-05(2)

2019-06(2)

2019-07(3)

2019-08(112)

ArcPy批量裁剪栅格数据

发布于2020-12-29 13:07     阅读(1081)     评论(0)     点赞(21)     收藏(0)


0

1

2

3

4

5

6

7

遥感数据处理系列

一些项目及科研中遇到的小需求,一方面记录自己的学习历程,另一方面帮助大家学习。

ArcPy批量计算栅格数据平均值
GLDAS数据下载及处理(NC转TIF)
ArcGIS批量裁剪栅格数据
ArcPy批量栅格重采样
ArcPy批量裁剪栅格数据



前言

长时序数据怎么处理?一大堆的遥感数据如何批量裁剪?又如何处理为相同范围的栅格数据?那么,一个NB的批处理脚本派上了用场!祭出ArcPy
在文章ArcGIS批量裁剪栅格数据中总结了使用ArcGIS进行栅格数据裁剪的三种方式,但其中适用于批量数据处理最方便的还是使用 Python + ArcPy 的方式进行。本文总结了批处理的两种场景。


一、栅格数据裁剪

1. 原理简介

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

函数使用:

ExtractByMask(in_raster, in_mask_data)

常用参数简介:

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

注意:掩膜操作时常用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 "         ---- 全部裁剪完成 ----         "

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

二、多文件夹场景

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

1. 二级目录

输入路径文件组织架构:

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

代码如下:

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

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

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...(若干空白的年份文件夹)

代码如下:

# -*- 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真香喽~

原文链接:https://blog.csdn.net/qq_35056050/article/details/111868274

0

1

2

3

4

5

6

7

8

9



所属网站分类: 技术文章 > 博客

作者:goodbody

链接: https://www.pythonheidong.com/blog/article/727172/5021de9b28e4e18eaa7f/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)