Membuka shapefile di R? [Tutup]

64

Saya perlu membuka shapefile dari ArcMap di R untuk menggunakannya untuk analisis geostatistik lebih lanjut. Saya sudah mengonversinya menjadi file teks ASCII, tetapi di R itu dikenali sebagai data.frame. Fungsi koordinat tidak berfungsi segera setelah x dan y dikenali sebagai non-numerik.

Bisakah Anda membantu mengatasinya?

slava
sumber
1
Shapefile macam apa? Saya mengasumsikan poin karena memiliki kolom X dan Y?
Simbamangu

Jawaban:

54

Gunakan shapefile secara langsung. Anda dapat melakukan ini dengan mudah dengan rgdalatau sfpaket, dan membaca bentuk di suatu objek. Untuk kedua paket, Anda perlu menyediakan dsn- sumber data, yang dalam hal shapefile adalah direktori , dan layer- yang merupakan nama shapefile, minus ekstensi:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(Untuk rgdal, di OSX atau Linux Anda tidak dapat menggunakan steno '~' untuk direktori home sebagai sumber data ( dsn) direktori - jika tidak Anda akan mendapatkan pesan "Tidak dapat membuka sumber data" yang tidak membantu. sfPaket tidak memiliki batasan ini, di antara beberapa kelebihan lainnya.)

Ini akan memberi Anda objek yang merupakan Spasial * DataFrame (titik, garis, atau poligon) - bidang tabel atribut kemudian dapat diakses oleh Anda dengan cara yang sama seperti kerangka data biasa, yaitu shape$IDuntuk kolom ID.

Jika Anda ingin menggunakan file ASCII yang Anda impor, maka Anda cukup mengonversi bidang teks (karakter) x dan y ke angka, misalnya:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

Sunting 2015-01-18 : perhatikan bahwa rgdal sedikit lebih baik daripada maptools (yang awalnya saya sarankan di sini), terutama karena rgdal membaca dan menulis informasi proyeksi secara otomatis.

Catatan:

  • as.numeric(as.character())fungsi bersarang - jika teks ASCII Anda dibaca sebagai faktor (kemungkinan), ini memastikan bahwa Anda mendapatkan nilai numerik alih-alih tingkat faktor.
  • rgdaldan sfmemiliki cara yang membingungkan untuk mengakses berbagai jenis file dan basis data (misalnya untuk file GPX, dsn adalah nama file, dan melapisi komponen individu seperti titik arah, titik trek, dll.), dan diperlukan pembacaan yang cermat atas contoh online.
Simbamangu
sumber
R harus menguraikan bidang angka jadi, saya akan membayangkan bahwa ada tipe karakter khusus di x dan y. Selain itu, saat impor, kecuali ditentukan secara berbeda, bidang karakter akan dipaksa menjadi faktor. Dengan demikian, deselerasi "as.numeric" yang sederhana tidak akan berfungsi. Saya juga akan menggunakan "readORG" di "rgdal" daripada maptools.
Jeffrey Evans
@ Jeffrey, readOGR jelas merupakan cara yang lebih baik - lihat beberapa diskusi tentang pertanyaan R selanjutnya di gis.SE. Poin bagus tentang faktor pemaksaan; akan memperbarui dengan bersarang as.characteruntuk menyelesaikan masalah.
Simbamangu
Anda dapat menggunakan ~, tetapi Anda harus memanggil path.expand pada direktori, mis. ReadOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1
3
Entah bagaimana saya masih membutuhkan klarifikasi ini jawaban yang benar-benar benar: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos
Saya ingin mencatat bahwa dsnargumen tidak boleh mengandung garis miring --- misalnya dsn = "C:/Users/Downloads/"seharusnya dsn = "C:/Users/Downloads". Semoga ini memecahkan frustrasi seseorang ...
Kim
21

Saya setuju dengan Simbamangu dan gissolved dalam hal mempertahankan shapefile tetapi ingin mengarahkan perhatian Anda secara khusus ke perpustakaan rgdal. Ikuti tautan yang disarankan oleh Gissolved untuk NCEAS dan ikuti petunjuk untuk rgdal. Mungkin sulit untuk memasang pada beberapa mesin tetapi secara substansial dapat meningkatkan hasil dalam hal proyeksi.

Pustaka maptools sangat bagus dan memungkinkan Anda untuk menentukan proyeksi untuk shapefile yang Anda baca, tetapi untuk melakukannya Anda perlu tahu bagaimana menentukan proyeksi itu dalam format proj4. contoh mungkin terlihat seperti:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

