Rgeos supprime les valeurs associées lors de l'intersection de polygones

11

J'essaie d'intersecter deux SpatialPolygonsDataFrames et d'obtenir un SpatialPolygonsDataFrame comme résultat. Malheureusement, en utilisant la gIntersectionfonction de rgeos(qui fonctionne de manière impressionnante rapidement pour intersecter les polygones), je n'arrive pas à récupérer les trames de données associées. Prenons l'exemple suivant:

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

Je peux écrire une fonction wrapper qui gère le transfert de data.frames, mais ce sera une douleur mineure de bien vérifier et avant j'espérais que quelqu'un pourrait soit confirmer qu'il n'y a pas de meilleur moyen ou me diriger vers une autre fonction (ou option pour gIntersection) ce qui me permettrait de conserver les associés data.frames.

Mise à jour

Après réflexion, cela peut être un comportement très délibéré de la part de gIntersection. Après tout, des deux SPDF, dont vous transmettez le data.frame? Il se peut donc que je doive écrire un wrapper qui fusionne les deux.

Ari B. Friedman
la source
1
Comment chargez-vous vos polgyons - readShape * ou readOGR? J'obtiens un comportement étrange avec gIntersection en fonction de la bibliothèque que j'ai utilisée pour charger les SPDF, dont je ne suis pas allé au fond.
Simbamangu
@Simbamangu Intéressant. J'utilise readShapePoly et je fusionne ensuite dans un data.frame ....
Ari B. Friedman
gIntersection DEVRAIT donner les data.frames fusionnées pour les zones qui se chevauchent - si je lance Vector | Geoprocessing | Intersect dans QGIS, la sortie est un ensemble d'attributs fusionnés pour le chevauchement, et QGIS n'utilise-t-il pas la même bibliothèque GEOS pour des opérations spatiales comme ce?
Simbamangu du
Si c'est le cas, je suis perplexe. J'ai déjà réécrit mon code pour fusionner les data.frames à la main et les réintégrer, donc je ne vais pas y passer plus de temps pour l'instant. Mais le fait que la lecture de la fonction dans le fichier de formes importe est utile.
Ari B. Friedman
1
Ce n'est clairement pas une réponse, mais je n'ai pas assez de points pour laisser un commentaire ... Ari, je me demandais si vous partageriez votre morceau de code pour extraire les variables suivant les fonctions de superposition des rgeos. J'ai du mal à enrouler ma tête autour d'un bon moyen de conserver les identifiants de polygone d'origine de diverses opérations de rgeos telles que gUnion ...
jed.a.long

Réponses:

2

Pour certains projets, j'avais le même besoin. Bien plus que de conserver le data.frame, nous avons dû mettre en place un code supplémentaire pour gérer le type de géométrie de sortie, et procéder à un nettoyage (par exemple, nettoyer les collections de géométrie), pour disposer d'un géoprocessus d'intersection complet. Dans le cas où vous devez encore effectuer une telle tâche dans R, vous pouvez essayer le package RFigisGeo :

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

#compute intersection
result <- getIntersection(features1, features2)
eblondel
la source
Vos réponses et celles de @ berndv semblent résoudre le problème. Merci! Marquer celui-ci depuis qu'il est arrivé en premier.
Ari B. Friedman
10

Le comportement de gIntersection est de ne transmettre aucune donnée intersectée par conception:

Puisqu'il n'y a pas de correspondance générale entre les objets spatiaux intersectés, toute opération arbitraire sur les attributs nécessite des hypothèses sur les intentions inconnues de l'utilisateur. C'est pourquoi aucun slot de données ne doit être traversé ...

... La conception de gIntesection () est intentionnelle, car seul l'utilisateur peut savoir quoi faire avec les attributs d'entités dont la géométrie a changé. Différents utilisateurs peuvent émettre des hypothèses différentes, mais il n'y a pas de solution générale au-delà du passage des ID des géométries qui se croisent, comme cela se fait dans le mécanisme row.names ().

À ma grande surprise, le package raster a une fonction d' intersection , qui coupe simplement les données et les transmet également.

Le package raster a quelques fonctions qui étendent les rgeos en tentant également de gérer les données d'attribut. Dans ce cas, voir raster :: intersect Et la liste des fonctions ici:? "Raster-package" (section XIV)

Les informations complètes que j'ai obtenues à ce sujet: http://r-sig-geo.2731867.n2.nabble.com/Intended-usage-of-gIntersection-td7587120.html

Bernd V.
la source
0

Pour ceux (comme moi) pour lesquels les réponses ci-dessus n'ont pas fonctionné, le lien ici explique que vous pouvez faire cette chose précise avec l'intersection de raster.

Comment conserver toutes les données d'attribut lors de la découpe de deux polygones dans R?

Je l'ai utilisé pour recadrer un SpatialPointsDataFrame avec un fichier de formes SpatialPolygons; il crée une version recadrée / tronquée de SpatialPointsDataFrame, en conservant les données d'origine.

Leah Bevis
la source