[英]Crop netcdf files in R
我正在嘗試從 daily.netcdf 數據中裁剪帶有stars
號 package 的多邊形的 .netcdf 文件。 我想我已經設法做到了並且可以獲得這個 plot
用這個腳本
library(tidyverse)
library(sf)
library(stars)
# Input nc file
nc.file <- "20220301120000-NCEI-L4_GHRSST-SSTblend-AVHRR_OI-GLOB-v02.0-fv02.1.nc"
# read nc data
nc.data <- read_ncdf(nc.file, var="analysed_sst")
# Read mask coordinates
coordenades.poligon <- read_csv("coordenades_poligon.csv")
colnames(coordenades.poligon) <- c("lon","lat")
# Build sf polygon to crop data
polygon <- coordenades.poligon %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
summarise(geometry = st_combine(geometry)) %>%
st_cast("POLYGON")
# Crop data
nc.stars.crop <- st_crop(nc.data,polygon)
# plot
ggplot() + geom_stars(data=nc.stars.crop) +
coord_equal() + theme_void() +
scale_x_discrete(expand=c(0,0))+
scale_y_discrete(expand=c(0,0))
現在我想在一個數據框中組合 lon、lat 和 analysed_sst。 我設法提取坐標
nc.stars.coords <- as.data.frame(st_coordinates(nc.stars.crop))
但找不到如何將相應的 sst 值與經度和緯度進行 cbind。 也許還有其他解決方案ncdf4
package。
非常感謝您的幫助
編輯 1
SST原始數據鏈接(nc文件): SST數據
編輯 2添加了 coordenades_poligons.csv 的負責人。 第一列是經度和緯度點,第三列是區域 ID,第四列表示季節。 這些只是按 ID 和季節篩選的單個區域的坐標。
12.5,44.5,Z1,S
2,44.5,Z1,S
0,41.5,Z1,S
4,40,Z1,S
9,40,Z1,S
9,42,Z1,S
0,41.5,Z2,S
我在這里做假設,因為這不是我的專業領域,但您可以使用raster
-package 將其簡單地轉換為數據集。 這似乎是通往 go 的方式,也是根據該作者的說法。
raster::as.data.frame(nc.stars.crop, xy = TRUE)
至少對我來說這是有效的。 然后你可以將它轉換回一個簡單的特征 object,如果你願意的話
raster::as.data.frame(nc.stars.crop, xy = TRUE) %>%
sf::st_as_sf(coords = c('lon','lat'))
然而,經度/緯度的轉換並不准確,因為它產生的是點數據,而原始信息是柵格數據。 所以很明顯有信息丟失了。
sf::st_as_sf()
似乎開箱即用,但我不確定,因為我無法驗證原始數據的轉換。 對我來說,以下工作:
read_ncdf('20220301120000-NCEI-L4_GHRSST-SSTblend-AVHRR_OI-GLOB-v02.0-fv02.1.nc', var="analysed_sst") %>%
sf::st_as_sf()
這會創建多邊形,即初始柵格圖塊的大小,並且似乎可以保存所有必要的信息。
最后,這里有一個解決方法來准確提取您正在繪制的數據。 您可以通過將 ggplot 分配給變量然后訪問數據層來訪問 ggplot 使用的數據。
p <- ggplot() + geom_stars(data=nc.stars.crop) +
coord_equal() + theme_void() +
scale_x_discrete(expand=c(0,0))+
scale_y_discrete(expand=c(0,0))
p$layers[[1]]$data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.