我有两个GIS层-分别称为Soils
和Parcels
-存储为SpatialPolygonsDataFrame
s(SPDF
s),我想对其进行“叠加” in the sense described here。
覆盖操作的结果应为新的SPDF,其中:
SpatialPolygons
组件包含由两层的相交形成的多边形。 (想一想在高射投影仪上叠加两个聚酯薄膜形成的所有原子多边形)。 data.frame
组件记录每个原子多边形所属的Soils
和Parcels
多边形的属性。 我的问题:是否存在执行此操作的R函数? (我什至乐于学习一个仅使
SpatialPolygons
组件正确的函数,计算由两层的交点形成的原子多边形。)我觉得 rgeos 应该具有一个至少可以完成(1)的功能,但似乎不...这是一个图,可以帮助您更清楚地了解我所追求的目标,后面是创建图中所示的
Soils
和Parcels
层的代码。library(rgeos)
## Just a utility function to construct the example layers.
flattenSpatialPolygons <- function(SP) {
nm <- deparse(substitute(SP))
AA <- unlist(lapply(SP@polygons, function(X) X@Polygons))
SpatialPolygons(lapply(seq_along(AA),
function(X) Polygons(AA[X], ID=paste0(nm, X))))
}
## Example Soils layer
Soils <-
local({
A <- readWKT("MULTIPOLYGON(((3 .5,7 1,7 2,3 1.5,3 0.5), (3 1.5,7 2,7 3,3 2.5,3 1.5)))")
AA <- flattenSpatialPolygons(A)
SpatialPolygonsDataFrame(AA,
data.frame(soilType = paste0("Soil_", LETTERS[seq_along(AA)]),
row.names = getSpPPolygonsIDSlots(AA)))
})
## Example Parcels layer
Parcels <-
local({
B <- readWKT("MULTIPOLYGON(((0 0,2 0,2 3,0 3,0 0),(2 0,4 0,4 3,2 3,2 0)),((4 0,6 0,6 3,4 3,4 0)))")
BB <- flattenSpatialPolygons(B)
SpatialPolygonsDataFrame(BB,
data.frame(soilType = paste0("Parcel_", seq_along(BB)),
row.names = getSpPPolygonsIDSlots(BB)))
})
最佳答案
自2014年1月起,栅格软件包包括union()
函数,该函数使操作变得简单:
library(raster)
Intersects <- Soils + Parcels ## Shorthand for union(Soils, Parcels)
## Check that it work
data.frame(Intersects)
## soilType.1 soilType.2
## 1 Soil_A <NA>
## 2 Soil_B <NA>
## 3 <NA> Parcel_1
## 4 <NA> Parcel_2
## 5 <NA> Parcel_3
## 6 Soil_A Parcel_2
## 7 Soil_A Parcel_3
## 8 Soil_B Parcel_2
## 9 Soil_B Parcel_3
plot(Intersects, col = blues9)
关于r - 如何执行两个SpatialPolygonsDataFrame对象的矢量叠加?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15075361/