Ich möchte einfach einige Polygone aus einem SpatialPolygonsDataFrame-Objekt basierend auf entsprechenden Attributwerten im @ data-Datenrahmen löschen, damit ich ein vereinfachtes / untergeordnetes Shapefile zeichnen kann. Bisher habe ich keinen Weg gefunden, dies zu tun.
Angenommen , ich möchte alle Polygone aus diesem Welt-Shapefile löschen , die eine Fläche von weniger als 30000 haben. Wie würde ich vorgehen?
Oder 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(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
Wenn ich so etwas mache, spiegelt die Handlung keine Änderungen wider.
world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)
gleiches Ergebnis, wenn ich das mache:
world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)
Jede Hilfe wird geschätzt!
Als ich dies in R 3.2.1 versuchte, funktionierte die oben beschriebene Technik von tim riffe bei mir nicht, obwohl eine geringfügige Änderung das Problem behebt. Ich stellte fest, dass ich auch speziell auf den Datensteckplatz verweisen musste, bevor ich das Attribut für die Teilmenge wie folgt spezifizierte:
world.map <- world.map[world.map@data$AREA > 30000, ] plot(world.map)
Fügen Sie dies als alternative Antwort hinzu, falls andere auf dasselbe Problem stoßen.
quelle
@data
wenn ich die Daten auf diese Weise unterteile. DasFormal Class SpatialPolygonsDataFrame
wirdFormal Class SpatialPolygons
. Passiert dir das auch?subset
)Nur um zu erwähnen, dass
subset
die Arbeit auch vermeidet, den Namen der Daten in die Bedingung zu schreiben.world.map <- subset(world.map, AREA > 30000) plot(world.map)
quelle
Ich habe die obige Technik verwendet, um eine Karte von nur 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 gefüllt werden. Ich habe festgestellt, dass wenn ich eine .shp-Datei ausschreibe und sie dann mit readOGR (rgdal-Paket) zurücklese, die geografischen Nulldaten automatisch entfernt werden. Dann könnte ich eine andere Formdatei nur mit den gewünschten Daten schreiben.
writeOGR(australia.map,".","australia",driver="ESRI Shapefile") australia.map < - readOGR(".","australia") writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")
Zumindest auf meinem System ist es die "Lese" -Funktion, die die Nulldaten entfernt. Daher muss ich die Datei schreiben, nachdem ich sie einmal zurückgelesen habe (und wenn ich versuche, den Dateinamen wiederzuverwenden, wird eine Fehlermeldung angezeigt). Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber das scheint für meine Zwecke trotzdem gut genug zu funktionieren.
quelle
feature$ATTR <- factor(feature$ATTR)
.Als zweiter Zeiger: Dies funktioniert nicht für Shapefiles mit "Löchern" in den Formen, da es nach Index untergeordnet ist.
quelle