欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python利用GDAL模塊實現(xiàn)讀取柵格數(shù)據(jù)并對指定數(shù)據(jù)加以篩選掩膜

 更新時間:2023年02月23日 14:10:04   作者:瘋狂學(xué)習(xí)GIS  
這篇文章主要為大家詳細(xì)介紹了如何基于Python語言中g(shù)dal模塊,對遙感影像數(shù)據(jù)進(jìn)行柵格讀取與計算,同時基于QA波段對像元加以篩選、掩膜的操作,需要的可以參考一下

本文介紹基于Python語言中gdal模塊,對遙感影像數(shù)據(jù)進(jìn)行柵格讀取與計算,同時基于QA波段對像元加以篩選、掩膜的操作。

本文所要實現(xiàn)的需求具體為:現(xiàn)有自行計算的全球葉面積指數(shù)(LAI.tif格式柵格產(chǎn)品(下稱“自有產(chǎn)品”),為了驗證其精確度,需要與已有學(xué)者提出的成熟產(chǎn)品——GLASS全球LAI.hdf格式柵格產(chǎn)品(下稱“GLASS產(chǎn)品”)進(jìn)行做差對比;其中,自有產(chǎn)品除了LAI波段外,還有一個質(zhì)量評估波段QA),即自有產(chǎn)品在后期使用時,還需結(jié)合QA波段進(jìn)行篩選、掩膜等處理。其中,二者均為基于MODIS hv分幅的產(chǎn)品。

本文分為兩部分,第一部分為代碼的詳細(xì)分段講解,第二部分為完整代碼。

1 代碼分段講解

1.1 模塊與路徑準(zhǔn)備

首先,需要對用到的模塊與存放柵格圖像的各類路徑加以準(zhǔn)備。

import os
import copy
import numpy as np
import pylab as plt
from osgeo import gdal

# rt_file_path="G:/Postgraduate/LAI_Glass_RTlab/Rc_Lai_A2018161_h12v03.tif"
# gl_file_path="G:/Postgraduate/LAI_Glass_RTlab/GLASS01E01.V50.A2018161.h12v03.2020323.hdf"
# out_file_path="G:/Postgraduate/LAI_Glass_RTlab/test.tif"
rt_file_path="I:/LAI_RTLab/A2018161/"
gl_file_path="I:/LAI_Glass/2018161/"
out_file_path="I:/LAI_Dif/"

其中,rt_file_path為自有產(chǎn)品的存放路徑,gl_file_pathGLASS產(chǎn)品的存放路徑,out_file_path為最終二者柵格做完差值處理后結(jié)果的存放路徑。

1.2 柵格圖像文件名讀取與配對

接下來,需要將全部待處理的柵格圖像用os.listdir()進(jìn)行獲取,并用for循環(huán)進(jìn)行循環(huán)批量處理操作的準(zhǔn)備。

rt_file_list=os.listdir(rt_file_path)
for rt_file in rt_file_list:
    file_name_split=rt_file.split("_")
    rt_hv=file_name_split[3][:-4]
    
    gl_file_list=os.listdir(gl_file_path)
    for gl_file in gl_file_list:
        if rt_hv in gl_file:
            rt_file_tif_path=rt_file_path+rt_file
            gl_file_tif_path=gl_file_path+gl_file

其中,由于本文需求是對兩種產(chǎn)品做差,因此首先需要結(jié)合二者的hv分幅編號,將同一分幅編號的兩景遙感影像放在一起;因此,依據(jù)自有產(chǎn)品文件名的特征,選擇.split()進(jìn)行字符串分割,并隨后截取獲得遙感影像的hv分幅編號。

1.3 輸出文件名稱準(zhǔn)備

前述1.1部分已經(jīng)配置好了輸出文件存放的路徑,但是還沒有進(jìn)行輸出文件文件名的配置;因此這里我們需要配置好每一個做差后的遙感影像的文件存放路徑與名稱。其中,我們就直接以遙感影像的hv編號作為輸出結(jié)果文件名。

            DRT_out_file_path=out_file_path+"DRT/"
            if not os.path.exists(DRT_out_file_path):
                os.makedirs(DRT_out_file_path)
            DRT_out_file_tif_path=os.path.join(DRT_out_file_path,rt_hv+".tif")
            
            eco_out_file_path=out_file_path+"eco/"
            if not os.path.exists(eco_out_file_path):
                os.makedirs(eco_out_file_path)
            eco_out_file_tif_path=os.path.join(eco_out_file_path,rt_hv+".tif")
            
            wat_out_file_path=out_file_path+"wat/"
            if not os.path.exists(wat_out_file_path):
                os.makedirs(wat_out_file_path)
            wat_out_file_tif_path=os.path.join(wat_out_file_path,rt_hv+".tif")
            
            tim_out_file_path=out_file_path+"tim/"
            if not os.path.exists(tim_out_file_path):
                os.makedirs(tim_out_file_path)
            tim_out_file_tif_path=os.path.join(tim_out_file_path,rt_hv+".tif")

