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

来源:https://www.cnblogs.com/fkxxgis/p/18074781
-Advertisement-
Play Games

本文介紹基於R語言中的raster包,讀取單張或批量讀取多張柵格圖像,並對柵格圖像數據加以基本處理的方法。 1 包的安裝與導入 首先,我們需要配置好對應的R語言包;前面也提到,我們這裡選擇基於raster包來實現柵格圖像數據的讀取與處理工作。首先,如果有需要的話,我們可以先到raster包在R語言的 ...


  本文介紹基於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包讀取、處理柵格數據加以基本的方法介紹,至於更加深入的用法,我們將在後期的文章中加以介紹。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹三種使用純 CSS 實現星級評分的方式。每種都值得細品一番~ 五角星取自 Element Plus 的 svg 資源 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" style=""> <path fill="c ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、介紹 定義: 用於定義基本操作的自定義行為 本質: 修改的是程式預設形為,就形同於在編程語言層面上做修改,屬於元編程(meta programming) 元編程(Metaprogramming,又譯超編程,是指某類電腦程式的編寫,這 ...
  • 前言 Vue3 作為一款現代的 JavaScript 框架,引入了許多新的特性和改進,其中包括 shallowRef 和 shallowReactive。這兩個功能在Vue 3中提供了更加靈活和高效的狀態管理選項,尤其適用於大型和複雜的應用程式。 Vue 3 的響應式系統 Vue3 引入了新的響應式 ...
  • 作為2024年最受歡迎的Vue.js組件庫之一,ViewDesign憑藉其現代化設計理念、強大功能和可定製性脫穎而出。這款開源UI組件庫提供了豐富的基礎組件、數據展示組件和交互反饋組件,涵蓋了大部分Web開發場景。同時,ViewDesign還具備良好的可訪問性、完善的文檔、活躍的社區支持,並對SEO... ...
  • 前言 我們每天寫vue代碼時都在用defineProps,但是你有沒有思考過下麵這些問題。為什麼defineProps不需要import導入?為什麼不能在非setup頂層使用defineProps?defineProps是如何將聲明的 props 自動暴露給模板? 舉幾個例子 我們來看幾個例子,分別 ...
  • “將抽象和實現解耦,讓它們可以獨立變化。” 橋接模式通過將一個類的抽象部分與實現部分分離開來,使它們可以獨立地進行擴展和修改。 ...
  • 我們都知道,我們寫的Java程式需要先經過編譯,生成了.class文件(位元組碼文件)。然而,電腦並不能直接解釋.class文件裡面的內容,這時候就需要一個能載入、解釋.class文件並且能按.class文件里的內容進行處理的一個東西--JVM。 JVM,就是Java虛擬機。它是一種規範,有針對不同 ...
  • 前言 池化思想在實際開發中有很多應用,指的是針對一些創建成本高,創建頻繁的對象,用完不棄,將其緩存在對象池子里,下次使用時優先從池子里獲取,如果獲取到則可以直接使用,以此降低創建對象的開銷。 我們最熟悉的資料庫連接池就是一種池化思想的應用,資料庫操作是非常頻繁的,資料庫連接的創建、銷毀開銷很大,每次 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...