遥感数据处理系列
一些项目及科研中遇到的小需求,一方面记录自己的学习历程,另一方面帮助大家学习。本系列文章的开发环境为:ArcGIS 10.2.2 + Python 2.7、ENVI 5.3 + IDL 8.5
ArcPy批量计算栅格数据平均值
GLDAS数据下载及处理(NC转TIF)
ArcGIS批量裁剪栅格数据
ArcPy批量栅格重采样
ArcPy批量裁剪栅格数据
前言
如何遥感影像中的异常值?一大堆的遥感数据如何批量处理?又如何把一个文件夹里的所有值为32767的栅格数据设为NoData?那么,一个NB的批处理脚本派上了用场!祭出ArcPy
一、栅格数据异常值处理
1. 原理简介
栅格数据异常值处理主要使用ArcPy的SetNull 函数。
函数使用:
SetNull (in_conditional_raster, in_false_raster_or_constant, {where_clause})
常用参数简介:
in_conditional_raster:表示所需条件结果为真或假的输入栅格。
in_false_raster_or_constant:条件为假时,其值作为输出像元值的输入
where_clause:决定输入像元为真或假的逻辑表达式。
-> 表达式遵循 SQL 表达式的一般格式。where_clause 的一个示例为 "VALUE > 100"。
注意:当逻辑条件为真时,输出栅格的像元值为 NoData ,为假时,输出栅格的像元值为第二个输入栅格的值,即“in_false_raster_or_constant”所代表的栅格数据。
2. 代码
文件组织架构:
输入:
- 一个含有若干栅格数据的文件夹 inws_1 (本例为“.tif”格式)
- 另一个文件夹 inws_2 中的文件数量与顺序和 inws_1 中相同
输出: 在输出路径文件夹下重构文件夹组织形式,并生成若干合并空间范围的tif格式数据
代码实例:
# -*- coding: UTF-8 -*-
from arcpy.sa import *
import arcpy
import glob
import os
'''
功能:
将 输入文件夹 下的 所有栅格数据 的 异常值 设为 NoData
'''
arcpy.CheckOutExtension("spatial") # 检查许可
arcpy.CheckOutExtension("ImageAnalyst") # 检查许可
# 输入路径 应该注意,中文路径,会导致读不出文件
inws = r"F:\LE-daily-LMB"
# 输出路径
outws = r"F:\LE-daily-LMB-setNull"
path_list = os.listdir(inws) # 若存了三年的数据,则里面有三个文件夹,每个文件夹直接放了每年的数据
# 进入二级目录
for i in range(len(path_list)):
path = inws + "\\" + path_list[i] # 年份文件夹的路径
# 重构输出文件夹
outFolder = outws + "\\" + path_list[i]
isExists = os.path.exists(outFolder)
if not isExists:
os.makedirs(outFolder)
# 利用glob包,将二级目录下的所有tif文件读存放到rasters中
rasters = glob.glob(os.path.join(path, "*.tif"))
for ras in rasters:
whereClause = "VALUE = 0" # 无效值
outSetNull = SetNull(ras, ras, whereClause) # 去除无效值
nameT = os.path.basename(ras)
outname = os.path.join(outFolder, nameT) # 合并输出文件名+输出路径
outSetNull.save(outname) # 保存数据
print os.path.basename(nameT) + " ---- OK! ---- "
print path_list[i] + " ---- OK! ---- "
print(" --- All project is OK! --- ")
总结
ArcPy牛皮!毕业万岁!中期快乐!
后记
写博客的初衷是分享我的一些经验,同时也方便自己在其他电脑上进行数据处理。帮了很多人,但评论区小伙伴也有遇到问题的,那么:知识付费,我的时间和经验正好可以解决你的问题。