Hapus poligon tertentu dari SpatialPolygonDataFrame

9

Saya menggunakan pustaka R maptools untuk mem-parsing shapefile ke daftar poligon. Fungsi readShapeSpatial

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

memberi saya objek SpatailPolygonDataFrame . Dalam contoh saya, SpatialPolygonsDataFrame saya memiliki kolom berikut:

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

Saya tahu bahwa saya dapat menghapus poligon tertentu dengan mereka row.id, misalnya

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

Sekarang saya ingin menjatuhkan poligon tertentu dengan syarat, katakanlah AREA > 10. Bagaimana saya menerapkan ini dengan elegan? Satu-satunya metode yang saya miliki sekarang adalah beralih ke semua baris dan menemukan yang sesuai row.id.

Raja dari segala raja
sumber
Berhati-hatilah dengan atribut "AREA". Tidak ada jaminan itu area sebenarnya, kan? Anda dapat menggunakan rgeos :: gArea (x, byid = TRUE) untuk menghitungnya, dan rgdal :: spTransformasi jika Anda perlu mengubah proyeksi untuk perhitungan itu.
mdsumner
@ mdsumner Anda sepenuhnya benar. Poin bagus
thekingofkings

Jawaban:

7

Pertama, saya akan sangat menyarankan menggunakan readOGR, dari perpustakaan rgdal, untuk membaca shapefile Anda. Ini akan mempertahankan informasi proyeksi (proj4string) dan menyimpan banyak sakit kepala, ketika pencocokan string, menggunakan fungsi lain.

Dua cara cepat untuk mencapai apa yang Anda cari menggunakan indeks atau menggunakan subset. Ini akan mempertahankan poligon dengan area <10 (menjatuhkan mereka> 10).

shp.sub <- shp[shp$AREA < 10,] 
shp.sub <- subset(shp, AREA < 10)
Jeffrey Evans
sumber
Bagus! Saya baru menyadari pertanyaan ini dapat digeneralisasi menjadi "bagaimana memilih baris tertentu dalam DataFrame dengan R". Dan terima kasih untuk sarannya juga
thekingofkings