如何将纯数据矩阵转换为指定LCC投影的栅格图层?
问题出在你直接用raster(mx, crs=mycrs)的时候,这个方法默认会给栅格设置一个extent(0,1,0,1)的范围——不管你指定的CRS是什么单位,这个默认范围都是0到1,自然会导致分辨率完全不符合你的7500米要求。要解决这个问题,我们需要先给栅格指定正确的地理范围(对应你提供的经纬度边界),再匹配行列数和分辨率,最后把矩阵值填充进去。
下面是具体的步骤和代码:
解决步骤
- 先把你给出的经纬度边界点转换为目标LCC投影下的坐标(因为你的CRS是米单位的LCC,不能直接用经纬度作为extent);
- 用转换后的LCC坐标创建正确的栅格范围(extent);
- 创建匹配你矩阵行列数的空栅格模板,指定CRS和extent;
- 将矩阵的值赋值给这个栅格模板。
完整代码
library(raster) library(sp) # 你的原始矩阵 mx <- matrix(rep(1, 13770), nrow=90, ncol=153) # 定义目标LCC投影参数 mycrs <- CRS("+proj=lcc +lat_1=30 +lat_2=60 +lat_0=37.99787 +lon_0=127.4592 +datum=WGS84 +units=m +no_defs") # 你提供的经纬度边界点(WGS84坐标系) lat_lon_bounds <- data.frame( lon = c(123.25, 131.78, 123.80, 131.01), lat = c(43.23, 43.17, 32.73, 32.68) ) # 转换为空间点对象,指定经纬度坐标系(WGS84) sp_latlon <- SpatialPoints(lat_lon_bounds, proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs")) # 将经纬度点转换到目标LCC投影 sp_lcc <- spTransform(sp_latlon, mycrs) # 获取转换后的LCC坐标 lcc_coords <- coordinates(sp_lcc) # 计算栅格的extent(取转换后坐标的极值) r_extent <- extent( xmin = min(lcc_coords[, 1]), xmax = max(lcc_coords[, 1]), ymin = min(lcc_coords[, 2]), ymax = max(lcc_coords[, 2]) ) # 创建空栅格模板:匹配矩阵的行列数,指定extent和CRS r <- raster( ext = r_extent, crs = mycrs, nrow = nrow(mx), ncol = ncol(mx) ) # 将矩阵的值赋值给栅格 values(r) <- mx # 查看最终栅格信息 print(r)
为什么之前的方法不行?
当你直接用raster(mx, crs=mycrs)时,raster()函数会默认把矩阵的行列映射到*(0,1)的x和y范围,计算出来的分辨率就是1/(ncol-1)和1/(nrow-1)——这和你需要的7500米完全不相关。而且此时你不能直接设置res=7500,因为这个分辨率和默认的0-1范围、矩阵的行列数无法匹配(计算出来的范围会是0到1537500,和默认的0-1冲突),所以会报错。
额外说明
如果你的经纬度边界是严格的规则矩形(四个角点的经度/纬度完全对齐),转换后的LCC范围会更规整。现在你的边界有细微偏差(比如右上角纬度比左上角略低),用极值生成的extent会覆盖所有点,是合理的处理方式。
内容的提问来源于stack exchange,提问作者Kongsol
相关产品推荐
相关产品推荐

