【问题标题】:Extracting matrix from NetCDF and converting it to raster - issues with rows - R从 NetCDF 中提取矩阵并将其转换为栅格 - 行问题 - R
【发布时间】:2020-04-30 04:11:54
【问题描述】:

我从一个 NetCDF 文件中获得了以下矩阵,我试图将其转换为栅格。我知道矩阵有一个 WGS84 投影。

我发现以下代码中已修复的一个问题 - NetCDF 中的纬度 lat 与派生矩阵 clim_ncdf 之间的间距不相等。然而,栅格EI_adj 并没有像从矩阵转换后的那样精确投影,并且所有空间都向南移动。 这个问题让我发疯 - 有没有人知道如何解决它? 源文件(NetCDF 和世界管理员边界)可以从here 下载。

library(raster)
library(ncdf4)
library(lattice)

# Choose variable name
dname <- c("GI")

clim_ncdf <- nc_open("NetCDF_GI.nc")

lon <- ncvar_get(clim_ncdf,"Longitude")
head(lon)
lat <- ncvar_get(clim_ncdf,"Latitude")

# Latitudes have spacing of 0.5 except in two instances:
lat[55:60]
lat[58:59] # problematic ones
# Create a new latitude vector with equal spacing for corrected matrix
nlat <- seq(min(lat),max(lat),0.5)

EI1 <- ncvar_get(clim_ncdf,dname[1])
# This needs to be rotated
rotate <- function(x) t(apply(x, 2, rev))
EI <- rotate(rotate(rotate(EI1)))

# Now adjust EI for the problematic lats:
rows_m_reps <- rep(1,nrow(EI))
rows_m_reps[58] <- 2
rows_m_reps[59] <- 10

# Replicating corresponding rows so we can now have equal latitude distancing
EI_adj <- EI[rep(1:nrow(EI), rows_m_reps), ] 

EIr_adj <- raster(EI_adj,xmn=min(lon), xmx=max(lon),ymn=min(nlat),ymx=max(nlat),
                  crs = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")
plot(EIr_adj)

# Add admin layer
library(rgdal)
world_admin <- readOGR("Countries_WGS84.shp")
plot(world_admin, add = TRUE)

【问题讨论】:

    标签: r matrix raster netcdf


    【解决方案1】:

    您的数据

    library(ncdf4)
    library(raster)
    library(maptools)
    data(wrld_simpl)
    
    clim_ncdf <- nc_open("NetCDF_GI.nc")
    lon <- ncvar_get(clim_ncdf,"Longitude")
    lat <- ncvar_get(clim_ncdf,"Latitude")
    v <- ncvar_get(clim_ncdf, "GI")
    

    这些都是纬度。

    lat2 <- seq(min(lat),max(lat),0.5)
    

    NAs创建一个RasterLayer和一个对应的矩阵

    e <- extent(min(lon)-0.25, max(lon)+0.25, min(lat)-0.25, max(lat)+0.25)
    r <- raster(nrow=length(lat2), ncol=length(lon), ext=e)
    m <- matrix(NA, nrow=length(lat2), ncol=length(lon))
    

    现在旋转并将值分配给矩阵m的正确行

    vv <- t(v[,ncol(v):1])
    i <- rowFromY(r, rev(as.vector(lat)))
    m[i,] <- vv
    

    并将 m 分配给 RasterLayer

    values(r) <- m
    image(r)
    lines(wrld_simpl)
    

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      相关资源
      最近更新 更多