基於R語言的raster包讀取遙感影像

疯狂学习GIS發表於2024-03-15

  本文介紹基於R語言中的raster包,讀取單張或批次讀取多張柵格影像,並對柵格影像資料加以基本處理的方法。

1 包的安裝與匯入

  首先,我們需要配置好對應的R語言包;前面也提到,我們這裡選擇基於raster包來實現柵格影像資料的讀取與處理工作。首先,如果有需要的話,我們可以先到raster包在R語言的官方網站中,查閱raster包的基本情況,比如其作者資訊、當前的版本、所依賴的其他包等等;如下圖所示。

image

  當然,這些內容看不看都不影響我們接下來的操作。接下來,我們開始安裝raster包;這裡我是在RStudio中進行程式碼的撰寫的。

  首先,我們輸入如下的程式碼,從而開始raster包的下載與自動配置。

install.packages("raster")

  隨後,按下回車鍵,執行程式碼,如下圖所示。

  可以看到,我們在安裝raster包時,會自動將其所需依賴的其他包(如果在此之前沒有配置過)都一併配置好,非常方便。

  接下來,輸入如下的程式碼,從而將剛剛配置好的raster包匯入。

library(raster)

隨後,按下回車鍵,執行程式碼,如下圖所示。

  此時,在RStudio右下方的“Packages”中,可以看到raster包以及其所依賴的sp包都處於選中的狀態,表明二者都已經配置成功,且完成匯入。

2 單一柵格影像讀取與處理

  接下來,我們首先開始讀取、處理單獨一景柵格影像資料。

  首先,我們輸入如下的程式碼;其中第一句是指定接下來要開啟的柵格影像的路徑與檔名,第二句則是透過raster()函式開啟這一柵格影像。

tif_file_name <- r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\A_LCC0.TIF)"
tif_file <- raster(tif_file_name)

  執行上述程式碼。此時,我們可以在RStudio中右上方的“Environment”中看到我們剛剛新建的兩個變數,以及其對應的值。

  接下來,我們可以直接透過plot()函式,對剛剛讀取到的柵格影像資料加以繪製。

plot(tif_file)

  執行程式碼後,可以在RStudio中右下方的“Plots”看到繪製完畢的影像。可以說,這一繪製柵格影像的方式,相較於PythonC++等語言都更為方便。

  隨後,我們簡單介紹一下對這一柵格影像資料的處理操作。例如,我們可以透過mean()函式與sd()函式,計算柵格影像全部像元數值的平均值和標準差;這裡我們用到了na.rm = TRUE引數,具體含義稍後會提到。

tif_mean <- mean(tif_file[], na.rm = TRUE)
tif_std <- sd(tif_file[], na.rm = TRUE)

  執行上述程式碼,隨後輸入如下的程式碼,即可檢視我們剛剛計算得到的平均值與標準差。

tif_mean
tif_std

  結果圖下圖所示。

  前面我們提到了na.rm = TRUE引數,這一參數列示是否消除資料集中無效值NA的影響;如果我們不將其設定為TRUE,那麼就表示不消除資料集中的無效值;而如果我們的柵格影像中出現無效值(NoData值),那麼就會使得平均值、標準差等計算結果同樣為無效值NA;如下圖所示。

3 大量柵格影像讀取與處理

  接下來,我們介紹一下基於raster包批次讀取大量柵格影像的方法。

  首先,我們需要將存放有大量柵格影像的資料夾明確,並將其帶入list.files()函式中;這一函式可以對指定路徑下的檔案加以遍歷。其中,pattern是對檔名稱加以匹配,我們用".tif$"表示只篩選出檔名稱是以.tif結尾的檔案;full.names表示是否將檔案的全名(即路徑名稱加檔名稱)返回,ignore.case表示是否不考慮匹配檔名稱時的大小寫差異。

tif_file_path <- list.files(r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\0)", pattern = ".tif$", full.names = TRUE, ignore.case = TRUE)

  執行上述程式碼,並將這一變數列印出來,結果如下圖所示。可以看到,此時我們已經將指定路徑下的.tif格式的柵格影像全部提取出來了。

  接下來,我們透過stack()函式,將全部柵格影像的資料放入同一個變數中;隨後,我們可以列印一下這個變數,檢視其中的內容。這裡需要注意,如果透過這種方法批次讀取柵格影像,需要保證每一景影像的空間參考資訊、行數與列數完全一致,否則會彈出報錯資訊。如果大家的柵格影像行數與列數不完全一致,可以參考文章Python實現snap:對齊多張遙感影像的空間範圍,對各個柵格影像加以統一。

tif_file_all <- stack(tif_file_path)
tif_file_all

  執行上述程式碼,得到如下所示的結果。可以看到,這一變數中儲存了12個圖層(雖然柵格影像只有7景,但是其中有幾景是具有多個波段的);其中,除了最基本的柵格影像維度、空間範圍、空間參考資訊等內容,names還展示了12個圖層各自的名稱,min valuesmax values則還展示了每一個圖層的最小值與最大值。

  此外,我們還可以繼續基於plot()函式,直接批次繪製多個圖層各自的柵格影像。

plot(tif_file_all)

  執行上述程式碼,結果如下所示。

  此外,我們還可以基於mean()等函式,對柵格影像的基本數學統計資訊加以計算。不過在對多個柵格影像資料加以計算時需要注意,在tif_file_all後是否新增[]符號,得到的結果是不一樣的——如果不新增[]符號,我們相當於是加以逐像元分析,對每一個位置的像元在12個圖層中的數值加以統計,並計算該像元在12個圖層中的平均值;因此最終所得結果是一景新的柵格影像,影像中的每一個像元數值都表示該像元在12個圖層中的平均值。而如果我們新增了[]符號,那麼就和前述單一柵格影像的處理一樣,計算的結果就是一個數值,即12個圖層中每一個像元對應數值的總體的平均值。

tif_all_mean <- mean(tif_file_all, na.rm = TRUE)
tif_all_mean_2 <- mean(tif_file_all[], na.rm = TRUE)

  我們分別列印上述兩個變數,得到結果如下圖所示。

  由此可以更加明顯地看出新增[]符號與否的差異。

  本文就只是對R語言raster包讀取、處理柵格資料加以基本的方法介紹,至於更加深入的用法,我們將在後期的文章中加以介紹。

相關文章