Чтение таблицы из файловой базы геоданных ESRI (.gdb) с использованием R

21

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

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"): функции не найдены. Дополнительно: Предупреждение: в ogrInfo (dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,: ogrInfo: все функции NULL

Таким образом, похоже, что readOGR может прочитать только географические объекты. Есть ли способ импортировать таблицы непосредственно в R или это единственный способ сначала экспортировать их из ArcGIS в виде файлов * .dbf (или * .txt), как в этом ответе?

Кроме того, если кто-то может предоставить вызовы из R в скрипт на python, который автоматизирует экспорт файлов * csv (предпочтительно) или * .dbf, это будет приемлемым решением. Решение просто должно быть масштабируемым и автоматизированным.

Cotton.Rockwood
источник
2
Вы видели новую интеграцию R и ArcGIS? r-arcgis.github.io может быть что-то полезное для вашей работы.
Алекс Терешенков
Спасибо за предложение ... Я видел упоминание об этом в один момент, но никогда не изучал его более тщательно. Возможно, сейчас самое время сделать это!
Коттон.Роквуд
@ AlexTereshenkov, если вы хотите написать краткий ответ для этого решения, я приму его, так как это то, что я искал.
Коттон.Роквуд
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. Чтобы открыть напрямую как 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-F февраль/026344.html

Эдзер Пебесма
источник
отлично! Спасибо Эдзер ... рад видеть это и развитие SF!
Cotton.Rockwood
странно, я не смог запустить это на 3 машинах: я получаю сообщение об ошибке, а не предупреждение?
Матифу
1
вам нужно будет установить версию dev из github, из исходного кода или дождаться выпуска
0.6-1 в
Лучше поздно на вечеринку, чем никогда! Я пришел на эту вечеринку ~ 2 года назад и реализовал одно из предыдущих решений. Я просто искал sfрешение, и Google с радостью вернул меня на эту же вечеринку с очень полезным решением (поэтому я с радостью добавил свое возражение к этому вопросу).
Д. Вудс
9

Я использую GDAL 2.0.2, который «поставляется» с поддержкой FDGB и без стороннего драйвера FGDB для исследования этого материала. Средой тестирования является Debian Jessie 64-bit.

Короче говоря, кажется, что «слой» 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
источник
спасибо @huckfinn! Это хороший обходной путь. У меня довольно много файлов (многие из которых намного больше, чем в примере), поэтому я попробую и посмотрю, как преобразование в шейп-файл влияет на время обработки. Я также надеюсь, что в R есть прямое решение, но если никто не ответит одним, я выберу ваше в качестве ответа.
Коттон.Роквуд
3

Не уверен, что вы можете сделать это с помощью readOGR, но попробуйте

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

Если это не сработает, попробуйте ogr2ogrнапрямую, который может экспортировать негеометрии в таблицу. (Возможно, попробуйте пакет R, gdalUtilsчтобы запустить его, как только у вас закончится процесс.)

mdsumner
источник
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. С помощью этой интеграции вы сможете получить доступ к классам / таблицам объектов базы геоданных.

Примеры инструментов 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' здесь .

Д. Вудс
источник