這一部分代碼分為了四個部分,是因為自有產(chǎn)品的LAI是分別依據(jù)四種算法得到的,在做差時需要每一種算法分別和GLASS產(chǎn)品進(jìn)行相減,因此配置了四個輸出路徑文件夾。

1.4 柵格文件數(shù)據(jù)與信息讀取

接下來,利用gdal模塊對.tif.hdf等兩種柵格圖像加以讀取。

            rt_raster=gdal.Open(rt_file_path+rt_file)
            rt_band_num=rt_raster.RasterCount
            rt_raster_array=rt_raster.ReadAsArray()
            rt_lai_array=rt_raster_array[0]
            rt_qa_array=rt_raster_array[1]
            rt_lai_band=rt_raster.GetRasterBand(1)
            # rt_lai_nodata=rt_lai_band.GetNoDataValue()
            # rt_lai_nodata=32767
            # rt_lai_mask=np.ma.masked_equal(rt_lai_array,rt_lai_nodata)
            rt_lai_array_mask=np.where(rt_lai_array>30000,np.nan,rt_lai_array)
            rt_lai_array_fin=rt_lai_array_mask*0.001
            
            gl_raster=gdal.Open(gl_file_path+gl_file)
            gl_band_num=gl_raster.RasterCount
            gl_raster_array=gl_raster.ReadAsArray()
            gl_lai_array=gl_raster_array
            gl_lai_band=gl_raster.GetRasterBand(1)
            gl_lai_array_mask=np.where(gl_lai_array>1000,np.nan,gl_lai_array)
            gl_lai_array_fin=gl_lai_array_mask*0.01
            
            row=rt_raster.RasterYSize
            col=rt_raster.RasterXSize
            geotransform=rt_raster.GetGeoTransform()
            projection=rt_raster.GetProjection()

首先,以上述代碼的第一段為例進(jìn)行講解。其中,gdal.Open()讀取柵格圖像;.RasterCount獲取柵格圖像波段數(shù)量;.ReadAsArray()將柵格圖像各波段的信息讀取為Array格式,當(dāng)波段數(shù)量大于1時,其共有三維,第一維為波段的個數(shù);rt_raster_array[0]表示取Array中的第一個波段,在本文中也就是自有產(chǎn)品的LAI波段;rt_qa_array=rt_raster_array[1]則表示取出第二個波段,在本文中也就是自有產(chǎn)品的QA波段;.GetRasterBand(1)表示獲取柵格圖像中的第一個波段(注意,這里序號不是從0開始而是從1開始);np.where(rt_lai_array>30000,np.nan,rt_lai_array)表示利用np.where()函數(shù)對Array中第一個波段中像素>30000加以選取,并將其設(shè)置為nan,其他值不變。這一步驟是消除圖像中填充值、Nodata值的方法。最后一句*0.001是將圖層原有的縮放系數(shù)復(fù)原。

其次,上述代碼第三段為獲取柵格行、列數(shù)與投影變換信息。

1.5 差值計算與QA波段篩選

