使用R从ESRI文件地理数据库(.gdb)读取表


21

我试图将一个表直接从ESRI文件地理数据库读取到R中。可以在此处下载示例数据文件。该数据库包含一个点要素类(Zone9_2014_01_Broadcast)和两个链接表(Zone9_2014_01_Vessel和Zone9_2014_01_Voyage)。你可以阅读使用R中的shape文件readOGRrgeos包:

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 =图层,编码=编码,use_iconv = use_iconv ,: ogrInfo:所有功能为NULL

因此,似乎readOGR只能读取地理特征。有什么办法可以将表直接导入到R中,还是像在答案中那样首先从ArcGIS中将它们导出为* .dbf(或* .txt)文件的唯一解决方案?

另外,如果任何人都可以提供从R到python脚本的调用,该脚本可以自动(最好)导出* csv或* .dbf文件,那么这是可以接受的解决方法。该解决方案只需要可扩展和自动化。


2
您是否看到过R和ArcGIS的新集成?r-arcgis.github.io可能对您的工作有用。
Alex Tereshenkov

感谢您的建议...我曾经看过它的一处,但从未深入研究过。也许现在是这样做的好时机!
Cotton.Rockwood '16

@AlexTereshenkov,如果您想为此解决方案写一个简短的答案,我将接受它,因为它是我一直在寻找的。
Cotton.Rockwood '16

1
看来@AlexTereshenkov提到的R-ArcGIS桥确实具有将表直接读入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
Cotton.Rockwood '16

很高兴知道。我添加了一个答案只是为了关闭线程,但是您已经自己弄清了所有内容,因此请接受,但不要
投票

Answers:


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


优秀!谢谢Edzer ...很高兴看到这个以及SF的发展!!
Cotton.Rockwood

奇怪,我无法在3台计算机上运行它:我收到错误消息,而不是警告?
Matifou

1
您需要从源代码安装github上的开发人员版本,或者等到下个月的0.6-1版本发布
Edzer Pebesma

晚会总比没有好!大约2年前,我参加了这个聚会,并实施了以前的一种解决方案。我只是去寻找sf解决方案,而Google则以一种非常有用的解决方案将我带回了同一个聚会(因此我很高兴在这个问题上添加了我的支持)。
D. Woods

9

我使用的是GDAL 2.0.2,它已“附带”了FDGB支持,并且没有第三方FGDB驱动程序来研究这些东西。测试环境是Debian Jessie 64位。

简而言之,似乎“图层” Zone9_2014_01_Vessel包含纯属性数据,而图层Zone9_2014_01_Broadcast包含位置数据。您可以通过系统调用以及GDB与shapefile容器的对话(答案的最后一个脚本)在R中使用变通办法。

这是调查步骤:

$ 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进行shapefile对话,并使用包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!这是一个不错的解决方法。我有很多文件(其中许多文件比示例大得多),因此我将对其进行介绍,并查看转换为shapefile的方式如何影响处理时间。我也希望,R中有直接的解决方案,但是如果没人回答,我会选择您的答案。
Cotton.Rockwood '16

3

不知道您是否可以使用readOGR进行此操作,请尝试

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

如果这不起作用,请ogr2ogr直接尝试,它可以将非几何图形导出到表中。(gdalUtils一旦您确定了流程,也许尝试使用R包来运行它。)


1
不幸的是,readOGR它不具有读取gdb表的功能。
亚伦

1
现在可能会这样。
mdsumner'7

截至rgdal 1.2-8,gdal 2.0.1仍未到
gregmacfarlane

在ogrDrivers()$ name中称为OpenFileGDB,也许您正在尝试读取栅格?无论哪种方式,这种方式仍在实施中,如果您想找出答案,可以提出一个有关系统和尝试过的细节的问题。
mdsumner

3

Esri最近在R和ArcGIS之间发布了一个集成,称为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”安装的二进制文件和说明。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.