我有一个很多横断面的SpatialLinesDataFrame,我想用R在线的北边缓冲。有没有人知道模仿arcgis中Buffer工具的'Side Type'选项的工具?谢谢!
答案 0 :(得分:7)
如果您的横断面是在X中单调增加的线段(如果不是,我不知道如何定义北部和线的南部),您可以使用此代码。基本上,它使用gBuffer
构造缓冲区,并将其与通过向南扩展线段而创建的多边形相交。
northbuff <- function(l1, width){
if(length(l1)!=1){
stop("line is not a single line element")
}
lines = l1@lines
if(length(l1@lines)!=1){
stop("line element is not a single line string")
}
bb = bbox(l1)
xy = coordinates(l1@lines[[1]])[[1]]
if(any(diff(xy[,1])<=0)){
stop("x coord not monotone increasing")
}
xy = xy[order(xy[,1]),]
nx = nrow(xy)
xm = bb[1,1]-width*2
ym = bb[2,1]-width*2
xp = bb[1,2] + width*2
coords = rbind(xy,
c(xp,xy[nx,2]),
c(xp,ym),
c(xm,ym),
c(xm,xy[1,2]),
c(xy[1,1],xy[1,2])
)
p = SpatialPolygons(list(Polygons(list(Polygon(coords)),ID=1)))
b = gBuffer(l1, capStyle="FLAT", width=width)
gDifference(b,p)
}
测试:
> require(sp)
> require(rgeos)
> l1 = readWKT("LINESTRING(0 0,1 5,4 5,5 2,8 2,9 4)")
> plot(northbuff(l1,.2))
> plot(l1,add=TRUE,col="blue",lwd=2)
您必须遍历数据框才能为每个SpatialLines
组件执行此操作。
如果您的横断面是单线段(即从x,y到x',y'的直线),那么它的重要性和可行性没有rgeos
。如果您的横断面在x坐标中没有严格增加,那么您将必须弄清楚如何定义直线的北和南。可以很容易地修改此代码以生成两个多边形作为输出,然后您可以将其输入到函数中以确定哪个更“北”。