Прочитайте таблицю з geodatabase файлу ESRI (.gdb) за допомогою R


21

Я намагаюся прочитати таблицю безпосередньо з бази даних геоданих ESRI у Р. Приклад файлу даних можна завантажити тут . База даних містить точковий клас функцій (Zone9_2014_01_Broadcast) та дві пов'язані таблиці (Zone9_2014_01_Vessel та Zone9_2014_01_Voyage). Ви можете прочитати файл форми у R за readOGRдопомогою rgeosпакету:

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

Дві пов'язані таблиці також показують, коли ви використовуєте ogrListLayersабо ogrInfo. Однак ogrInfoдає попередження:

Попереджувальне повідомлення: У ogrInfo ("Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel"): ogrInfo: усі функції NULL

І якщо ви спробуєте використовувати readOGRна таблицях, ви отримаєте помилку:

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

Помилка readOGR (dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel"): відсутні функції, крім цього: Попереджувальне повідомлення: In ogrInfo (dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,: ogrInfo: всі функції NULL

Таким чином, виявляється, що readOGR може читати лише географічні особливості. Чи є спосіб імпортувати таблиці безпосередньо в R або є єдиним рішенням спочатку експортувати їх з ArcGIS у вигляді файлів * .dbf (або * .txt), як у цій відповіді?

Крім того, якщо хтось може надіслати дзвінки з R до сценарію python, який автоматизує експорт файлів * csv (бажано) або * .dbf, це було б прийнятною обробкою. Рішення просто має бути масштабованим та автоматизованим.


2
Ви бачили нову інтеграцію R та ArcGIS? r-arcgis.github.io, можливо, щось корисне для вашої роботи.
Олексій Терешенков

Дякую за пропозицію ... Я колись бачив згадку про неї, але ніколи не вивчав її більш ретельно. Можливо, зараз би вдалий час для цього!
Cotton.Rockwood

@ АлексТерешенков, якщо ви хочете написати коротку відповідь на це рішення, я прийму його, оскільки це те, що я шукав.
Cotton.Rockwood

1
Схоже, міст R-ArcGIS, про який згадував @AlexTereshenkov, має функціонал для читання таблиць безпосередньо в R. Інтеграція вимагає ArcGIS Desktop> 10.3.1 (або ArcGIS Pro) і R> 3.2. 64-розрядний R може використовуватися лише при 64-бітній фоновій геообробці (і дозволяє використовувати лише ArcGIS, а не R) або ArcGIS Pro. Після встановлення прив'язки ви можете використовувати пакет arcgisbbindingу R. Функція arc.open()відкриє таблицю як arc.dataset-class object. Щоб відкрити безпосередньо як a data.table, використовуйте функцію arc.select.
Бавовна.Роквуд

добре знати. Я додав відповідь лише для того, щоб закрити тему, але ви все зрозуміли самостійно, тому прийміть, але не підтримуйте: D
Алекс Терешенков

Відповіді:


18

Я трохи запізнююся на вечірку, але це тепер можна прочитати sf, з

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

Він повертає попередження (немає геометричних ознак), але також і файл data.frame з таблицею. Дивіться нитку, яка розпочалася тут: https://stat.ethz.ch/pipermail/r-sig-geo/2018-February/026344.html


чудово! Спасибі Едзер ... рада бачити це та еволюцію sf !!
Бавовна.Роквуд

дивно, я не зміг запустити це на трьох машинах: я отримую помилку, а не попередження?
Матифу

1
вам потрібно буде встановити версію розробника з github, з джерела або зачекати, поки
вийдуть 0.6-1

Краще пізно на вечірку, ніж ніколи! Я прийшов на цю партію ~ 2 роки тому і втілив одне з попередніх рішень. Я просто пішов шукати sfрішення, і Google із задоволенням повернув мене до цієї самої партії із надзвичайно корисним рішенням (тому я із задоволенням додав свою нагороду до цього питання).
Д. Вудс

9

Я використовую GDAL 2.0.2, який "постачається" з підтримкою FDGB і без сторонніх драйверів FGDB для дослідження цих речей. Тестовим середовищем є 64-розрядний Debian Jessie.

Коротше кажучи, здається, що "шар" Zone9_2014_01_Vesselмістить чисті дані атрибутів, а шар Zone9_2014_01_Broadcastмістить дані про позиції. Ви можете використовувати обхід у R через системний виклик та розмову GDB з контейнером форм-файлу (останній скрипт в кінці відповіді).

Ось такі етапи розслідування:

$ 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

Як бачите, поле Geometryвстановлено на None. Ви можете конвертувати дані у файл форми за допомогою ogr2ogrта отримати також лише файл атрибутів dbase:

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

Zone9_2014_01_Vessel.dbf

Геометрії (позиції) можна знайти в шарі 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

Судно та плавання, що не містять даних про положення відповідно до протоколу повідомлень AIS .

Тут повне вирішення в R з використанням системного виклику GDB для формування файлу розмови та пакета foreignдля читання 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 є пряме рішення, але якщо ніхто не відповість з одним, я виберу ваше як відповідь.
Бавовна.Роквуд

3

Не впевнений, чи можете ви це зробити з readOGR, але спробуйте

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

Якщо це не працює, спробуйте ogr2ogrбезпосередньо, який може експортувати негеометрії до таблиці. (Можливо, спробуйте пакет R, gdalUtilsщоб запустити це, як тільки ви опустили процес.)


1
На жаль, readOGRне має можливості читати таблиці gdb.
Аарон

1
Це, мабуть, і зараз.
mdsumner

Ще не станом на rgdal 1.2-8, gdal 2.0.1
gregmacfarlane

Це називається OpenFileGDB в ogrDrivers () $ name, можливо, ви намагаєтеся прочитати растр? Це все ще реалізується, в будь-якому випадку, якщо ви хочете дізнатися, що ви можете опублікувати питання з деталями щодо вашої системи та того, що ви спробували.
mdsumner

3

Нещодавно вийшла інтеграція між R і ArcGIS від Esri, що називається R ArcGIS Tools . Він забезпечує інтеграцію між R та ArcGIS, що дає можливість взаємозамінно отримувати доступ до інструментів R та ресурсів ArcGIS. Ви повинні мати доступ до класів / таблиць функцій geodatabase з цією інтеграцією.

Зразки інструментів R доступні тут, а зразкові інструменти, що ілюструють використання R у сценаріях геообробки, є тут .


1

Ця спеціальна функція в основному відповідає шляху, окресленому @huckfinn, але використовує gdalUtilsбібліотеку, запропоновану @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)
}

Виконайте це так:

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

Якщо ви ще не gdalвстановили, вам потрібно буде встановити його, щоб забезпечити доступ до нього gdalUtils. Ви можете знайти бінарні файли та інструкції щодо встановлення "gdal" тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.