Mar*_*rco 9 gis cut r polygons contour
我想根据高程将多边形层切割成两部分(上部和下部).多边形可能是凸的或凹的,并且要切割的位置可能彼此不同.轮廓线的间隔为5米,这意味着我可能需要生成具有更多浓缩轮廓线的轮廓,例如1米间隔.有关如何做到这一点的想法,更好的在ArcGIS或R?以下是Q的运行示例:
library(sp)
library(raster)
r<-raster(ncol=100,nrow=100)
values(r)<-rep(1:100,100)
plot(r) ### I have no idea why half of the value is negative...
p1<-cbind(c(-100,-90,-50,-100),c(60,70,30,30,60))
p2<-cbind(c(0,50,100,0),c(0,-25,10,0))
p1p<-Polygons(list(Polygon(p1,hole=T)),"p1")
p2p<-Polygons(list(Polygon(p2,hole=T)),"p2")
p<-SpatialPolygons(list(p1p,p2p),1:2)
plot(p,add=T)
segments(-90,80,-90,20) ##where the polygon could be devided
segments(50,20,50,-30) ##
Run Code Online (Sandbox Code Playgroud)
提前谢谢〜
马尔科
如果我理解正确,您可以使用R中的rgeos包和相关的Spatial工具.
我采用这个技巧来缓冲相交的线,然后从这个站点生成"差异"多边形:
http://www.chopshopgeo.com/blog/?p=89
生成示例栅格和上覆多边形.
vdata <- list(x = 1:nrow(volcano), y = 1:ncol(volcano), z = volcano)
## raw polygon data created using image(vdata); xy <- locator()
xy <- structure(list(x = c(43.4965355534823, 41.7658494766076, 36.2591210501883,
25.560334393145, 13.7602020508178, 18.7949251835441, 29.179041644792,
40.6645037913237, 44.2832110429707, 47.272577903027, 47.5872480988224
), y = c(30.0641086410103, 34.1278207016757, 37.6989616034726,
40.900674136118, 32.7732500147872, 27.4781100569505, 22.5523984682652,
22.7986840476995, 24.5226831037393, 29.3252519027075, 33.8815351222414
)), .Names = c("x", "y"))
## close the polygon
coords <- cbind(xy$x, xy$y)
coords <- rbind(coords, coords[1,])
library(sp)
## create a Spatial polygons object
poly <- SpatialPolygons(list(Polygons(list(Polygon(coords, hole = FALSE)), "1")))
## create a contour line that cuts the polygon at height 171
cl <- contourLines(vdata, levels = 171)
## for ContourLines2SLDF
library(maptools)
clines <- ContourLines2SLDF(cl)
Run Code Online (Sandbox Code Playgroud)
现在,将多边形与线相交,然后稍微缓冲线,并再次与多边形区分,以给出多部分多边形.
library(rgeos)
lpi <- gIntersection(poly, clines)
blpi <- gBuffer(lpi, width = 0.000001)
dpi <- gDifference(poly, blpi)
Run Code Online (Sandbox Code Playgroud)
绘制原始数据,并从Spatial对象手动提取多边形.
par(mfrow = c(2,1))
image(vdata)
plot(poly, add = TRUE)
plot(SpatialPolygons(list(Polygons(list(dpi@polygons[[1]]@Polygons[[1]]), "1"))),
add = TRUE, col = "lightblue")
image(vdata)
plot(poly, add = TRUE)
cl <- contourLines(vdata, levels = 171)
plot(SpatialPolygons(list(Polygons(list(dpi@polygons[[1]]@Polygons[[2]]), "2"))),
add = TRUE, col = "lightgreen")
Run Code Online (Sandbox Code Playgroud)
这适用于这个相当简单的情况,它可能对您的场景有用.
| 归档时间: |
|
| 查看次数: |
3648 次 |
| 最近记录: |