J'ai deux polygones. L'un contient des champs (X, Y, Z) et l'autre contient des types de sols (A, B, C, D). Je veux savoir quelle zone de chaque champ contient quel type de sol. J'ai essayé ce qui suit:
library(rgdal)
library(rgeos)
Field<-readOGR("./","Field")
Soil<-readOGR("./","Soil")
Results<-gIntersects(Soil,Field,byid=TRUE)
rownames(Results)<-Field@data$FieldName
colnames(Results)<-Soil@data$SoilType
> Results
A B C D
Z TRUE FALSE FALSE FALSE
Y FALSE TRUE TRUE FALSE
X TRUE TRUE TRUE TRUE
et obtenu de bons résultats en me disant quel champ contient quel type de sol. Cependant, comment puis-je obtenir la zone à la place?
Réponses:
Cette méthode utilise la
intersect()
fonction duraster
package. Les exemples de données que j'ai utilisés ne sont pas idéaux (d'une part, ils sont en coordonnées non projetées), mais je pense que cela donne une idée.Résultats:
la source
raster::intersect
plusrgeos::gIntersection
parce que le premier joint les données d'attribut des deuxSpatialPolgonsDataFrame
objets, tandis que le second semble supprimer les données d'attribut.gIntersection
; cependant, les ID d'entité en entrée ne sont pas directement fournis, ils sont concaténés et stockés dans l'ID d'entité de la sortie. Cela signifie les étapes supplémentaires consistant à analyser les ID, puis à joindre les attributs. Je souhaiteraster::intersect
inclure ces ID d'entrée comme attributs supplémentaires dans la sortie.Voici une autre approche utilisant le nouveau
sf
package, qui est destiné à remplacersp
. Tout est beaucoup plus propre et compatible avec les tuyaux:la source