本文介紹基於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
種不同植被型別分別對應的植被引數數值提取出來,並存放於不同的列表中;隨後即可基於不同列表中的資料加以各項空間分析。