Python地理数据处理 23:基于arcpy批量操作汇总(五)

之前写了几个关于arcpy使用的博客,但是可能比较零散,如果想使用的话,还需要一个一个的就行运行,比较麻烦,今天我把比较常见的代码合并起来,实现一键运行,十分的方便。

代码:

# -*- coding: utf-8 -*-
import arcpy
import os
import glob
from arcpy.sa import *
import time
import warnings
warnings.filterwarnings('ignore')
arcpy.CheckOutExtension("ImageAnalyst")
arcpy.CheckOutExtension("spatial")
start = time.clock()


###########################1、去除数据集中的异常值#############################
# 定义输入和输出文件夹
input_folder1 = r"D:\dataset"
output_folder1 = r"D:\dataset"

# 循环遍历文件夹下的所有tif文件
for filename in os.listdir(input_folder1):
    if filename.endswith(".tif"):
        # 构建输入和输出路径
        input_path = os.path.join(input_folder1, filename)
        output_path = os.path.join(output_folder1, filename)

        # 使用Map Algebra表达式删除指定的属性表值
        expression = "Con((\"" + input_path + "\" != 655) & (\"" + input_path + "\" != 654), \"" + input_path + "\")"
        expression = "{} * 0.1".format(expression)
        arcpy.gp.RasterCalculator_sa(expression, output_path)
        print filename


###########################对数据进行拆分成单个栅格数据,以便裁剪##########
# 输入tif影像路径
input_raster2 = r"D:\dataset"
output_folder2 = r"D:\dataset"

# 设置工作空间
arcpy.env.workspace = os.path.dirname(input_raster2)

# 获取属性表
desc = arcpy.Describe(input_raster2)
table_path = desc.catalogPath

# 读取Value字段的所有属性
values = []
with arcpy.da.SearchCursor(table_path, "Value") as cursor:
    for row in cursor:
        values.append(row[0])

# 拆分tif影像并保存到输出文件夹
for value in values:
    # 构造查询表达式
    query = "Value = {}".format(value)

    # 创建临时图层
    temp_layer = arcpy.MakeRasterLayer_management(input_raster2, "temp_layer", where_clause=query).getOutput(0)

    # 构造输出文件路径
    output_raster = os.path.join(output_folder2, "attribute_{}.tif".format(value))

    # 保存拆分后的tif影像
    arcpy.CopyRaster_management(temp_layer, output_raster)

    print "Saved {} to {}".format(output_raster, output_folder2)


###########################对a数据按照不同b栅格数据,进行裁剪##########
a_folder = r"D:\dataset"
b_folder = r"D:\dataset"
output_folder3 = r"D:\dataset"

# 设置工作环境
arcpy.env.workspace = a_folder

# 获取a文件夹下的所有tif影像
a_rasters = arcpy.ListRasters("*", "TIF")

# 创建输出文件夹
if not os.path.exists(output_folder3):
    os.makedirs(output_folder3)

# 遍历a文件夹下的每个tif影像
for indexa, a_raster in enumerate(a_rasters):
    # 构建输出文件名前缀
    a_name = os.path.splitext(a_raster)[0]

    a_raster = a_folder + "\\" + a_name + ".tif"
    
    # 设置工作环境为b文件夹
    arcpy.env.workspace = b_folder
    
    # 获取b文件夹下的所有tif影像
    b_rasters = arcpy.ListRasters("*", "TIF")
    
    # 遍历b文件夹下的每个tif影像
    for indexb, b_raster in enumerate(b_rasters):
        # 构建输出文件名
        output_name = a_name + "_" + os.path.splitext(b_raster)[0] + ".tif"
        
        # 构建输出路径
        output_path = os.path.join(output_folder3, output_name)
        
        # 设置工作环境为a文件夹
        arcpy.env.workspace = a_folder

        b_raster = b_folder + "\\"  + b_raster
        
        # 裁剪b影像到输出路径
        arcpy.gp.ExtractByMask_sa(b_raster, a_raster, output_path)
        
        index = indexa + indexb + 1
        print "{} have been completed and the current file is ".format(index) + output_name

print "All finish!!!"


####################获取数据的平均值或者标准差(SD)###################################
input_folder3 = r"D:\dataset"
output_file = r'D:\dataset\table.csv'

rasters = glob.glob(os.path.join(input_folder3, "*.tif"))
where_clause = "VALUE = -32556"

total_rasters = len(rasters)
processed_rasters = 0

with open(output_file, 'w') as output:
    for raster in rasters:
        outSetNull = SetNull(raster, raster, where_clause)
        meanValueInfo = arcpy.GetRasterProperties_management(outSetNull, 'MEAN')
        meanValue = meanValueInfo.getOutput(0)
        output.write(os.path.basename(raster).split('.tif')[0] + ',' + str(meanValue) + '\n')
        
        processed_rasters += 1
        progress = float(processed_rasters) / total_rasters * 100
        print("Processed {} out of {} rasters. Progress: {:.2f}%".format(processed_rasters, total_rasters, progress))

print("All processing is done!")

end = time.clock()
print (str(end-start))

根据你的需求,修改输入和输出文件夹或者文件即可。

猜你喜欢

转载自blog.csdn.net/amyniez/article/details/130672572
今日推荐