首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中将多边形文件的多个字段自动转换为栅格

如何在R中将多边形文件的多个字段自动转换为栅格
EN

Stack Overflow用户
提问于 2017-12-05 19:09:14
回答 1查看 1.5K关注 0票数 0

我有一个代表Thiessen多边形的形状文件。

每个多边形都与表的许多值相关联。

代码语言:javascript
运行
复制
thiessen <- readOGR(dsn = getwd(), layer = poly)
OGR data source with driver: ESRI Shapefile 
Source: ".../raingauges/shp", layer: "thiessen_pol"
with 10 features
It has 5 fields
head(thiessen)
  est est_name p001 p002 p003
0   2   borges    1    8    2
1   0     e018    2    4    3
2   5  starosa    5   15    1
3   6   delfim    4    2    2
4   1     e087    1    1    3
5   3     e010    0    1    0

列'est‘和'est_name’与雨量计的ID和名称有关。下面的列对我很重要,代表了第一天、第二天的降水值,以此类推(举个例子,我只保留了三天,但实际上,我有8年的日降水量数据)。

我需要将多边形转换为栅格,但是对于表的每个字段(列p001、p002等)都要有一个栅格。

有一种简单的方法可以用R中的函数栅格化将多边形转换为光栅。

代码语言:javascript
运行
复制
r_p001 <- rasterize(thiessen, r, field = thiessen$p001)
plot(r_p001)
writeRaster(r_p001, filename=".../raingauges/shp/r_p001.tif")

问题是,我需要手动设置表的字段(列),并将多边形值转换为光栅。由于我有大约2900天(2900列与每个雨量计的降水值),这是不可能做手动。

这些文档无助于澄清如何自动化这个过程,我也没有在互联网上找到任何可以帮助我的东西。

有人知道如何自动将每个字段转换为栅格并保存为tif格式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-06 00:05:22

以下是一种方法:

示例数据

代码语言:javascript
运行
复制
library(raster)
r <- raster(ncols=36, nrows=18)
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20))
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20))
p1 <- list(p1, hole)
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0))
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0))
att <- data.frame(id=1:3, var1=10:12, var2=c(6,9,6))
pols <- spPolygons(p1, p2, p3, attr=att)

重要的是,如果您的数据没有唯一的字段,请按以下方式添加

代码语言:javascript
运行
复制
pols$id <- 1:nrow(pols) 

拉斯特尔

代码语言:javascript
运行
复制
r <- rasterize(pols, r, field='id')

为所有其他变量创建一个层

代码语言:javascript
运行
复制
x <- subs(r, data.frame(pols), by='id', which=2:ncol(pols), filename="rstr.grd")
x
#class       : RasterBrick 
#dimensions  : 18, 36, 648, 2  (nrow, ncol, ncell, nlayers)
#resolution  : 10, 10  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : rstr.grd 
#names       : var1, var2 
#min values  :   10,    6 
#max values  :   12,    9 

另一种方法是使用Raster属性表保留一个层,这样更快,但取决于您的目的,可能是一种不太有用的方法:

代码语言:javascript
运行
复制
r <- rasterize(pols, r, field='id')
f <- as.factor(r)
v <- levels(f)[[1]]

v <- cbind(v, data.frame(pols)[,-1])
levels(f) <- v
f
#class       : RasterLayer 
#dimensions  : 18, 36, 648  (nrow, ncol, ncell)
#resolution  : 10, 10  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory
#names       : layer 
#values      : 1, 3  (min, max)
#attributes  :
# ID var1 var2
#  1   10    6
#  2   11    9
#  3   12    6

然后你可以:

代码语言:javascript
运行
复制
z <- deratify(f)

获得与第一个示例相同的结果

代码语言:javascript
运行
复制
z
#class       : RasterBrick 
#dimensions  : 18, 36, 648, 2  (nrow, ncol, ncell, nlayers)
#resolution  : 10, 10  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory
#names       : var1, var2 
#min values  :   10,    6 
#max values  :   12,    9 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47660951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档