在R中将矩阵转换为光栅

在R中将矩阵转换为光栅,r,matrix,spatial,raster,R,Matrix,Spatial,Raster,我有一个带有空间坐标和一个变量的矩阵数据。空间分辨率为1000米 > str(dat1) > List of 3 > $ x: num [1:710] 302340 303340 304340 305340 306340 ... > $ y: num [1:1241] 5431470 5432470 5433470 5434470 5435470 ... > $ z: num [1:710, 1:1241] 225 225 225 225 225 ... 我想把它

我有一个带有空间坐标和一个变量的矩阵数据。空间分辨率为1000米

> str(dat1)
> List of 3
> $ x: num [1:710] 302340 303340 304340 305340 306340 ...
> $ y: num [1:1241] 5431470 5432470 5433470 5434470 5435470 ...
> $ z: num [1:710, 1:1241] 225 225 225 225 225 ...
我想把它转换成光栅格式

> dat1$x[1:10]
> [1] 302339.6 303339.6 304339.6 305339.6 306339.6 307339.6 308339.6 309339.6 310339.6 311339.6
> dat1$y[1:10]
>  [1] 5431470 5432470 5433470 5434470 5435470 5436470 5437470 5438470 5439470 5440470
我使用了下面的代码来完成它。但是我得到的决心和我得到的不一样。有没有更好的方法可以用我的真实数据获得相同的分辨率

> r <-raster(
             dat1$z,
             xmn=range(dat1$x)[1], xmx=range(dat1$x)[2],
             ymn=range(dat1$y)[1], ymx=range(dat1$y)[2], 
             crs=CRS("+proj=utm +zone=11 +datum=NAD83")
            )
> r

class       : RasterLayer 
dimensions  : 710, 1241, 881110  (nrow, ncol, ncell)
resolution  : 571.3135, 1746.479  (x, y)
extent      : 302339.6, 1011340, 5431470, 6671470  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=11 +datum=NAD83 
data source : in memory
names       : layer 
values      : 13.65059, 248.6229  (min, max)
>r
类别:光栅
尺寸:7101241881110(nrow、ncol、ncell)
决议:571.31351746.479(x,y)
范围:302339.6101134054314706671470(xmin,xmax,ymin,ymax)
库德。参考:+项目=utm+区域=11+基准=NAD83
数据源:内存中
名称:图层
数值:13.65059248.6229(最小值、最大值)

我想您可能误解了解决方案在这种情况下的含义。它只是范围除以行和列中的单元格数。例如,在您的案例中,分辨率的计算如下:

(1011340 - 302339.6) /1241
# 571.3138

(6671470  - 5431470) / 710
# 1746.479
所以,它真正的意思是每行有1241个正方形,因为每行从
1011340
302339.6
单位(我认为在这种情况下是米),那么每个矩形的宽度是571。类似地,每个矩形从上到下为1746


如果您希望每个光栅点都是边长等于1000米的正方形,那么其范围不应该是
1241*1000
(而不是
(1011340-302339.6)
)?

尝试阅读光栅的帮助。从矩阵创建光栅时,行和列的意义与您想象的不同。您向其输入了1241x710矩阵,但从错误的向量中获取了最大值和最小值

请尝试以下操作:

> # small version of your test set
> dat1=list()
> dat1$x=seq(302339.6,by=1000,len=71)
> dat1$y=seq(5431470,by=1000,len=124)
> dat1$z=matrix(runif(71*124),71,124)
> str(dat1)
List of 3
 $ x: num [1:71] 302340 303340 304340 305340 306340 ...
 $ y: num [1:124] 5431470 5432470 5433470 5434470 5435470 ...
 $ z: num [1:71, 1:124] 0.765 0.79 0.185 0.461 0.421 ...
> image(dat1,asp=1)
漂亮的方形像素。现在创建光栅:

r <-raster(
             dat1$z,
             xmn=range(dat1$x)[1], xmx=range(dat1$x)[2],
             ymn=range(dat1$y)[1], ymx=range(dat1$y)[2], 
             crs=CRS("+proj=utm +zone=11 +datum=NAD83")
            )
plot(r)
方形像素,与图像打印方式相同,分辨率现在是您所期望的:

> r
class       : RasterLayer 
dimensions  : 124, 71, 8804  (nrow, ncol, ncell)
resolution  : 1000, 1000  (x, y)
extent      : 301839.6, 372839.6, 5430970, 5554970  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : in memory
names       : layer 
values      : 7.738103e-05, 0.9995497  (min, max)

分辨率的计算应该是这样的:'>(1011340-302339.6)/710[1]998.5921>(6671470-5431470)/1241[1]999.1942如果您制作较小的示例并给我们代码来制作这些示例,人们调试起来会容易得多。因为我刚刚花了4个小时在这方面,我将补充这个答案。Spacedman所说的“行和列的意义并不是你想象的那样”的意思是,光栅层是按行组织的,即从左到右,从上到下,而矩阵是按列组织的,即从上到下,从左到右。因此,在本例中,dat1[15]将给出与r[15]不同的结果。我个人认为光栅手册中没有足够清楚地说明这一点。你也可以转置矩阵(m):
m
> r
class       : RasterLayer 
dimensions  : 124, 71, 8804  (nrow, ncol, ncell)
resolution  : 1000, 1000  (x, y)
extent      : 301839.6, 372839.6, 5430970, 5554970  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : in memory
names       : layer 
values      : 7.738103e-05, 0.9995497  (min, max)