R 中的地理空间数据:我有一个纬度矩阵、一个经度矩阵和一个值矩阵——如何组合?
Geospatial data in R: I have a matrix of latitudes, a matrix of longitudes, and a matrix of values-how combine?
我有三个矩阵:第一个是经度点矩阵,第二个是纬度点矩阵,第三个是在每个纬度和经度测量的空气质量值矩阵。在 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)
)
然而,当我绘制数据时,它们有点 off。我怀疑这是因为我的数据实际上比合成数据中的数据更复杂,并且实际的纬度和经度网格不是均匀分布的,均匀分布是栅格命令所期望的。
但我觉得必须有一种更聪明的方法来组合矩阵,而不是仅仅沿着最小和最大纬度和经度值耕作。我实际上有 lat/lon 的值,所以我不想对它们进行插值。但是经过大量搜索,我无法弄清楚如何。 This 问题接近尾声,发布者找到了解决他们问题的方法,但我的问题没有解决。
如何将两个纬度和经度矩阵与一个数据点矩阵叠加到栅格(或其他空间数据框)中?
作为背景,我从一位同事那里收到了两个 netcdf 文件:一个包含覆盖我们感兴趣区域的纬度和经度点网格。在第一个 netcdf 文件中,纬度和经度是变量,而不是维度。第二个 netcdf 文件包含我们感兴趣的数据,但没有纬度或经度。我想在 R 中映射这些文件中的数据,但是读取 netcdf 文件的标准函数假定 netcdf 文件的维度已经具有纬度和经度。
在讨论 here 之后,我想我可以提取三个信息数组,然后将它们重新组合在一起,但我很难做到这一点。
修订
我找到了一种方法,虽然我确信这是一种可怕的、令人尴尬的低效剥猫皮方法,但我还是分享一下,以防其他人 google- 偶然发现此页面。
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])
我将从使用 提供的尺寸开始。大概是在不同的空间参考系中的坐标?将这些作为栅格后,您可以使用 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
我有三个矩阵:第一个是经度点矩阵,第二个是纬度点矩阵,第三个是在每个纬度和经度测量的空气质量值矩阵。在 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)
)
然而,当我绘制数据时,它们有点 off。我怀疑这是因为我的数据实际上比合成数据中的数据更复杂,并且实际的纬度和经度网格不是均匀分布的,均匀分布是栅格命令所期望的。
但我觉得必须有一种更聪明的方法来组合矩阵,而不是仅仅沿着最小和最大纬度和经度值耕作。我实际上有 lat/lon 的值,所以我不想对它们进行插值。但是经过大量搜索,我无法弄清楚如何。 This 问题接近尾声,发布者找到了解决他们问题的方法,但我的问题没有解决。
如何将两个纬度和经度矩阵与一个数据点矩阵叠加到栅格(或其他空间数据框)中?
作为背景,我从一位同事那里收到了两个 netcdf 文件:一个包含覆盖我们感兴趣区域的纬度和经度点网格。在第一个 netcdf 文件中,纬度和经度是变量,而不是维度。第二个 netcdf 文件包含我们感兴趣的数据,但没有纬度或经度。我想在 R 中映射这些文件中的数据,但是读取 netcdf 文件的标准函数假定 netcdf 文件的维度已经具有纬度和经度。 在讨论 here 之后,我想我可以提取三个信息数组,然后将它们重新组合在一起,但我很难做到这一点。 修订 我找到了一种方法,虽然我确信这是一种可怕的、令人尴尬的低效剥猫皮方法,但我还是分享一下,以防其他人 google- 偶然发现此页面。
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])
我将从使用 提供的尺寸开始。大概是在不同的空间参考系中的坐标?将这些作为栅格后,您可以使用 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