Odczytaj tabelę z geobazy danych pliku ESRI (.gdb) za pomocą R.

21

Próbuję odczytać tabelę bezpośrednio z geobazy bazy danych pliku ESRI do R. Przykładowy plik danych można pobrać tutaj . Baza danych zawiera punktową klasę obiektów (Zone9_2014_01_Broadcast) i dwie połączone tabele (Zone9_2014_01_Vessel i Zone9_2014_01_Voyage). Możesz odczytać plik kształtu w R, używając readOGRz rgeospakietu:

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")

Dwie połączone tabele pokazują także, kiedy używasz ogrListLayerslub ogrInfo. Jednak ogrInfodaje ostrzeżenie:

Komunikat ostrzegawczy: W ogrInfo („Zone9_2014_01.gdb”, layer = „Zone9_2014_01_Vessel”): ogrInfo: wszystkie funkcje NULL

A jeśli spróbujesz użyć readOGRna stołach, pojawi się błąd:

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

Błąd w readOGR (dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel"): nie znaleziono funkcji Ponadto: komunikat ostrzegawczy: W ogrInfo (dsn = dsn, layer = warstwa, kodowanie = kodowanie, use_iconv = use_iconv,: ogrInfo: wszystkie funkcje NULL

Wydaje się zatem, że readOGR odczytuje tylko cechy geograficzne. Czy istnieje sposób na zaimportowanie tabel bezpośrednio do R lub czy jest to jedyne rozwiązanie, aby je najpierw wyeksportować z ArcGIS jako pliki * .dbf (lub * .txt), jak w tej odpowiedzi?

Jako dodatek, jeśli ktokolwiek może dostarczyć wywołania z R do skryptu Pythona, który automatyzuje eksport plików * csv (najlepiej) lub * .dbf, byłoby to możliwe do obejścia. Rozwiązanie musi być skalowalne i zautomatyzowane.

Cotton.Rockwood
źródło
2
Czy widziałeś nową integrację R i ArcGIS? r-arcgis.github.io może coś przydatnego w twojej pracy.
Alex Tereshenkov,
Dzięki za sugestię ... W pewnym momencie widziałem o tym, ale nigdy nie przyjrzałem się jej dokładniej. Być może teraz będzie dobry moment, aby to zrobić!
Cotton.Rockwood
@AlexTereshenkov, jeśli chcesz napisać krótką odpowiedź na to rozwiązanie, zaakceptuję to, ponieważ tego właśnie szukałem.
Cotton.Rockwood
1
Wygląda na to, że most R-ArcGIS, o którym wspomniał @AlexTereshenkov, ma funkcję odczytu tabel bezpośrednio w R. Integracja wymaga ArcGIS Desktop> 10.3.1 (lub ArcGIS Pro) i R> 3.2. 64-bitowego R można używać tylko z 64-bitowym geoprzetwarzaniem w tle (i pozwala tylko na ArcGIS, a nie R) lub ArcGIS Pro. Po zainstalowaniu powiązań możesz użyć pakietu arcgisbbindingw R. Funkcja arc.open()otworzy tabelę jako arc.dataset-class object. Aby otworzyć bezpośrednio jako data.table, użyj funkcji arc.select.
Cotton.Rockwood 13.03.16
dobrze wiedzieć. Dodałem odpowiedź tylko po to, aby zamknąć wątek, ale sam wszystko wymyśliłeś, więc zaakceptuj, ale nie głosuj za: D
Alex Tereshenkov

Odpowiedzi:

18

Jestem trochę spóźniony na imprezę, ale teraz można to odczytać za sfpomocą

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

Zwraca ostrzeżenie (brak geometrii elementu), ale także ramkę data.frame z tabelą. Zobacz wątek, który zaczął się tutaj: https://stat.ethz.ch/pipermail/r-sig-geo/2018-Febour/026344.html

Edzer Pebesma
źródło
doskonały! Dzięki Edzer ... Cieszę się, że to widzę i ewolucja SF !!
Cotton.Rockwood
dziwne, nie byłem w stanie uruchomić tego na 3 komputerach: pojawia się błąd, a nie ostrzeżenie?
Matifou
1
musisz zainstalować wersję dev z github, ze źródła, lub poczekać na wydanie
0.6-1 w
Lepiej późno na imprezę niż nigdy! Przybyłem na tę imprezę około 2 lata temu i wdrożyłem jedno z poprzednich rozwiązań. Po prostu szukałem sfrozwiązania i Google z radością przywiodło mnie z powrotem na tę samą imprezę z super pomocnym rozwiązaniem (więc z radością dodałem opinię o tym pytaniu).
D. Woods,
9

Używam GDAL 2.0.2, który jest „dostarczany” ze wsparciem FDGB i bez zewnętrznego sterownika FGDB do zbadania tego. Środowisko testowe to Debian Jessie 64-bit.

Krótko mówiąc, wydaje się, że „warstwa” Zone9_2014_01_Vesselzawiera czyste dane atrybutów, a warstwa Zone9_2014_01_Broadcastzawiera dane pozycji. Możesz użyć obejścia w obrębie R za pomocą wywołania systemowego i konwersacji GDB do kontenera plików kształtu (ostatni skrypt na końcu odpowiedzi).

Oto kroki dochodzenia:

$ 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

Jak widzisz, pole Geometryjest ustawione na None. Możesz przekonwertować dane do pliku kształtu za pomocą ogr2ogri uzyskać również tylko plik atrybutu dbase:

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

Zone9_2014_01_Vessel.dbf

Geometrie (pozycje) można znaleźć w warstwie 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

Statek i podróż nie zawierające danych pozycji zgodnie z protokołem komunikatów AIS .

Oto pełne obejście w R przy użyciu wywołania systemowego dla GDB do kształtowania konwersacji i pakietu foreigndo odczytu 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
źródło
dzięki @huckfinn! To miłe obejście. Mam całkiem sporo plików (z których wiele jest znacznie większych niż przykład), więc dam mu szansę i zobaczę, jak konwersja do pliku kształtu wpływa na czas przetwarzania. Mam również nadzieję, że w R istnieje bezpośrednie rozwiązanie, ale jeśli nikt nie odpowie jednym, wybiorę twoje jako odpowiedź.
Cotton.Rockwood
3

Nie jestem pewien, czy możesz to zrobić za pomocą readOGR, ale spróbuj

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

Jeśli to nie zadziała, spróbuj ogr2ogrbezpośrednio, aby wyeksportować nie-geometrie do tabeli. (Może wypróbuj pakiet R, gdalUtilsaby go uruchomić, gdy już zakończysz proces.)

mdsumner
źródło
1
Niestety readOGRnie ma możliwości odczytu tabel gdb.
Aaron
1
Prawdopodobnie teraz.
mdsumner
Nadal nie w wersji rgdal 1.2-8, gdal 2.0.1
gregmacfarlane
Nazywa się OpenFileGDB w nazwie ogrDrivers () $, może próbujesz odczytać raster? To wciąż jest wdrażane, tak czy inaczej, jeśli chcesz dowiedzieć się, że możesz opublikować pytanie ze szczegółami na temat twojego systemu i tego, co próbowałeś.
mdsumner
3

Niedawno wydana została integracja między R i ArcGIS firmy Esri, zwana R ArcGIS Tools . Zapewnia integrację między R i ArcGIS, umożliwiając wymienny dostęp do narzędzi R i zasobów ArcGIS. Dzięki tej integracji powinieneś mieć dostęp do klas obiektów / tabel geobazy.

Przykładowe narzędzia R są dostępne tutaj, a przykładowe narzędzia ilustrujące użycie R w skryptach geoprzetwarzania są tutaj .

Alex Tereshenkov
źródło
1

Ta funkcja niestandardowa zasadniczo podąża ścieżką opisaną przez @huckfinn, ale korzysta z gdalUtilsbiblioteki sugerowanej przez @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)
}

Uruchom tak:

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")

Jeśli jeszcze tego nie masz gdal zrobiłeś, musisz go zainstalować, aby zapewnić dostęp do gdalUtils. Pliki binarne i instrukcje instalacji „gdal” można znaleźć tutaj .

D. Woods
źródło