接下來,首先對自有產(chǎn)品與GLASS產(chǎn)品加以做差操作,隨后需要對四種算法分別加以提取。

            lai_dif=rt_lai_array_fin-gl_lai_array_fin
            lai_dif=lai_dif*1000
            
            rt_qa_array_bin=copy.copy(rt_qa_array)
            rt_qa_array_row,rt_qa_array_col=rt_qa_array.shape
            for i in range(rt_qa_array_row):
                for j in range(rt_qa_array_col):
                    rt_qa_array_bin[i][j]="{:012b}".format(rt_qa_array_bin[i][j])[-4:]
                    
            # DRT_pixel_pos=np.where((rt_qa_array_bin>=100) & (rt_qa_array_bin==11))
            # eco_pixel_pos=np.where((rt_qa_array_bin<100) & (rt_qa_array_bin==111))
            # wat_pixel_pos=np.where((rt_qa_array_bin<1000) & (rt_qa_array_bin==1011))
            # tim_pixel_pos=np.where((rt_qa_array_bin<1100) & (rt_qa_array_bin==1111))
            
            # colormap=plt.cm.Greens
            # plt.figure(1)
            # # plt.subplot(2,4,1)
            # plt.imshow(rt_lai_array_fin,cmap=colormap,interpolation='none')
            # plt.title("RT_LAI")
            # plt.colorbar()
            # plt.figure(2)
            # # plt.subplot(2,4,2)
            # plt.imshow(gl_lai_array_fin,cmap=colormap,interpolation='none')
            # plt.title("GLASS_LAI")
            # plt.colorbar()
            # plt.figure(3)
            # dif_colormap=plt.cm.get_cmap("Spectral")
            # plt.imshow(lai_dif,cmap=dif_colormap,interpolation='none')
            # plt.title("Difference_LAI (RT-GLASS)")
            # plt.colorbar()
            
            DRT_lai_dif_array=np.where((rt_qa_array_bin>=100) | (rt_qa_array_bin==11),
                                       np.nan,lai_dif)
            eco_lai_dif_array=np.where((rt_qa_array_bin<100) | (rt_qa_array_bin==111),
                                       np.nan,lai_dif)
            wat_lai_dif_array=np.where((rt_qa_array_bin<1000) | (rt_qa_array_bin==1011),
                                       np.nan,lai_dif)
            tim_lai_dif_array=np.where((rt_qa_array_bin<1100) | (rt_qa_array_bin==1111),
                                       np.nan,lai_dif)
            
            # plt.figure(4)
            # plt.imshow(DRT_lai_dif_array)
            # plt.colorbar()
            # plt.figure(5)
            # plt.imshow(eco_lai_dif_array)
            # plt.colorbar()
            # plt.figure(6)
            # plt.imshow(wat_lai_dif_array)
            # plt.colorbar()
            # plt.figure(7)
            # plt.imshow(tim_lai_dif_array)
            # plt.colorbar()

其中,上述代碼前兩句為差值計算與數(shù)據(jù)化整。將數(shù)據(jù)轉(zhuǎn)換為整數(shù),可以減少結(jié)果數(shù)據(jù)圖層的數(shù)據(jù)量(因為不需要存儲小數(shù)了)。

隨后,開始依據(jù)QA波段進(jìn)行數(shù)據(jù)篩選與掩膜。其實各類遙感影像(例如MODISLandsat等)的QA波段都是比較近似的:通過一串二進(jìn)制碼來表示遙感影像的質(zhì)量、信息等,其中不同的比特位往往都代表著一種特性。例如下圖所示為Landsat Collection 2 Level-2QA波段含義。

在這里,QA波段原本為十進(jìn)制(一般遙感影像為了節(jié)省空間,QA波段都是寫成十進(jìn)制的形式),因此需要將其轉(zhuǎn)換為二進(jìn)制;隨后通過獲取指定需要的二進(jìn)制數(shù)據(jù)位數(shù)(在本文中也就是能確定自有產(chǎn)品中這一像素來自于哪一種算法的二進(jìn)制位數(shù)),從而判斷這一像素所得LAI是通過哪一種算法得到的,從而將每種算法對應(yīng)的像素分別放在一起處理。DRT_lai_dif_array等四個變量分別表示四種算法中,除了自己這一種算法得到的像素之外的其他所有像素;之所以選擇這種方式,是因為后期我們可以將其直接掩膜掉,那么剩下的就是這種算法自身的像素了。

其中,上述代碼注釋掉的plt相關(guān)內(nèi)容可以實現(xiàn)繪制空間分布圖,大家感興趣可以嘗試使用。

1.6 結(jié)果柵格文件寫入與保存

