Python遙感影像疊加分析:基於一景資料提取另一資料

疯狂学习GIS發表於2024-06-17

  本文介紹基於PythonGDAL模組,實現基於一景柵格影像,對另一景柵格影像的像元數值加以疊加提取的方法。

  本文期望實現的需求為:現有一景表示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種不同植被型別分別對應的植被引數數值提取出來,並存放於不同的列表中;隨後即可基於不同列表中的資料加以各項空間分析。

相關文章