8 votos

¿Cómo intersecar líneas y polígonos en R?

Siguiendo una respuesta acerca de intersectar polígonos con líneas para dividir un polígono en unidades de polígono más pequeñas (en QGIS), quería intentar lo mismo en R. Sin embargo, ¡no puedo encontrar un método que funcione!

over() no tiene un método para polígonos que se intersectan con líneas; encontré gIntersection() de rgeos, pero falla:

require(sp)
require(rgeos)

poly <- readShapePoly("polygon.shp")
lines <- readShapeLines("lines.shp")

chopped <- gIntersection(poly, lines)

Dando como resultado:

Error en RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_intersection") : 
  UnsupportedOperationException: GeometryGraph::add(Geometry *): unknown geometry type: N4geos4geom18GeometryCollectionE

Actualización: Aquí hay un enlace a los archivos en cuestión.

Actualización 2: PaulG señala que funciona y después de actualizar rgeos y R me deshice del error anterior. Gracias PaulG ...

Sin embargo, gIntersection da como resultado un objeto SpatialLines independientemente de si ingreso (poly, lines) o (lines, poly) - mientras que la operación que hice en QGIS (o Arc, en los viejos tiempos) dividirá un polígono con las líneas y dará como resultado un objeto de polígono, no de línea.

Entonces, ¿cómo divido mi polígono con las líneas y obtengo polígonos como resultado?

0 votos

Creo que sería más fácil si pudieras publicar una copia de los archivos de forma en cuestión para que podamos hacer nuestras propias pruebas. Por cierto, ¿está también cargado maptools?

0 votos

He encontrado que rgeos::gIntersection() también es bastante quisquilloso sobre la naturaleza del objeto Spatial* que le pasas. También he resuelto mensajes de error muy crípticos de esta función utilizando el parámetro byid=TRUE. No estoy seguro si esto funcionará en tu caso.

0 votos

@R.K. - sí, maptools también cargado; se ha actualizado con enlace a archivos.

4voto

Giuseppe Maxia Puntos 236

He enfrentado el mismo problema varias veces. Me enfocaré en dos métodos que me funcionan

1) La función intersect del paquete raster. Devuelve un SpatialLinesDataframe que incluye el id de cada polígono.

library(raster)
newLines <- raster::intersect(SpatialLinesDataframe, SpatialPolygonDataframe)

2) Llamando a QGIS desde R con el paquete RQGIS, como se muestra aquí. Creo que este método es más rápido que otros, pero hay que tener cuidado con la versión de QGIS. Aquí está el github del creador. Además, con este paquete se pueden utilizar cualquiera de los geoalgoritmos de QGIS.

library(RQGIS)    
qgis_env <- set_env("PATH")
params <- get_args_man(alg = "qgis:intersection", 
                           qgis_env = qgis_env)
params$INPUT <- line_1
params$INPUT2 <- poly_1
out <- run_qgis(alg = "qgis:intersection",
                params = params,
                load_output = params$OUTPUT,
                qgis_env = qgis_env)

EDIT en 2018: Estaba pensando que puedes intersectar un polígono con otro para obtener polígonos más pequeños: Echa un vistazo a este enlace para el Manual del nuevo paquete sf de R (Pebesma, 2018).

  • Edzer Pebesma (2018). sf: Simple Features for R. Versión del paquete 0.6-3. https://CRAN.R-project.org/package=sf
  • Pebesma, E., 2018. Simple Features for R: Soporte Estandarizado para Datos Vectoriales Espaciales. The R Journal.

3voto

Mohit Jain Puntos 145

Puedes intentar usando RSAGA. No estoy muy familiarizado con ello, pero el comando sería algo así:

rsaga.geoprocessor("libshapes_polygons", "Intersección de Polígono-Línea", list(POLYGONS="polygonshape.shp",LINES="lineshape.shp",INTERSECT="result.shp"))

0 votos

Esto parece que podría ayudar, pero es realmente problemático de instalar (mucha dependencia y descargas); aun así lo intentaré.

0 votos

¿Tienes que hacer la intersección en R? Podrías simplemente hacer la intersección en saga e importar de nuevo después. De todas formas, solo se necesitan 2 descargas para RSAGA: install.packages("RSAGA") y luego saga en sí.

0 votos

Tengo otras opciones para hacer la intersección (QGIS) pero me gustaría poder tener esto disponible en R. Instalar 'saga' en sí mismo es la parte problemática que menciono anteriormente: ¡OSX no tiene una instalación binaria fácil!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X