PYTHON处理MOD/MYD11(LST)产品

 一、数据介绍

        MOD数据即TERRA卫星观测得到,TERRA卫星每日地方时上午10:30时过境,称为上午星。而MYD数据为AQUA卫星在每日地方时下午过境,称为下午星。

PYTHON处理MOD/MYD11(LST)产品_第1张图片

二、下载数据

        下载的途径很多,简便的有浩宇摘星卫星影像下载系统(需购买软件使用权);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其他博主的,感谢分享!

你可能感兴趣的:(大数据)