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.


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


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

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


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 .


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.