之前写了几个关于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))
根据你的需求,修改输入和输出文件夹或者文件即可。