Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 缓冲线在一侧_R_Mapping_Gis_Spatial - Fatal编程技术网

R 缓冲线在一侧

R 缓冲线在一侧,r,mapping,gis,spatial,R,Mapping,Gis,Spatial,我有一个包含许多横断面的SpatialLinesDataFrame,我只想使用R在线路的北侧进行缓冲。有人知道模仿arcgis中缓冲工具“侧类型”选项的工具吗?谢谢 如果样条线是X方向单调递增的线段(如果不是,我不知道如何定义直线的南北方向),那么可以使用此代码。基本上,它使用gBuffer构造缓冲区,并与通过向南延伸线段创建的多边形相交 northbuff <- function(l1, width){ if(length(l1)!=1){ stop("line

我有一个包含许多横断面的SpatialLinesDataFrame,我只想使用R在线路的北侧进行缓冲。有人知道模仿arcgis中缓冲工具“侧类型”选项的工具吗?谢谢

如果样条线是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)

}
对于每个
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)