Lea*_*ser 14 r spatial rgdal r-sp
我试图从顶点位置创建一组多边形,以X,Y格式保存.
以下是我的数据示例 - 每行代表一个多边形的顶点.多边形是正方形
square <- rbind(c(255842.4, 4111578, 255862.4, 4111578, 255862.4, 4111558,
255842.4, 4111558, 255842.4, 4111578, 255842.4, 4111578),
c(257397.0, 4111309, 257417.0, 4111309, 257417.0, 4111289,
257397.0, 4111289, 257397.0, 4111309, 257397.0, 4111309))
ID <- c("SJER1", "SJER2")'
Run Code Online (Sandbox Code Playgroud)
我正在使用SpatialPolygons,因此我的数据需要在列表中.所以我创建了一个循环来尝试从矩阵中将我的数据转换为列表格式.
我创建了一个循环代码,我在本网站的其他一些问题中找到了代码.我打破了每一步,试图理解为什么我只得到一个多边形作为输出,即使我有2组点.
for (i in 1:2) {
pts <- rbind(c(square[i,1], square[i,2]), c(square[i,3], square[i,4]),
c(square[i,5],square[i,6]), c(square[i,7],square[i,8]),
c(square[i,9],square[i,10]))
sp1 <- list(Polygon(pts))
sp2 <- list(Polygons(sp1,i))
sp = SpatialPolygons(sp2)
}
plot(sp)
Run Code Online (Sandbox Code Playgroud)
你能帮我理解我如何调整代码来写出两个多边形而不是一个多边形吗?而且,如果我使用矩阵(方形)作为我的起始数据集,我如何为每个多边形分配ID,如果我指定了一个字符ID,它会将我的所有数据转换为一个字符.
我的最终目标是SpatialPolygons对象中的两个多边形,第一个具有ID SJER1,第二个具有SJER2存储在SpatialPolygons对象中的ID .
然后我会把它写到shapefile中.
jba*_*ums 26
有一些信息?'SpatialPolygons-class',但你或多或少想要做以下事情:
polys <- SpatialPolygons(list(
Polygons(list(Polygon(matrix(square[1, ], ncol=2, byrow=TRUE))), ID[1]),
Polygons(list(Polygon(matrix(square[2, ], ncol=2, byrow=TRUE))), ID[2])
))
plot(polys)
Run Code Online (Sandbox Code Playgroud)

基本要点是您需要创建Polygon对象(例如,从x第一列中的y坐标和第二列中的坐标的2列矩阵).这些组合在列表中以创建Polygons对象(每个对象应具有唯一的ID).这些Polygons对象组合在一个列表中以创建SpatialPolygons对象.CRS如果你愿意,你可以添加一个proj4string参数SpatialPolygons(参见参考资料?SpatialPolygons).
要将其写入ESRI Shapefile,您需要SpatialPolygonsDataFrame通过组合polys我们创建的对象和一些数据将其转换为对象.我们只是将ID添加为数据,因为缺少更有趣的东西.
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))
Run Code Online (Sandbox Code Playgroud)
然后把它写出来......
writeOGR(polys.df, '.', 'fancysquares', 'ESRI Shapefile')
Run Code Online (Sandbox Code Playgroud)
第二个参数('.')表示将其写入当前工作目录.
编辑
要SpatialPolygonsDataFrame在描述多边形的行有很多行时快速创建,可以使用以下命令:
# Example data
square <- t(replicate(50, {
o <- runif(2)
c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o)
}))
ID <- paste0('sq', seq_len(nrow(square)))
# Create SP
polys <- SpatialPolygons(mapply(function(poly, id) {
xy <- matrix(poly, ncol=2, byrow=TRUE)
Polygons(list(Polygon(xy)), ID=id)
}, split(square, row(square)), ID))
# Create SPDF
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))
plot(polys.df, col=rainbow(50, alpha=0.5))
Run Code Online (Sandbox Code Playgroud)
