一、数据介绍
MOD数据即TERRA卫星观测得到,TERRA卫星每日地方时上午10:30时过境,称为上午星。而MYD数据为AQUA卫星在每日地方时下午过境,称为下午星。
二、下载数据
下载的途径很多,简便的有浩宇摘星卫星影像下载系统(需购买软件使用权);NASA(https://ladsweb.modaps.eosdis.nasa.gov/)等。
三、数据预处理
可采用MRT软件进行拼接转投影等P处理,或者其他语言编程实现。
四、 MOD/MYD11A2计算一年的UHI
1.某一目录下存放一年的数据,裁剪→去除空值等无效值→年平均LST→年UHI
###1.同一目录下所有栅格进行裁剪
#导入必要的库
import arcpy
#arcpy需在python2下运行
import glob
import os
#检查Arcgis的权限
arcpy.CheckOutExtension('Spatial')
#输入路径inpath,我这里设置的路径有重复的,所以用path1/2/3...。
#r“...”是对\转置
path1 = r"I:\DR\LST_Year\1_2001data"
#输出路径
path2 = r"I:\DR\LST_Year\2_2001clip"
#掩膜文件定义
mask = r"I:\DR\GIS_HF\合肥市区县(面).shp"
#glob遍历path1路径下的tif文件
rasters = glob.glob(os.path.join(path1, "*.tif"))
#for循环读取rasters列表的的文件,裁剪后输出
for ras in rasters:
# nameT:输出文件名
nameT = os.path.basename(ras).split(".")[0][11:] + "day_clp.tif"
#os.path.basename(ras).split(".")[0][11:] split(".")[0]分割“."[0]第一个.前面的名字 [11:]再选择从第11个字符开始到最后的
#nameT = os.path.basename(ras).split(".")[0] + "night_clp.tif" #day night分成两个文件夹进行裁剪
outname = os.path.join(path2, nameT) # 合并输出文件名+输出路径
out_extract = arcpy.sa.ExtractByMask(ras, mask) # 执行按掩模提取操作
out_extract.save(outname) # 保存数据
print os.path.basename(ras) + " ---- 裁剪完成"
print " ---- 全部裁剪完成 ---- "
path1的文件名如:MOSAIC_TMP_2001001.hdfout.LST_Day_1km.tif
path2的文件名生成:2001001day_clp.tif
#2.去除文件夹内LST的异常值
import os
import glob
import arcpy
from arcpy.sa import *
arcpy.CheckOutExtension("ImageAnalyst") # 检查许可
arcpy.CheckOutExtension("spatial")
# 输入路径
path2 = r"I:\DR\LST_Year\2_2001clip"
path3 = r"I:\DR\LST_Year\3_2001setn"
rasters = glob.glob(os.path.join(path2, "*.tif"))
whereClause = "VALUE <7500 OR VALUE>65535" # 去除异常值
for ras in rasters:
outSetNull = SetNull(ras, ras, whereClause)*0.02-273.15 # 去除异常值
nameT = os.path.basename(ras).split(".")[0][0:7] + "day_setn.tif"
outname = os.path.join(path3, nameT) # 合并输出文件名+输出路径
outSetNull.save(outname) # 保存数据
print os.path.basename(ras) + " ---- 去除异常值完成"
print("All project is OK!")
path3的文件名生成:2001001day_setn.tif
#3.计算年平均LST(单位已换算成温度)
import arcpy
import glob
import os
from arcpy.sa import *
arcpy.CheckOutExtension('Spatial')
path3 = r"I:\DR\LST_Year\3_2001setn"
path4 = r"I:\DR\LST_Year\4_2001avg"
rasters = glob.glob(os.path.join(path3, "*.tif"))
#for只是为了设置输出文件名,应该有其他更简便的方法,请大神们指教
for ras in rasters:
nameT = os.path.basename(ras)[0:4] + "day_ave.tif"
outname = os.path.join(path4, nameT) # 合并输出文件名+输出路径
outCellStats = CellStatistics(rasters, "MEAN", "DATA")
outCellStats.save(outname)
print " ---- 平均值计算完成 ---- "
path4的文件名生成:2001day_ave.tif(年平均,故只有这一个文件)
#4.计算年UHI
#计算UHI的方法很多种,代码中采用计算均值和平方差的阈值来判定
import arcpy
import glob
import os
from arcpy.sa import *
from arcpy.sa import Con
# 检查许可
arcpy.CheckOutExtension("ImageAnalyst")
arcpy.CheckOutExtension('Spatial')
path4 = r"I:\DR\LST_Year\4_2001avg"
path5 = r"I:\DR\LST_Year\5_2001UHI"
rasters = glob.glob(os.path.join(path4, "*.tif"))
for j in range(len(rasters)):
inRaster = arcpy.Raster(rasters[j])
result_std = arcpy.GetRasterProperties_management(inRaster, "STD")
std = result_std.getOutput(0)
result_mean = arcpy.GetRasterProperties_management(inRaster, "MEAN")
mean = result_mean.getOutput(0)
nameT = os.path.basename(rasters[j])[0:4] + "day_UHI.tif"
outname = os.path.join(path5, nameT)
outCon =Con(inRaster < (float(mean)-float(std)),1,
Con((inRaster >= (float(mean)-float(std))) & (inRaster < (float(mean)-0.5*float(std))), 2,
Con((inRaster >= (float(mean)-0.5*float(std))) & (inRaster <= (float(mean)+0.5*float(std))), 3,
Con((inRaster > (float(mean)+0.5*float(std))) & (inRaster <= (float(mean)+float(std))), 4,
Con((inRaster > (float(mean)+float(std))), 5,)))))
outCon.save(outname)
print " ---- UHI分级完成 ---- "
path5的文件名生成:2001day_UHI.tif
2.某一目录下存放多年的数据,基本步骤不变(裁剪→去除空值等无效值→年平均LST→年UHI),但先将数据按年进行分类,放在不同年份的文件夹下,再进行这些操作。
# -*- coding: UTF-8 -*-
#导入库
import glob
import os
import shutil
from arcpy.sa import *
from arcpy.sa import Con
arcpy.CheckOutExtension('Spatial')
#输入路径
path1 = "I:/DR/UHI/test/1LST_DAY"
path2 = "I:/DR/UHI/TEST/2LST_clipHF"
path3 = r"I:\DR\UHI\test\3LST_SETN"
path4 = "I:/DR/UHI/test/4LST_AVG"
path5 = "I:/DR/UHI/test/5UHI"
mask = "I:/DR/GIS_HF/合肥市区县(面).shp"
##1.将文件夹内的文件按照文件名中的年份建立新子文件夹并移过去##
#思路:①将文件夹内所有文件生成列表,②提取文件名[11:15]=i+2000,则移动文件至2000文件夹内,依次完成。
for (root, dirs, files) in os.walk(path1):
for filename in files:
singleFile = os.path.join(root, filename)
# print(singleFile)
# #I:/DR/UHI/test/1LST_DAY\MOSAIC_TMP_2000049.hdfout.LST_Day_1km.tif
res = os.path.splitext(filename)
# print(res)
# #('MOSAIC_TMP_2000049.hdfout.LST_Day_1km', '.tif')
newFileDirs1 = path1 + "/" + res[0][11:15]
# print(newFileDirs)
# #I:/DR/UHI/test/1LST_DAY/2000
# # 文件不存在则新建文件
if not os.path.exists(newFileDirs1):
os.mkdir(newFileDirs1)
# # 将当前文件移动到新建的文件夹里面
shutil.move(singleFile, newFileDirs1 + "\\" + filename)
##2.将文件夹内的子文件夹的文件进行批量裁剪##
# 获得子目录全路径,并进入子目录
# 执行文件夹批量掩膜操作
path_list1 = os.listdir(path1) # 如果是存了三年的数据,那里面有三个文件夹,每个文件夹直接放了每年的数据
for i in range(2000,2003): #建立2000-2002的文件夹,若建立到2021年,则将2003改为2022
# *定义一个变量判断文件是否存在,path指代路径,str(i)指代文件夹的名字*
isExists = os.path.exists(path2+"\\"+str(i))
if not isExists: #判断如果文件不存在,则创建
os.makedirs(path2+"\\"+str(i))
print("%s 目录创建成功"%i)
else:
print("%s 目录已经存在"%i)
continue #如果文件不存在,则继续上述操作,直到循环结束
target_path_list1 = os.listdir(path2) # 输出路径,也是里面有三个年份的文件夹
for i in range(len(path_list1)):
inpath1 = path1 + "\\" + path_list1[i] # 文件夹列表 # 那这里就得到了年份的路径
target_path1 = path2 + "\\" + target_path_list1[i] # 进入年份的路径,是处理后的数据存放的地方
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters1 = glob.glob(os.path.join(inpath1, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for ras1 in rasters1:
nameT1 = os.path.basename(ras1).split(".")[0] + "mod_day.tif"
outname1 = os.path.join(target_path1, nameT1) # 合并输出文件名+输出路径
out_extract = arcpy.sa.ExtractByMask(ras1, mask) # 执行按掩模提取操作
out_extract.save(outname1) # 保存数据
print os.path.basename(ras1) + " OK!"
print path_list1[i] + " --- OK!"
##3.批量去除异常值(二级目录)###
#对输入文件夹的子文件夹的数据,去除异常值,结果存放于输出文件夹的子文件夹
for i in range(2000,2003):
# *定义一个变量判断文件是否存在,path指代路径,str(i)指代文件夹的名字*
isExists = os.path.exists(path3+"\\"+str(i))
if not isExists: #判断如果文件不存在,则创建
os.makedirs(path3+"\\"+str(i))
print("%s 目录创建成功"%i)
else:
print("%s 目录已经存在"%i)
continue #如果文件不存在,则继续上述操作,直到循环结束
path_list2 = os.listdir(path2) # 如果是存了三年的数据,那里面有三个文件夹,每个文件夹直接放了每年的数据
target_path_list2 = os.listdir(path3) # 输出路径,也是里面有三个年份的文件夹
whereClause = "VALUE <7500 OR VALUE>65535" # 去除异常值
for i in range(len(path_list2)):
inpath2 = path2 + "\\" + path_list2[i] # 文件夹列表 # 那这里就得到了年份的路径
target_path2 = path3 + "\\" + target_path_list2[i] # 进入年份的路径,是处理后的数据存放的地方
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters2 = glob.glob(os.path.join(inpath2, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for ras2 in rasters2:
nameT2 = os.path.basename(ras2).split(".")[0][11:18] + "mod_day_setn.tif"
outname2 = os.path.join(target_path2, nameT2) # 合并输出文件名+输出路径
outSetNull = SetNull(ras2, ras2, whereClause)*0.02-273.15 # 去除异常值
outSetNull.save(outname2) # 保存数据
print " ---- 全部去除异常值 ---- "
##4.二级目录计算年LST平均值##
for i in range(2000,2003):
# *定义一个变量判断文件是否存在,path指代路径,str(i)指代文件夹的名字*
isExists = os.path.exists(path4+"\\"+str(i))
if not isExists: #判断如果文件不存在,则创建
os.makedirs(path4+"\\"+str(i))
print("%s 目录创建成功"%i)
else:
print("%s 目录已经存在"%i)
continue #如果文件不存在,则继续上述操作,直到循环结束
path_list3 = os.listdir(path3) # 如果是存了三年的数据,那里面有三个文件夹,每个文件夹直接放了每年的数据
target_path_list3 = os.listdir(path4) # 输出路径,也是里面有三个年份的文件夹
for i in range(len(path_list3)):
inpath3 = path3 + "\\" + path_list3[i] # 文件夹列表 # 那这里就得到了年份的路径
target_path3 = path4 + "\\" + target_path_list3[i] # 进入年份的路径,是处理后的数据存放的地方
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters3 = glob.glob(os.path.join(inpath3, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for ras3 in rasters3:
nameT3 = os.path.basename(ras3)[0:4] + "mod_day_ave.tif"
outname3 = os.path.join(target_path3, nameT3) # 合并输出文件名+输出路径
outCellStats = CellStatistics(rasters3, "MEAN", "DATA")
outCellStats.save(outname3)
print " ---- 平均值计算完成 ---- "
##5.二级目录计算年UHI##
for i in range(2000,2003):
# *定义一个变量判断文件是否存在,path指代路径,str(i)指代文件夹的名字*
isExists = os.path.exists(path5+"\\"+str(i))
if not isExists: #判断如果文件不存在,则创建
os.makedirs(path5+"\\"+str(i))
print("%s 目录创建成功"%i)
else:
print("%s 目录已经存在"%i)
continue #如果文件不存在,则继续上述操作,直到循环结束
path_list4 = os.listdir(path4) # 如果是存了三年的数据,那里面有三个文件夹,每个文件夹直接放了每年的数据
target_path_list4 = os.listdir(path5) # 输出路径,也是里面有三个年份的文件夹
for i in range(len(path_list4)):
inpath4 = path4 + "\\" + path_list4[i] # 文件夹列表 # 那这里就得到了年份的路径
target_path4 = path5 + "\\" + target_path_list4[i] # 进入年份的路径,是处理后的数据存放的地方
# 利用glob包,将inws下的所有tif文件读存放到rasters中
rasters4 = glob.glob(os.path.join(inpath4, "*.tif"))
# 循环rasters中的所有影像,进行按掩模提取操作
for j in range(len(rasters4)):
inRaster = arcpy.Raster(rasters4[j])
result_std = arcpy.GetRasterProperties_management(inRaster, "STD")
std = result_std.getOutput(0)
result_mean = arcpy.GetRasterProperties_management(inRaster, "MEAN")
mean = result_mean.getOutput(0)
nameT4 = os.path.basename(rasters4[j])[0:4] + "mod_day_UHI.tif"
outname4 = os.path.join(target_path4, nameT4)
outCon =Con(inRaster < (float(mean)-float(std)),1,
Con((inRaster >= (float(mean)-float(std))) & (inRaster < (float(mean)-0.5*float(std))), 2,
Con((inRaster >= (float(mean)-0.5*float(std))) & (inRaster <= (float(mean)+0.5*float(std))), 3,
Con((inRaster > (float(mean)+0.5*float(std))) & (inRaster <= (float(mean)+float(std))), 4,
Con((inRaster > (float(mean)+float(std))), 5,)))))
outCon.save(outname4)
print " ---- UHI分级完成 ---- "
部分代码学习参考了csdn其他博主的,感谢分享!