Rgeos elimina los valores asociados cuando se cruzan polígonos

11

Estoy tratando de intersectar dos SpatialPolygonsDataFrames y obtener un SpatialPolygonsDataFrame como resultado. Desafortunadamente, al usar la gIntersectionfunción from rgeos(que funciona de manera impresionante rápidamente para intersecar los polígonos), parece que no puedo recuperar los marcos de datos asociados. Considere el siguiente ejemplo:

> fracPoly <- gIntersection( toSingle, fromSingle )
> class(toSingle)
[1] "SpatialPolygonsDataFrame"
> class(fromSingle)
[1] "SpatialPolygonsDataFrame"
> class(fracPoly)
[1] "SpatialPolygons"

Puedo escribir una función de contenedor que maneja la transferencia de data.frames, pero será un pequeño problema hacer la verificación correcta y antes de hacerlo esperaba que alguien pudiera confirmar que no hay una mejor manera o señalarme hacia otra función (u opción for gIntersection) que me permitiría retener el asociado data.frames.

Actualizar

En una reflexión posterior, esto puede ser un comportamiento muy deliberado por parte de gIntersection. Después de todo, de los dos SPDF, ¿qué marco de datos pasan? Por lo tanto, es posible que tenga que escribir un contenedor que combine los dos.

Ari B. Friedman
fuente
1
¿Cómo está cargando sus polígonos - readShape * o readOGR? Obtengo un comportamiento extraño con gIntersection dependiendo de la biblioteca que he usado para cargar SPDF, que no he llegado al fondo.
Simbamangu
@Simbamangu Interesante. Estoy usando readShapePoly y luego fusionándome en un marco de datos ...
Ari B. Friedman
gIntersection DEBE dar los data.frames combinados para las áreas superpuestas: si ejecuto Vector | Geoprocesamiento | Intersecar en QGIS, la salida es un conjunto de atributos combinados para la superposición, y QGIS no usa la misma biblioteca GEOS para operaciones espaciales como ¿esta?
Simbamangu
Bueno, si debería, entonces estoy perplejo. Ya reescribí mi código para fusionar los data.frames a mano y volver a insertarlos, por lo que no voy a pasar más tiempo en esto por ahora. Pero la sugerencia de que la lectura de la función en el archivo shape es útil.
Ari B. Friedman
1
Esto claramente no es una respuesta, pero no tengo suficientes puntos para dejar un comentario ... Ari, me preguntaba si compartirías tu porción de código para extraer las variables siguiendo las funciones de superposición de rgeos. Tengo problemas para envolver la cabeza en torno a una buena manera de retener de varios rgeos las operaciones de la identificación de polígonos originales, como gUnion ...
jed.a.long

Respuestas:

2

Para algún proyecto tenía la misma necesidad. Mucho más que mantener el data.frame, tuvimos que establecer un código adicional para administrar el tipo de geometría de salida, y proceder a una limpieza (por ejemplo, colecciones de geometría limpia), para tener un geoproceso de intersección completo. En caso de que aún necesite hacer tal tarea en R, puede probar el paquete RFigisGeo :

#install RFigisGeo
require(devtools) 
install_github("RFigisGeo", "openfigis")
require(RFigisGeo)

#compute intersection
result <- getIntersection(features1, features2)
eblondel
fuente
Parece que tanto sus respuestas como las de @ berndv resolverían mi problema. ¡Gracias! Marcar este desde que vino primero.
Ari B. Friedman
10

El comportamiento de gIntersection es no pasar ningún dato intersectado por diseño:

Como no hay coincidencias generales entre los objetos espaciales intersectados, cualquier operación arbitraria en los atributos requiere suposiciones sobre intenciones desconocidas del usuario. Es por eso que no se deben pasar ranuras de datos ...

... El diseño de gIntesection () no es intencional, porque solo el usuario puede saber qué hacer con los atributos de las entidades que tienen sus geometrías cambiadas. Diferentes usuarios pueden hacer diferentes suposiciones, pero no hay una solución general más allá de pasar a través de las ID de las geometrías de intersección, como se hace en el mecanismo row.names ().

Para mi sorpresa, el paquete ráster tiene una función de intersección , que simplemente se cruza y entrega los datos también.

El paquete ráster tiene algunas funciones que extienden rgeos al intentar también manejar datos de atributos. En este caso, vea raster :: intersect Y la lista de funciones aquí:? "Raster-package" (sección XIV)

La información completa que obtuve sobre esto: http://r-sig-geo.2731867.n2.nabble.com/Intended-usage-of-gIntersection-td7587120.html

Bernd V.
fuente
0

Para aquellos (como yo) para quienes las respuestas anteriores no funcionaron, el enlace aquí explica que puedes hacer esto con precisión con la intersección de la trama.

¿Cómo retengo todos los datos de atributos al recortar dos polígonos en R?

Utilicé esto para recortar un SpatialPointsDataFrame con un archivo de forma SpatialPolygons; crea una versión recortada / recortada de SpatialPointsDataFrame, manteniendo los datos originales.

Leah Bevis
fuente