一侧缓冲spatialline

时间:2014-02-01 21:04:31

标签: r mapping gis spatial

我有一个很多横断面的SpatialLinesDataFrame,我想用R在线的北边缓冲。有没有人知道模仿arcgis中Buffer工具的'Side Type'选项的工具?谢谢!

1 个答案:

答案 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坐标中没有严格增加,那么您将必须弄清楚如何定义直线的北和南。可以很容易地修改此代码以生成两个多边形作为输出,然后您可以将其输入到函数中以确定哪​​个更“北”。