Convertir un objet polygonal spatial en bloc de données à l'aide de R

18

Mon objectif est de modifier un fichier de formes existant en fusionnant certains polygones.

Après avoir importé le fichier de formes et utilisé la commande UnionSpatialPolygons, j'obtiens le contour de polygone souhaité.

Cependant, il s'agit maintenant d'un objet SpatialPolygons et non d'un SpatialPolygonsDataFrame, donc je ne peux pas l'exporter vers un fichier de formes à l'aide de writeOGR.

Comment contourner ce problème?

John
la source
3
Si la réponse ci-dessous était utile, vous devez la sélectionner comme étant la bonne en cliquant sur la coche à gauche du texte de la réponse.
SlowLearner

Réponses:

20

Comme son nom l'indique, un SpatialPolygonsDataFrame est fondamentalement juste un objet SpatialPolygons avec des données attachées (la table attributaire). Les données doivent avoir au moins autant de lignes qu'il y a de fonctionnalités

library(rgdal)
ob <- SpatialPolygons(..)# Your SpatialPolygons Object
spp <-     SpatialPolygonsDataFrame(ob,data=as.data.frame("yourData"),proj4string=CRS("+proj=    aea > +ellps=GRS80 +datum=WGS84"))
writeOGR(spp,"shapes","testShape",driver="ESRI Shapefile",)

----ÉDITER----

Si vous souhaitez convertir votre SpatialPolygonsDataFramedos en SpatialPolygonsobjet, il vous suffit d'adresser la structure de l'objet dans R

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)
Courlis
la source
Pour sûr, @Curlew a raison. Assurez-vous de spécifier l' IDsargument correctement lors de l'exécution UnionSpatialPolygons. Sinon, vous risquez de rencontrer des problèmes datalors de la conversion en SpatialPolygonsDataFrame.
fdetsch
1
Bien sûr, assez facile. J'ai édité la réponse originale pour cela
Curlew
1
J'ai récemment commencé à travailler avec des fichiers de formes et j'essaie toujours de me familiariser avec cela. Quelle est la valeur exacte à remplacer pour vous data=as.data.frame("yourData")? Après avoir dissous les polygones internes à l'aide unionSpatialPolygons(...), j'aimerais écrire le résultat sous forme de nouveau fichier de formes
lightonphiri
Vous devez avoir un data.frame avec le même nombre de lignes que vous avez de fonctionnalités dans votre objet SpatialPolygons. Mieux vaut poser une nouvelle question concernant votre unionproblème ..
Courlis
1
@Curlew Merci, vient de poster de nouvelles questions ici gis.stackexchange.com/q/121405/40108
lightonphiri
9

Problèmes:

1: le résultat de UnionSpatialPolygons est un polygone spatial

2: reconvertir le résultat en une trame de données de polygone spatial est une vraie douleur

-une. vous avez besoin d'un bloc de données très précis à attacher à un polygone spatial

-b. les données que vous avez utilisées pour UnionSpatialPolygons ont plus de lignes que la sortie et ne sont pas formatées de la manière requise.

Ma (moche) solution:

### Coerce into spatial polygon data frame with id and row name of spatial polygon

# Make a data frame that meets the requirements above:

df<- data.frame(id = getSpPPolygonsIDSlots(your.spatialpolygon))
row.names(df) <- getSpPPolygonsIDSlots(your.spatialpolygon)

# Make spatial polygon data frame
spdf <- SpatialPolygonsDataFrame(your.spatialpolygon, data =df)

# Then don't forget to make sure the projection is correct
# XXXX is your SRID

proj4string(spdf) <- CRS("+init=epsg:XXXX");
spdf <- spTransform(spdf , CRS("+init=epsg:XXXX"));
K.
la source
Erreur dans if (length (Sr @ polygons)! = Nrow (data)) stop (paste ("Object length mismatch: \ n",: argument is of length zero En outre: Messages d'avertissement: 1: utilisez * apply et slot directement
Mox