接下來,將我們完成上述差值計算與依據(jù)算法進(jìn)行篩選后的圖像保存。

            driver=gdal.GetDriverByName("Gtiff")
            out_DRT_lai=driver.Create(DRT_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_DRT_lai.SetGeoTransform(geotransform)
            out_DRT_lai.SetProjection(projection)
            out_DRT_lai.GetRasterBand(1).WriteArray(DRT_lai_dif_array)
            out_DRT_lai=None
            
            driver=gdal.GetDriverByName("Gtiff")
            out_eco_lai=driver.Create(eco_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_eco_lai.SetGeoTransform(geotransform)
            out_eco_lai.SetProjection(projection)
            out_eco_lai.GetRasterBand(1).WriteArray(eco_lai_dif_array)
            out_eco_lai=None
            
            driver=gdal.GetDriverByName("Gtiff")
            out_wat_lai=driver.Create(wat_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_wat_lai.SetGeoTransform(geotransform)
            out_wat_lai.SetProjection(projection)
            out_wat_lai.GetRasterBand(1).WriteArray(wat_lai_dif_array)
            out_wat_lai=None
            
            driver=gdal.GetDriverByName("Gtiff")
            out_tim_lai=driver.Create(tim_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_tim_lai.SetGeoTransform(geotransform)
            out_tim_lai.SetProjection(projection)
            out_tim_lai.GetRasterBand(1).WriteArray(tim_lai_dif_array)
            out_tim_lai=None
            
            print(rt_hv)

其中,.GetDriverByName("Gtiff")表示保存為.tif格式的GeoTIFF文件;driver.Create(DRT_out_file_tif_path,row,col,1,gdal.GDT_Float32)表示按照路徑、行列數(shù)、波段數(shù)與數(shù)據(jù)格式等建立一個新的柵格圖層,作為輸出圖層的框架;其后表示分別將地理投影轉(zhuǎn)換信息與像素具體數(shù)值分別賦予這一新建的柵格圖層;最后=None表示將其從內(nèi)存空間中釋放,完成寫入與保存工作。

2 完整代碼

本文所需完整代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 15 19:36:15 2021

@author: fkxxgis
"""

import os
import copy
import numpy as np
import pylab as plt
from osgeo import gdal

# rt_file_path="G:/Postgraduate/LAI_Glass_RTlab/Rc_Lai_A2018161_h12v03.tif"
# gl_file_path="G:/Postgraduate/LAI_Glass_RTlab/GLASS01E01.V50.A2018161.h12v03.2020323.hdf"
# out_file_path="G:/Postgraduate/LAI_Glass_RTlab/test.tif"
rt_file_path="I:/LAI_RTLab/A2018161/"
gl_file_path="I:/LAI_Glass/2018161/"
out_file_path="I:/LAI_Dif/"

rt_file_list=os.listdir(rt_file_path)
for rt_file in rt_file_list:
    file_name_split=rt_file.split("_")
    rt_hv=file_name_split[3][:-4]
    
    gl_file_list=os.listdir(gl_file_path)
    for gl_file in gl_file_list:
        if rt_hv in gl_file:
            rt_file_tif_path=rt_file_path+rt_file
            gl_file_tif_path=gl_file_path+gl_file
            
            DRT_out_file_path=out_file_path+"DRT/"
            if not os.path.exists(DRT_out_file_path):
                os.makedirs(DRT_out_file_path)
            DRT_out_file_tif_path=os.path.join(DRT_out_file_path,rt_hv+".tif")
            
            eco_out_file_path=out_file_path+"eco/"
            if not os.path.exists(eco_out_file_path):
                os.makedirs(eco_out_file_path)
            eco_out_file_tif_path=os.path.join(eco_out_file_path,rt_hv+".tif")
            
            wat_out_file_path=out_file_path+"wat/"
            if not os.path.exists(wat_out_file_path):
                os.makedirs(wat_out_file_path)
            wat_out_file_tif_path=os.path.join(wat_out_file_path,rt_hv+".tif")
            
            tim_out_file_path=out_file_path+"tim/"
            if not os.path.exists(tim_out_file_path):
                os.makedirs(tim_out_file_path)
            tim_out_file_tif_path=os.path.join(tim_out_file_path,rt_hv+".tif")

            rt_raster=gdal.Open(rt_file_path+rt_file)
            rt_band_num=rt_raster.RasterCount
            rt_raster_array=rt_raster.ReadAsArray()
            rt_lai_array=rt_raster_array[0]
            rt_qa_array=rt_raster_array[1]
            rt_lai_band=rt_raster.GetRasterBand(1)
            # rt_lai_nodata=rt_lai_band.GetNoDataValue()
            # rt_lai_nodata=32767
            # rt_lai_mask=np.ma.masked_equal(rt_lai_array,rt_lai_nodata)
            rt_lai_array_mask=np.where(rt_lai_array>30000,np.nan,rt_lai_array)
            rt_lai_array_fin=rt_lai_array_mask*0.001
            
            gl_raster=gdal.Open(gl_file_path+gl_file)
            gl_band_num=gl_raster.RasterCount
            gl_raster_array=gl_raster.ReadAsArray()
            gl_lai_array=gl_raster_array
            gl_lai_band=gl_raster.GetRasterBand(1)
            gl_lai_array_mask=np.where(gl_lai_array>1000,np.nan,gl_lai_array)
            gl_lai_array_fin=gl_lai_array_mask*0.01
            
            row=rt_raster.RasterYSize
            col=rt_raster.RasterXSize
            geotransform=rt_raster.GetGeoTransform()
            projection=rt_raster.GetProjection()
            
            lai_dif=rt_lai_array_fin-gl_lai_array_fin
            lai_dif=lai_dif*1000
            
            rt_qa_array_bin=copy.copy(rt_qa_array)
            rt_qa_array_row,rt_qa_array_col=rt_qa_array.shape
            for i in range(rt_qa_array_row):
                for j in range(rt_qa_array_col):
                    rt_qa_array_bin[i][j]="{:012b}".format(rt_qa_array_bin[i][j])[-4:]
                    
            # DRT_pixel_pos=np.where((rt_qa_array_bin>=100) & (rt_qa_array_bin==11))
            # eco_pixel_pos=np.where((rt_qa_array_bin<100) & (rt_qa_array_bin==111))
            # wat_pixel_pos=np.where((rt_qa_array_bin<1000) & (rt_qa_array_bin==1011))
            # tim_pixel_pos=np.where((rt_qa_array_bin<1100) & (rt_qa_array_bin==1111))
            
            # colormap=plt.cm.Greens
            # plt.figure(1)
            # # plt.subplot(2,4,1)
            # plt.imshow(rt_lai_array_fin,cmap=colormap,interpolation='none')
            # plt.title("RT_LAI")
            # plt.colorbar()
            # plt.figure(2)
            # # plt.subplot(2,4,2)
            # plt.imshow(gl_lai_array_fin,cmap=colormap,interpolation='none')
            # plt.title("GLASS_LAI")
            # plt.colorbar()
            # plt.figure(3)
            # dif_colormap=plt.cm.get_cmap("Spectral")
            # plt.imshow(lai_dif,cmap=dif_colormap,interpolation='none')
            # plt.title("Difference_LAI (RT-GLASS)")
            # plt.colorbar()
            
            DRT_lai_dif_array=np.where((rt_qa_array_bin>=100) | (rt_qa_array_bin==11),
                                       np.nan,lai_dif)
            eco_lai_dif_array=np.where((rt_qa_array_bin<100) | (rt_qa_array_bin==111),
                                       np.nan,lai_dif)
            wat_lai_dif_array=np.where((rt_qa_array_bin<1000) | (rt_qa_array_bin==1011),
                                       np.nan,lai_dif)
            tim_lai_dif_array=np.where((rt_qa_array_bin<1100) | (rt_qa_array_bin==1111),
                                       np.nan,lai_dif)
            
            # plt.figure(4)
            # plt.imshow(DRT_lai_dif_array)
            # plt.colorbar()
            # plt.figure(5)
            # plt.imshow(eco_lai_dif_array)
            # plt.colorbar()
            # plt.figure(6)
            # plt.imshow(wat_lai_dif_array)
            # plt.colorbar()
            # plt.figure(7)
            # plt.imshow(tim_lai_dif_array)
            # plt.colorbar()
            
            driver=gdal.GetDriverByName("Gtiff")
            out_DRT_lai=driver.Create(DRT_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_DRT_lai.SetGeoTransform(geotransform)
            out_DRT_lai.SetProjection(projection)
            out_DRT_lai.GetRasterBand(1).WriteArray(DRT_lai_dif_array)
            out_DRT_lai=None
            
            driver=gdal.GetDriverByName("Gtiff")
            out_eco_lai=driver.Create(eco_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_eco_lai.SetGeoTransform(geotransform)
            out_eco_lai.SetProjection(projection)
            out_eco_lai.GetRasterBand(1).WriteArray(eco_lai_dif_array)
            out_eco_lai=None
            
            driver=gdal.GetDriverByName("Gtiff")
            out_wat_lai=driver.Create(wat_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_wat_lai.SetGeoTransform(geotransform)
            out_wat_lai.SetProjection(projection)
            out_wat_lai.GetRasterBand(1).WriteArray(wat_lai_dif_array)
            out_wat_lai=None
            
            driver=gdal.GetDriverByName("Gtiff")
            out_tim_lai=driver.Create(tim_out_file_tif_path,row,col,1,gdal.GDT_Float32)
            out_tim_lai.SetGeoTransform(geotransform)
            out_tim_lai.SetProjection(projection)
            out_tim_lai.GetRasterBand(1).WriteArray(tim_lai_dif_array)
            out_tim_lai=None
            
            print(rt_hv)

到此這篇關(guān)于Python利用GDAL模塊實現(xiàn)讀取柵格數(shù)據(jù)并對指定數(shù)據(jù)加以篩選掩膜的文章就介紹到這了,更多相關(guān)Python GDAL讀取柵格數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論