Baca tabel dari file ESRI geodatabase (.gdb) menggunakan R

21

Saya mencoba membaca tabel langsung dari file ESRI geodatabase ke dalam R. Contoh file data dapat diunduh di sini . Basis data berisi kelas fitur titik (Zone9_2014_01_Broadcast) dan dua tabel tertaut (Zone9_2014_01_Vessel dan Zone9_2014_01_Voyage). Anda dapat membaca shapefile di R menggunakan readOGRdari rgeospaket:

library(rgeos)
library(downloader)

download("https://coast.noaa.gov/htdata/CMSP/AISDataHandler/2014/01/Zone9_2014_01.zip", dest="Zone9_2014_01.zip", mode="wb")
unzip("Zone9_2014_01.zip", exdir = ".")

#  Not Run (loads large point file)
#  broadcast <- readOGR(dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Broadcast")

Dua tabel tertaut juga menunjukkan kapan Anda menggunakan ogrListLayersatau ogrInfo. Namun, ogrInfoberi peringatan:

Pesan peringatan: Di ogrInfo ("Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel"): ogrInfo: semua fitur NULL

Dan jika Anda mencoba menggunakan readOGRtabel Anda mendapatkan kesalahan:

vessel <- readOGR(dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel")

Kesalahan pada readOGR (dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel"): tidak ada fitur yang ditemukan Selain itu: Pesan peringatan: Di ogrInfo (dsn = dsn, layer = layer, pengkodean = penyandian, use_iconv = use_iconv,: ogrInfo:: semua fitur NULL

Dengan demikian, tampaknya hanya fitur geografis yang dapat dibaca oleh readOGR. Apakah ada cara untuk mengimpor tabel secara langsung ke R atau merupakan satu-satunya solusi untuk mengekspornya dari ArcGIS sebagai file * .dbf (atau * .txt) seperti dalam jawaban ini ?

Sebagai tambahan, jika ada yang dapat memberikan panggilan dari R ke skrip python yang mengotomatiskan ekspor file * csv (lebih disukai) atau * .dbf, itu akan menjadi solusi yang dapat diterima. Solusinya hanya perlu scalable dan otomatis.

Cotton.Rockwood
sumber
2
Sudahkah Anda melihat integrasi R dan ArcGIS yang baru? r-arcgis.github.io mungkin sesuatu yang berguna untuk pekerjaan Anda.
Alex Tereshenkov
Terima kasih atas sarannya ... Saya pernah melihat menyebutkannya pada satu titik, tetapi tidak pernah memeriksanya lebih mendalam. Mungkin sekarang akan menjadi saat yang tepat untuk melakukan itu!
Cotton.Rockwood
@AlexTereshenkov, jika Anda ingin menulis jawaban singkat untuk solusi ini, saya akan menerimanya karena itu yang saya cari.
Cotton.Rockwood
1
Sepertinya jembatan R-ArcGIS yang disebutkan @AlexTereshenkov memang memiliki fungsi untuk membaca tabel langsung ke R. Integrasi ini membutuhkan ArcGIS Desktop> 10.3.1 (atau ArcGIS Pro) dan R> 3.2. 64-bit R hanya dapat digunakan dengan geoproses latar belakang 64-bit (dan hanya memungkinkan penggunaan dari ArcGIS, bukan dari R) atau ArcGIS Pro. Setelah binding diinstal, Anda dapat menggunakan paket arcgisbbindingdi R. Fungsi ini arc.open()akan membuka tabel sebagai arc.dataset-class object. Untuk membuka langsung sebagai data.table, gunakan fungsi arc.select.
Cotton.Rockwood
senang mendengarnya. Saya telah menambahkan jawaban hanya untuk menutup utas, tetapi Anda telah memikirkan semuanya sendiri, jadi terimalah tetapi jangan
terbalikkan

Jawaban:

18

Saya sedikit terlambat ke pesta, tetapi ini sekarang dapat dibaca sf, dengan

vessel <- sf::st_read(dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel")

Ini mengembalikan peringatan (tidak ada fitur geometri hadir) tetapi juga data.frame dengan tabel. Lihat utas yang dimulai di sini: https://stat.ethz.ch/pipermail/r-sig-geo/2018-February/026344.html

Edzer Pebesma
sumber
luar biasa! Terima kasih Edzer ... senang melihat ini dan evolusi sf !!
Cotton.Rockwood
aneh, saya tidak dapat menjalankan ini pada 3 mesin: saya mendapatkan kesalahan, bukan peringatan?
Matifou
1
Anda harus menginstal versi dev dari github, dari sumber, atau menunggu hingga rilis 0,6-1 bulan depan
Edzer Pebesma
Lebih baik terlambat ke pesta daripada tidak pernah! Saya datang ke pesta ini ~ 2 tahun yang lalu dan memiliki implementasi dari salah satu solusi sebelumnya. Saya hanya pergi mencari sfsolusi dan Google dengan senang hati membawa saya kembali ke pesta yang sama ini dengan solusi yang sangat membantu (jadi saya dengan senang hati menambahkan upvote saya ke pertanyaan ini).
D. Woods
9

Saya menggunakan GDAL 2.0.2 yang "dikirim" dengan dukungan FDGB dan tanpa pihak ketiga driver FGDB untuk menyelidiki hal-hal itu. Lingkungan pengujian adalah Debian Jessie 64-bit.

Singkatnya, tampaknya, bahwa "lapisan" Zone9_2014_01_Vesselberisi data atribut murni dan lapisan itu Zone9_2014_01_Broadcastberisi data posisi. Anda dapat menggunakan solusi dalam R melalui panggilan sistem dan percakapan GDB ke wadah shapefile (skrip terakhir di akhir jawaban).

Berikut langkah-langkah investigasinya:

$ mkdir ~/dev.d/gis-se.d/gdb 
$ cd ~/dev.d/gis-se.d/gdb
$ wget https://coast.noaa.gov/htdata/CMSP/AISDataHandler/2014/01/Zone9_2014_01.zip
$ unzip Zone9_2014_01.zip
$ ogrinfo Zone9_2014_01.gdb Zone9_2014_01_Vessel | head -20
Had to open data source read-only.
INFO: Open of `Zone9_2014_01.gdb'
      using driver `OpenFileGDB' successful.

Layer name: Zone9_2014_01_Vessel
Geometry: None <---------------------------- HERE 
Feature Count: 1282
Layer SRS WKT:
(unknown)
FID Column = OID
MMSI: Integer (0.0)
IMO: Integer (0.0)
CallSign: String (255.0)
Name: String (255.0)
VesselType: Integer (0.0)
Length: Integer (0.0)
Width: Integer (0.0)
DimensionComponents: String (255.0)
OGRFeature(Zone9_2014_01_Vessel):1
  MMSI (Integer) = 367603345

Ketika Anda melihat bidang Geometrydiatur ke None. Anda dapat mengonversi data ke file bentuk menggunakan ogr2ogrdan juga mendapatkan hanya file atribut dbase:

$ ogr2ogr -f 'ESRI SHAPEFILE' test Zone9_2014_01.gdb Zone9_2014_01_Vessel
$ ls test

Zone9_2014_01_Vessel.dbf

Geometri (posisi) dapat ditemukan di lapisan Zone9_2014_01_Broadcast.

$ ogr2ogr -f 'ESRI SHAPEFILE' test Zone9_2014_01.gdb
$ ls test

Zone9_2014_01_Broadcast.dbf  
Zone9_2014_01_Broadcast.shp  
Zone9_2014_01_Broadcast.prj  
Zone9_2014_01_Broadcast.shx  
Zone9_2014_01_Vessel.dbf
Zone9_2014_01_Voyage.dbf

Kapal dan Voyage tidak mengandung data posisi sesuai dengan protokol pesan AIS .

Di sini solusi lengkap dalam R menggunakan panggilan sistem untuk GDB untuk membentuk percakapan dan paket foreignuntuk membaca dbf:

# Load module to get readOGR
require('rgdal');

# Load module to get read.dbf
require('foreign');

# goto the directory with the GDB stuff
setwd('~/dev.d/gis-se.d/gdb')

# Conversation to a shapefile container 
system("ogr2ogr -f 'ESRI SHAPEFILE' test Zone9_2014_01.gdb") 

# read the vessels
vessel <- read.dbf('test/Zone9_2014_01_Vessel.dbf');

# read hte voyage data
voyage <- read.dbf('test/Zone9_2014_01_Voyage.dbf');

# read the geometries in broad cast
broadcast <- readOGR('test/Zone9_2014_01_Broadcast.shp','Zone9_2014_01_Broadcast')

OGR data source with driver: ESRI Shapefile
Source: "test/Zone9_2014_01_Broadcast.shp", layer: "Zone9_2014_01_Broadcast"
with 1639274 features
It has 10 fields

# is vessel OK?    
head(vessel)

MMSI IMO CallSign Name VesselType Length Width   DimensionC
1 367603345  NA     <NA> <NA>         50     20     6     7,13,3,3
2 563000574  NA     <NA> <NA>         70    276    40 188,88,20,20
3 367449580  NA     <NA> <NA>         31     28    10     9,19,5,5
4 367302503  NA     <NA> <NA>         31     20     8     8,12,4,4
5 304003909  NA     <NA> <NA>         71    222    32 174,48,21,11
6 210080027  NA     <NA> <NA>         71    294    32 222,72,22,10

# is voyage OK?
head(voyage)

VoyageID           Destinatio Cargo Draught        ETA  StartTime    EndTime      MMSI
1       12                 KAKE    50      20       <NA> 2014-01-01       <NA> 367603345
2       23             YOKOHAMA    70     125 2014-01-11 2014-01-01 2014-01-30 563000574
3       38         KETCHIKAN AK    31      40 2014-11-12 2014-01-01       <NA> 367449580
4       52 CLARENCE STRAIT LOGS    31      30 2014-09-12 2014-01-01       <NA> 367302503
5       62               JP TYO    71      90 2014-01-13 2014-01-01 2014-01-31 304003909
6       47           VOSTOCHNYY    71     106 2014-01-13 2014-01-01       <NA> 210080027
huckfinn
sumber
terima kasih @huckfinn! Ini adalah solusi yang bagus. Saya memiliki beberapa file (banyak di antaranya jauh lebih besar dari contoh), jadi saya akan mencobanya dan melihat bagaimana konversi ke shapefile memengaruhi waktu pemrosesan. Saya juga berharap, ada solusi langsung di R, tetapi jika tidak ada yang menjawab, saya akan memilih jawaban Anda.
Cotton.Rockwood
3

Tidak yakin apakah Anda dapat melakukan ini dengan readOGR tetapi cobalah

vessel <- readOGR(dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel", dropNULLGeometries = FALSE)

Jika itu tidak berhasil coba ogr2ogrsecara langsung, yang dapat mengekspor non-geometri ke tabel. (Mungkin coba paket R gdalUtilsuntuk menjalankannya, setelah proses Anda selesai.)

mdsumner
sumber
1
Sayangnya, readOGRtidak memiliki kemampuan untuk membaca tabel gdb.
Aaron
1
Mungkin, sekarang.
mdsumner
Masih belum mulai rgdal 1.2-8, gdal 2.0.1
gregmacfarlane
Ini disebut OpenFileGDB di ogrDrivers () $ name, mungkin Anda mencoba membaca raster? Itu masih sedang diterapkan, jika Anda ingin tahu Anda bisa memposting pertanyaan dengan detail tentang sistem Anda dan apa yang telah Anda coba.
mdsumner
3

Ada integrasi yang baru-baru ini dirilis antara R dan ArcGIS dari Esri, yang disebut R ArcGIS Tools . Ini memberikan integrasi antara R dan ArcGIS yang memungkinkan untuk mengakses alat R dan sumber daya ArcGIS secara bergantian. Anda harus dapat mengakses kelas / tabel fitur geodatabase dengan integrasi ini.

Alat sampel R tersedia di sini dan alat sampel yang menggambarkan penggunaan R dalam skrip geoproses ada di sini .

Alex Tereshenkov
sumber
1

Fungsi kustom ini pada dasarnya mengikuti jalur yang diuraikan oleh @huckfinn tetapi menggunakan gdalUtilspustaka yang disarankan oleh @mdsumner.

read_GDB_Layer <- function(dsn, layerName, overwrite = T) {
   conversionDir <- tempdir()

   gdalUtils::ogr2ogr(src_datasource_name = dsn, 
                      dst_datasource_name = conversionDir, 
                      f = "ESRI Shapefile", layer = layerName, 
                      verbose = T, overwrite = overwrite)

   df <- foreign::read.dbf(file.path(conversionDir, paste0(layerName, ".dbf")))

   return(df)
}

Jalankan seperti ini:

vsl <- read_GDB_Layer(dsn = "Zone9_2014_01.gdb", layerName = "Zone9_2014_01_Vessel")
vyg <- read_GDB_Layer(dsn = "Zone9_2014_01.gdb", layerName = "Zone9_2014_01_Voyage")

Jika Anda belum gdalmenginstal, Anda harus menginstalnya untuk memberikan akses gdalUtils. Anda dapat menemukan binari dan instruksi untuk pemasangan 'gdal' di sini .

D. Woods
sumber