Entfernen Sie ein bestimmtes Polygon aus SpatialPolygonDataFrame


9

Ich verwende die R maptools- Bibliothek, um das Shapefile in eine Liste von Polygonen zu analysieren. Die Funktion readShapeSpatial

shp <- readShapeSpatial("<path to my shapefile>")

gibt mir ein SpatailPolygonDataFrame- Objekt. In meinem Beispiel hat mein SpatialPolygonsDataFrame die folgenden Spalten:

> names(shp)
[1] "AREA"       "PERIMETER"  "COMAREA_"   "COMAREA_ID" "AREA_NUMBE"
[6] "COMMUNITY"  "AREA_NUM_1" "SHAPE_AREA" "SHAPE_LEN

Ich weiß, dass ich bestimmte Polygone durch ihre entfernen kann row.id, z

shp.dropI  <- shp[-i, ]
shp.subset <- shp[i %in% c(1,2,3),]

Jetzt möchte ich beispielsweise bestimmte Polygone mit einer Bedingung löschen AREA > 10. Wie setze ich das elegant um? Die einzige Methode, die ich jetzt habe, besteht darin, alle Zeilen zu durchlaufen und entsprechende zu finden row.id.


Seien Sie vorsichtig bei "AREA" -Attributen. Es gibt keine Garantie, dass dies der tatsächliche Bereich ist, oder? Sie können rgeos :: gArea (x, byid = TRUE) verwenden, um es zu berechnen, und rgdal :: spTransform, wenn Sie die Projektion für diese Berechnung ändern müssen.
Mdsumner

@mdsumner du hast vollkommen recht. Guter Punkt
thekingofkings

Antworten:


7

Zunächst würde ich empfehlen, readOGR aus der rgdal-Bibliothek zu verwenden, um Ihr Shapefile zu lesen. Es behält die Projektionsinformationen (proj4string) bei und erspart zahlreiche Kopfschmerzen beim String-Matching mit anderen Funktionen.

Zwei schnelle Möglichkeiten, um das zu erreichen, wonach Sie suchen, sind die Verwendung eines Index oder einer Teilmenge. Dadurch bleiben Polygone mit einer Fläche <10 erhalten (wobei diese> 10 entfernt werden).

shp.sub <- shp[shp$AREA < 10,] 
shp.sub <- subset(shp, AREA < 10)

Nett! Ich habe gerade festgestellt, dass diese Frage verallgemeinert werden kann in "Wie werden bestimmte Zeilen in DataFrame mit R ausgewählt?". Und danke auch für den Vorschlag
thekingofkings
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.