本文介紹基於Python中GDAL模塊,實現基於一景柵格影像,對另一景柵格影像的像元數值加以疊加提取的方法。 本文期望實現的需求為:現有一景表示6種不同植被類型的.tif格式柵格數據,以及另一景與前述柵格數據同區域的、表示植被參數的.tif格式柵格數據;我們希望基於前者中的植被類型數據,分別提取6種 ...
本文介紹基於Python中GDAL模塊,實現基於一景柵格影像,對另一景柵格影像的像元數值加以疊加提取的方法。
本文期望實現的需求為:現有一景表示6種不同植被類型的.tif
格式柵格數據,以及另一景與前述柵格數據同區域的、表示植被參數的.tif
格式柵格數據;我們希望基於前者中的植被類型數據,分別提取6種不同植被類型的植被參數數值。這裡需要註意,兩景柵格影像的行數、列數也都是一致的。
瞭解了具體需求後,我們即可開始代碼的實踐;本文用到的具體代碼如下所示。
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 1 16:56:26 2022
@author: fkxxgis
"""
from osgeo import gdal
vt_file_path = "E:/LC_M/data/LC.tif"
lcc_file_path = "E:/LC_M/data/LC_Clip.tif"
vt_raster = gdal.Open(vt_file_path)
vt_array = vt_raster.ReadAsArray()
lcc_raster = gdal.Open(lcc_file_path)
lcc_array = lcc_raster.ReadAsArray()
raster_row, raster_col = vt_array.shape
li_1, li_2, li_3, li_4, li_5, li_6 = [ [] for i in range(6)]
for i in range(raster_row):
for j in range(raster_col):
if vt_array[i][j] == 1 and lcc_array[i][j] != 0:
li_1.append(lcc_array[i][j])
elif vt_array[i][j] == 2 and lcc_array[i][j] != 0:
li_2.append(lcc_array[i][j])
elif vt_array[i][j] == 3 and lcc_array[i][j] != 0:
li_3.append(lcc_array[i][j])
elif vt_array[i][j] == 4 and lcc_array[i][j] != 0:
li_4.append(lcc_array[i][j])
elif vt_array[i][j] == 5 and lcc_array[i][j] != 0:
li_5.append(lcc_array[i][j])
elif vt_array[i][j] == 6 and lcc_array[i][j] != 0:
li_6.append(lcc_array[i][j])
其中,vt_file_path
為表示植被類型的柵格數據,lcc_file_path
為表示植被參數的柵格數據。
代碼的整體思路其實也非常簡單,首先通過gdal.Open()
函數與.ReadAsArray()
函數,分別讀取兩個柵格數據,並將兩個柵格數據中的像元數值信息轉換為數組格式;隨後,因為表示不同植被類型的.tif
格式柵格數據共有6
種不同的像元數值,因此我們通過[] for i in range(6)
這句代碼,批量創建6
個空的列表,用於存放6
種不同植被類型分別對應的植被參數數值;接下來,同時遍歷兩個柵格數據,並基於表示不同植被類型的.tif
格式柵格數據的像元數值,將表示植被參數的.tif
格式柵格數據的像元數值依次提取、放入不同的列表中。
這裡有一點需要註意,因為在表示植被參數的.tif
格式柵格數據中0
為無效值,因此在提取時,加了一個是否為0
的判斷;這一點大家在實際應用時結合自己的需求加以修改即可。
通過上述代碼,我們即可將6
種不同植被類型分別對應的植被參數數值提取出來,並存放於不同的列表中;隨後即可基於不同列表中的數據加以各項空間分析。