2014-02-01 2 views
-3

У меня есть SpatialLinesDataFrame из многих разрезов, которые я хотел бы буферизировать только на северной стороне линии, используя R. Кто-нибудь знает инструмент, который имитирует параметр «Боковой тип» для инструмента «Буфер» в arcgis ? Благодаря!Буферная пространственная линия с одной стороны

+0

Пожалуйста, добавьте дополнительную информацию, SO действительно не нравится эти открытые вопросы ... –

+0

Я не против отвечать им. Я хотел бы знать, есть ли у меня хоть какой-то ответ. – Spacedman

ответ

7

Если ваши разрезы - это сегменты линии, которые монотонно увеличиваются в X (а если нет, я не знаю, как вы можете определить, что такое север и что находится к югу от линии), вы можете использовать этот код. В основном он создает буфер с gBuffer и пересекает его с многоугольником, созданным путем расширения сегмента линии на юг.

northbuff <- function(l1, width){ 
    if(length(l1)!=1){ 
     stop("line is not a single line element") 
    } 

    lines = [email protected] 
    if(length([email protected])!=1){ 
     stop("line element is not a single line string") 
    } 

    bb = bbox(l1) 
    xy = coordinates([email protected][[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) 

Вам придется перебрать фрейме данных, чтобы сделать это для каждого компонента.

Если ваши разрезы представляют собой сегменты одной линии (то есть прямую линию от x, y до x ', y'), то ее тривиальная и выполнимая без rgeos. Если ваши разрезы не будут строго возрастать в координатах x, вам нужно будет выяснить, как определить север и юг линии. Этот код можно было бы легко модифицировать, чтобы создать два полигона в качестве вывода, которые затем можно было бы ввести в функцию, чтобы решить, что больше «Север».

Смежные вопросы