web-dev-qa-db-fra.com

Moyen simple de sous-définir SpatialPolygonsDataFrame (c'est-à-dire supprimer des polygones) par attribut dans R

Je voudrais simplement supprimer certains polygones d'un objet SpatialPolygonsDataFrame en fonction des valeurs d'attribut correspondantes dans le cadre de données @data afin que je puisse tracer un fichier de formes simplifié/sous-configuré. Jusqu'à présent, je n'ai pas trouvé le moyen de le faire.

Par exemple, supposons que je souhaite supprimer tous les polygones de ce fichier de formes universel dont l'aire est inférieure à 30000. Comment procéderais-je?

Ou, de la même manière, comment puis-je supprimer l'Antarctique?

require(maptools)

getinfo.shape("TM_WORLD_BORDERS_SIMPL-0.3.shp") 
# Shapefile type: Polygon, (5), # of Shapes: 246
world.map <- readShapeSpatial("TM_WORLD_BORDERS_SIMPL-0.3.shp")

class(world.map)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"

head(world.map@data)
#   FIPS ISO2 ISO3 UN                NAME   AREA  POP2005 REGION SUBREGION     LON     LAT
# 0   AC   AG  ATG 28 Antigua and Barbuda     44    83039     19        29 -61.783  17.078
# 1   AG   DZ  DZA 12             Algeria 238174 32854159      2        15   2.632  28.163
# 2   AJ   AZ  AZE 31          Azerbaijan   8260  8352021    142       145  47.395  40.430
# 3   AL   AL  ALB  8             Albania   2740  3153731    150        39  20.068  41.143
# 4   AM   AM  ARM 51             Armenia   2820  3017661    142       145  44.563  40.534
# 5   AO   AO  AGO 24              Angola 124670 16095214      2        17  17.544 -12.296

Si je fais quelque chose comme ça, l'intrigue ne reflète aucun changement.

world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)

même résultat si je fais ceci:

world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)

Toute aide est appréciée!

63
baha-kev

on dirait que vous écrasez les données, mais ne supprimez pas les polygones. Si vous souhaitez réduire le jeu de données, y compris les données et les polygones, essayez par exemple.

world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)

[[Edit 19 April, 2016]] Cette solution fonctionnait auparavant, mais @ Bonnie indique le contraire pour une version R plus récente (bien que les données aient peut-être également changé?): world.map <- world.map[world.map@data$AREA > 30000, ] Vote positif @ La réponse de Bonnie si cela l’a aidé.

64
tim riffe

Lorsque j'ai essayé de faire cela dans R 3.2.1, la technique de tim riffe ci-dessus ne fonctionnait pas pour moi, bien que sa modification corrigeait légèrement le problème. J'ai constaté que je devais également faire spécifiquement référence au créneau de données avant de spécifier l'attribut à sous-définir, comme ci-dessous:

world.map <- world.map[world.map@data$AREA > 30000, ]
plot(world.map)

Ajouter ceci comme une solution alternative au cas où d'autres rencontreraient le même problème.

36
Bonnie

Juste pour mentionner que subset rend également le travail évitant d'écrire le nom des données dans la condition.

world.map <- subset(world.map, AREA > 30000)
plot(world.map)
12
Erick Chacon

J'ai utilisé la technique ci-dessus pour créer une carte de l'Australie:

australia.map < - world.map[world.map$NAME == "Australia",]
plot(australia.map)

La virgule après "Australie" est importante.

Une des failles de cette méthode est qu’elle semble conserver toutes les colonnes et lignes d’attributs de tous les autres pays et ne les renseigner que de zéros. J'ai constaté que si j'écrivais un fichier .shp, puis le relisais avec readOGR (paquetage rgdal), il supprimait automatiquement les données géographiques nuls. Ensuite, je pourrais écrire un autre fichier de forme avec uniquement les données que je veux.

writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")

Sur mon système, du moins, c'est la fonction "read" qui supprime les données nulles. Je dois donc écrire le fichier après l'avoir relu une fois (et si j'essaie de réutiliser le nom de fichier, j'obtiens une erreur). Je suis sûr qu'il existe un moyen plus simple, mais cela semble fonctionner assez bien pour mes besoins de toute façon.

10
user2676905

En tant que deuxième pointeur: ceci pas fonctionne pour les fichiers de formes avec "trous" dans les formes, car il est paramétré par index.

1
eflores89