【问题标题】:Geospatial data in R: I have a matrix of latitudes, a matrix of longitudes, and a matrix of values-how combine?R中的地理空间数据:我有一个纬度矩阵,一个经度矩阵和一个值矩阵 - 如何组合?
【发布时间】:2020-08-07 19:34:33
【问题描述】:

我有三个矩阵:第一个是经度点矩阵,第二个是纬度点矩阵,第三个是空气质量值矩阵,在每个纬度和经度上测量。在 R 中,我想将所有这些组合成一个栅格。在here 的讨论之后,并使用下面的虚构数据,我认为我可以通过这种方式组合矩阵:

mat.lat=matrix(rep(41:50,10),10)
mat.long=matrix(rep(91:100,10),10)
mat.aq=matrix(rnorm(100),10)

r=raster(mat.aq,
    xmn=min(mat.long),
    xmx=max(mat.long),
    ymn=min(mat.lat),
    ymx=max(mat.lat)
)

但是,当我绘制数据时,它们有点偏离。我怀疑这是因为我的数据实际上比合成数据中的数据更复杂,并且实际的经纬度网格不是均匀分布的,而均匀分布是 raster 命令所期望的。

但我觉得必须有一种更聪明的方法来组合矩阵,而不仅仅是沿着最小和最大纬度和经度值进行耕作。我实际上有纬度/经度的值,所以我不想插入它们。但经过大量搜索,我无法弄清楚如何。 This 问题接近了,发帖人找到了解决我的问题的解决方案。

如何将两个经纬度矩阵与一个数据点矩阵叠加到一个栅格(或其他空间数据框)中?

作为背景,我从一位同事那里收到了两个 netcdf 文件:一个带有覆盖我们感兴趣区域的纬度和经度点网格。在第一个 netcdf 文件中,纬度和经度是变量,而不是维度。第二个 netcdf 文件包含我们感兴趣的数据,但没有纬度或经度。我想在 R 中映射这些文件中的数据,但是用于读取 netcdf 文件的标准函数假定 netcdf 文件的维度已经具有纬度和经度。 在讨论here 之后,我认为我可以提取三个信息数组,并将它们重新分层,但我很难做到这一点。 修订版 我找到了一种方法来做到这一点,虽然我确信这是一种可怕的、令人尴尬的低效剥猫皮的方法,我分享一下,以防其他人在谷歌上偶然发现这个页面。

pts=cbind(lon=as.vector(mat.lon),
        lat=as.vector(mat.lat),
        aq=as.vector(mat.aq))
    inter1=data.frame(pts)
    inter1 <- cbind(inter1, 
        cat = rep(1L, nrow(inter1)),
        stringsAsFactors = FALSE)

    #convert to spatial points
    coordinates(inter1) = ~lon + lat
    proj4string(inter1)<-CRS("+init=epsg:4269")

    r.grid <- raster(inter1,crs=CRS("+init=epsg:4269"),
        nrows=315,
        ncols=288)
    r=rasterize(x=pts[,1:2],y=r,field=pts[,3])

【问题讨论】:

    标签: r geospatial raster netcdf


    【解决方案1】:

    我将从使用 提供的尺寸开始。大概在不同的空间参考系中进行坐标?将这些作为栅格后,您可以使用 projectRaster 转换为 lon/lat。

    如果数据不在规则网格上,则将数据视为点。你可以这样做

    mlat=matrix(rep(41:50,10),10)
    mlong=matrix(rep(91:100,10),10, byrow=TRUE)
    maq=matrix(rnorm(100),10)
    
    pts <- cbind(lat=as.vector(mlat), lon=as.vector(mlong), aq=as.vector(maq))
    

    如果数据在常规网格中(就像在示例数据中一样),您可以这样做

    library(raster)
    r <- rasterFromXYZ(pts)
    plot(r)
    

    如果它们不是,并且您确实希望它们在常规网格上,则需要插值。见 ?raster::interpolate

    【讨论】:

    • 谢谢。我可以使它(愉快地)在示例数据上工作,但不能在实际数据上工作。实际数据是一个 315x288(90,720 个单元格)的网格。我可以创建 pts 数据框,但是该数据框的 rasterFromXYZ 运行了一个小时而没有完成。当我取消它的运行时,我有超过 50 个关于数据大小的错误 In writeBin(v, x@file@con, size = x@file@dsize) : problem writing to connection 我怀疑我以某种方式告诉 R 做比我真正想要的更复杂的事情,但我不确定在哪里
    • &gt; dim(lon)[1] 315 288&gt; dim(lat)[1] 315 288&gt; dim(aq1)[1] 315 288&gt; pts=cbind(lon=as.vector(lon),lat=as.vector(lat),aq=as.vector(aq1))&gt; r=rasterFromXYZ(pts,crs=CRS(epsg.txt))在这里停滞了一个多小时。
    • 我猜该函数找到了这些点所在的规则网格;但它具有极高的分辨率。那不应该发生,我应该调查一下。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多