Jika Anda ingin pergi rute ini, maka saya sarankan http://spatialreference.org sebagai tempat untuk mencari tahu seperti apa proyeksi Anda dalam format proj4. Jika itu terlihat merepotkan Anda, rgdal akan membuatnya mudah dengan membaca file .prj ESRI shapefile (file yang berisi definisi proyeksi ESRI untuk shapefile. Untuk menggunakan rgdal pada file yang sama, Anda cukup menulis:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

Anda mungkin dapat berseluncur dengan tanpa melakukan ini jika Anda hanya bekerja dengan satu shapefile, tetapi segera setelah Anda mulai melihat beberapa sumber data atau overlay dengan Google Maps, menjaga proyeksi Anda dalam kondisi yang baik menjadi penting.

Untuk beberapa penelusuran bermanfaat pada data spasial di R, termasuk banyak hal tentang mengimpor dan bekerja dengan pola titik, saya memiliki beberapa materi kursus lama daring di https://csde.washington.edu/workshop/point-patterns-and-raster -surfaces / (lebih banyak lokakarya dapat ditemukan di sini ) yang dapat membantu Anda melihat bagaimana metode ini dibandingkan dalam praktik.

csfowler
sumber
+1 untuk informasi rujukan spasial ... terutama untuk menekankan menjaga agar proyeksi diselesaikan!
Simbamangu
@csfowler, saya mencoba menggunakan readOGR tetapi tidak mengimpor file .prj. Ada yang tahu kenapa? Saya di UW juga, di departemen biologi.
Herman Toothrot
@ user4050, sulit diketahui tanpa melihat kode Anda. Saya berasumsi ada file .prj di direktori yang sama? dan bahwa Anda menggunakan nilai encoding = "ESRI Shapefile" untuk memastikan rgdal tahu itu adalah shapefile?
csfowler
17

Saya pikir Anda tidak boleh mengkonversi shapefile ke ASCII tetapi sebaliknya gunakan shapefile secara langsung dengan salah satu ekstensi spasial. Di sini Anda dapat menemukan tiga cara untuk membaca (dan menulis) http://www.nceas.ucsb.edu shapefile/scicomp/usecases/ReadWriteESRIShapeFiles . Proyek R-spatial mungkin juga menarik bagi Anda http://cran.r-project.org/web/packages/sp/index.html .

Samuel
sumber
17

Anda dapat menggunakan sfperpustakaan untuk membuka Shapefile secara langsung di R. Ini lebih cepat daripada rgdalperpustakaan, periksa di sini: Fitur Sederhana untuk R - Tolok Ukur . Untuk informasi lebih lanjut tentang sfpaket, periksa homepage proyek r-spasial .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')
Guzmán
sumber
11

Solusi mudah pada 2017 adalah shapefile()fungsi di rasterperpustakaan.

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

UPDATE: Ini masih merupakan opsi yang baik di 2019.

Christopher
sumber
Apakah ini dapat digunakan untuk mengimpor dari sumber online? I
I Del Toro
@ IDToro Tidak secara langsung. Anda harus mengunduhnya ke hard drive Anda terlebih dahulu dan kemudian memuatnya dari sana.
Christopher
6

Satu lagi alternatif adalah menggunakan pustaka fastshp yang menawarkan ::

Rutinitas untuk menangani shapefile ESRI besar (.shp). Ini termasuk membaca, penipisan titik dan pencocokan titik dengan bentuk yang berisi. Tujuan utama paket ini adalah memberikan kecepatan untuk mendukung shapefile besar (jutaan poin). Ini adalah beberapa pesanan maginute lebih cepat daripada beberapa paket shapefile lainnya.

Inilah pertanyaan saya tentang SE tentang cara menggunakannya dengan ggplot2:

Bagaimana saya bisa memformat shapefile yang dimuat melalui fastshp di ggplot2?

Radek
sumber
1
Saya merasa sedikit mengganggu bahwa fungsi read.shp tidak menghasilkan objek sp. Mengingat bahwa komunitas spasial R menyatu dalam hal ini sebagai standar de facto untuk menangani objek spasial, saya menemukan ini agak ceroboh. Mengingat RAM yang cukup dan OS 64bit, membaca data besar tidak banyak masalah. Dengan RAM 8GB saya telah membaca poin 30M dan poligon 2,5M menggunakan rgdal tanpa masalah. Berikut ini beberapa arahan dalam menggunakan objek sp dengan ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans