R 缓冲线在一侧
我有一个包含许多横断面的SpatialLinesDataFrame,我只想使用R在线路的北侧进行缓冲。有人知道模仿arcgis中缓冲工具“侧类型”选项的工具吗?谢谢 如果样条线是X方向单调递增的线段(如果不是,我不知道如何定义直线的南北方向),那么可以使用此代码。基本上,它使用R 缓冲线在一侧,r,mapping,gis,spatial,R,Mapping,Gis,Spatial,我有一个包含许多横断面的SpatialLinesDataFrame,我只想使用R在线路的北侧进行缓冲。有人知道模仿arcgis中缓冲工具“侧类型”选项的工具吗?谢谢 如果样条线是X方向单调递增的线段(如果不是,我不知道如何定义直线的南北方向),那么可以使用此代码。基本上,它使用gBuffer构造缓冲区,并与通过向南延伸线段创建的多边形相交 northbuff <- function(l1, width){ if(length(l1)!=1){ stop("line
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)
}
对于每个SpatialLines
组件,您必须在数据帧上循环执行此操作
如果您的横断面是单线段(即从x,y到x',y'的直线),则无需使用
rgeos
即可实现。如果你的横断面在x坐标上没有严格增加,那么你必须弄清楚如何定义一条线的南北方向。这段代码可以很容易地修改,生成两个多边形作为输出,然后您可以将其输入到函数中,以确定哪个多边形更“北”。请添加更多信息,这样我就不太喜欢这些开放性问题了……我不介意回答它们。我想知道我的答案是否正确。如何生成仅右侧的缓冲区,而不是直线的南北方向?只要开始/结束坐标是有序的,这是一个很好的定义。如果这是一个问题,请将其作为一个问题写出来(假设它尚未得到回答)。
> 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)