it-swarm.com.de

Einfache Möglichkeit, SpatialPolygonsDataFrame nach Attribut in R zu unterteilen (d. H. Polygone zu löschen)

Ich möchte einfach einige Polygone aus einem SpatialPolygonsDataFrame-Objekt löschen, basierend auf den entsprechenden Attributwerten im @ data-Datenrahmen, damit ich ein vereinfachtes/untergeordnetes Shapefile zeichnen kann. Bisher habe ich keinen Weg gefunden, dies zu tun.

Nehmen wir zum Beispiel an, ich möchte alle Polygone aus diesem Weltformdatei löschen, die eine Fläche von weniger als 30000 haben. Wie würde ich das tun?

Oder, ähnlich, wie kann ich Antartica löschen?

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([email protected])
#   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

Wenn ich so etwas mache, zeigt die Handlung keine Änderungen.

[email protected] = [email protected][[email protected]$AREA > 30000,]
plot(world.map)

das gleiche Ergebnis, wenn ich das tue:

[email protected] = [email protected][[email protected]$NAME != "Antarctica",]
plot(world.map)

Jede Hilfe wird geschätzt!

63
baha-kev

sieht so aus, als würden Sie die Daten überschreiben, aber die Polygone nicht entfernen. Wenn Sie den Datensatz, der sowohl Daten als auch Polygone enthält, reduzieren möchten, versuchen Sie es z.

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

[[Edit 19. April 2016]] Diese Lösung funktionierte früher, aber @Bonnie meldet etwas anderes für eine neuere R-Version (obwohl sich vielleicht auch die Daten geändert haben?): world.map <- world.map[[email protected]$AREA > 30000, ] Upvote @ Bonnies Antwort, wenn das geholfen hat.

64
tim riffe

Als ich dies in R 3.2.1 versuchte, funktionierte die oben beschriebene Technik von tim riffe nicht für mich, obwohl das Problem durch Ändern leicht behoben wurde. Ich stellte fest, dass ich den Datenschlitz ebenfalls speziell referenzieren musste, bevor ich das Attribut für die Teilmenge wie folgt spezifizierte:

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

Dies als alternative Antwort hinzufügen, falls andere auf dasselbe Problem stoßen.

36
Bonnie

Nur um zu erwähnen, dass subset auch die Arbeit vermeidet, den Namen der Daten in die Bedingung zu schreiben.

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

Ich habe die obige Technik verwendet, um eine Karte von Australien zu erstellen:

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

Das Komma nach "Australien" ist wichtig, wie sich herausstellt.

Ein Fehler bei dieser Methode besteht darin, dass anscheinend alle Attributspalten und -zeilen für alle anderen Länder beibehalten und nur mit Nullen aufgefüllt werden. Ich fand heraus, dass, wenn ich eine .shp-Datei ausschrieb und sie dann mit readOGR (rgdal package) zurücklas, die geografischen Nulldaten automatisch entfernt wurden. Dann könnte ich eine andere Formdatei mit nur den Daten schreiben, die ich will.

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

Zumindest auf meinem System werden die Nulldaten durch die Funktion "Lesen" entfernt. Daher muss ich die Datei erst schreiben, nachdem ich sie einmal zurückgelesen habe (und wenn ich versuche, den Dateinamen erneut zu verwenden, erhalte ich eine Fehlermeldung). Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber dieser scheint trotzdem gut genug für meine Zwecke zu funktionieren.

10
user2676905

Als zweiter Zeiger: Dies funktioniert nicht für Shapefiles mit "Löchern" in den Shapes, da es sich um eine Teilmenge nach Index handelt.

1
eflores89