2011-04-20 9 views
8

Me gustaría cortar una capa de polígono, según la elevación, en dos partes (parte superior e inferior). El polígono puede ser convexo o cóncavo, y la posición de corte puede variar entre sí. La línea de contorno tiene un intervalo de 5 m, lo que significa que podría necesitar generar un contorno con muchas curvas de nivel condensadas, por ejemplo, un intervalo de 1 m. ¿Alguna idea sobre cómo hacerlo, mejor en ArcGIS o en R? A continuación se muestra el ejemplo de funcionamiento para el Q:Cortar polígonos utilizando la línea de contorno debajo de las capas de polígono

library(sp) 
library(raster) 
r<-raster(ncol=100,nrow=100) 
values(r)<-rep(1:100,100) 
plot(r) ### I have no idea why half of the value is negative... 
p1<-cbind(c(-100,-90,-50,-100),c(60,70,30,30,60)) 
p2<-cbind(c(0,50,100,0),c(0,-25,10,0)) 
p1p<-Polygons(list(Polygon(p1,hole=T)),"p1") 
p2p<-Polygons(list(Polygon(p2,hole=T)),"p2") 
p<-SpatialPolygons(list(p1p,p2p),1:2) 
plot(p,add=T) 
segments(-90,80,-90,20) ##where the polygon could be devided 
segments(50,20,50,-30) ## 

Gracias de antemano ~

Marco

+2

Eche un vistazo a http://cran.r-project.org/web/views/Spatial.html –

+0

Gracias @ Roman ~ Lo investigaré – Marco

+0

¿podría darnos algún ejemplo de juguete? También es bueno si pudieras decirnos qué objetos/paquete estás usando. Hay múltiples posibilidades para eso. –

Respuesta

7

Si he entendido bien, se puede utilizar el paquete rgeos y herramientas espaciales relacionados en R.

Tomé el truco para almacenar una línea intersecada y luego generar el polígono "diferencia" de este sitio:

http://www.chopshopgeo.com/blog/?p=89

Generar un ráster de ejemplo y un polígono superpuesto.

vdata <- list(x = 1:nrow(volcano), y = 1:ncol(volcano), z = volcano) 

## raw polygon data created using image(vdata); xy <- locator() 

xy <- structure(list(x = c(43.4965355534823, 41.7658494766076, 36.2591210501883, 
25.560334393145, 13.7602020508178, 18.7949251835441, 29.179041644792, 
40.6645037913237, 44.2832110429707, 47.272577903027, 47.5872480988224 
), y = c(30.0641086410103, 34.1278207016757, 37.6989616034726, 
40.900674136118, 32.7732500147872, 27.4781100569505, 22.5523984682652, 
22.7986840476995, 24.5226831037393, 29.3252519027075, 33.8815351222414 
)), .Names = c("x", "y")) 

## close the polygon 
coords <- cbind(xy$x, xy$y) 
coords <- rbind(coords, coords[1,]) 

library(sp) 

## create a Spatial polygons object 
poly <- SpatialPolygons(list(Polygons(list(Polygon(coords, hole = FALSE)), "1"))) 


## create a contour line that cuts the polygon at height 171 
cl <- contourLines(vdata, levels = 171) 

## for ContourLines2SLDF 
library(maptools) 

clines <- ContourLines2SLDF(cl) 

Ahora, se cruzan el polígono con la línea, y luego amortiguar la línea ligeramente y la diferencia de que de nuevo con el polígono para dar un poli multiparte.

library(rgeos) 
lpi <- gIntersection(poly, clines) 

blpi <- gBuffer(lpi, width = 0.000001) 

dpi <- gDifference(poly, blpi) 

Trace los datos originales y las mitades de polígono extraídas manualmente del objeto espacial.

par(mfrow = c(2,1)) 

image(vdata) 
plot(poly, add = TRUE) 

plot(SpatialPolygons(list(Polygons(list([email protected][[1]]@Polygons[[1]]), "1"))), 
    add = TRUE, col = "lightblue") 

image(vdata) 
plot(poly, add = TRUE) 
cl <- contourLines(vdata, levels = 171) 

plot(SpatialPolygons(list(Polygons(list([email protected][[1]]@Polygons[[2]]), "2"))), 
    add = TRUE, col = "lightgreen") 

Eso funciona para este caso bastante simple, podría ser útil para su escenario.

+0

Gracias @ mdsumner ~~ Lo probaré en mi caso- :) – Marco

Cuestiones relacionadas