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

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


使用ogrListLayersogrInfo时,还会显示两个链接表。但是,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 =层, encoding =编码,use_iconv = use_iconv,:
ogrInfo:所有要素均为NULL


因此,看来readOGR只能读取地理要素,是否有任何导入方法将表直接导入R中,还是按此答案首先从ArcGIS中将它们导出为* .dbf(或* .txt)文件的唯一解决方案?

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

评论

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

感谢您的建议...我曾经提到过它,但是从来没有更彻底地研究过它。也许现在是这样做的好时机!

@AlexTereshenkov,如果您想为该解决方案写一个简短的答案,我会接受的,因为这是我一直在寻找的。

看来@AlexTereshenkov提到的R-ArcGIS桥确实具有将表直接读入R的功能。集成需要ArcGIS Desktop> 10.3.1(或ArcGIS Pro)和R> 3.2。 64位R只能与64位背景地理处理一起使用(并且只能从ArcGIS中使用,而不能从R中使用)或ArcGIS Pro。一旦安装了绑定,就可以在R中使用软件包arcgisbbinding。函数arc.open()将作为arc.dataset-class对象打开表。要直接作为数据表打开,请使用功能arc.select。

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

#1 楼

现在可以由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

评论


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

–马蒂富
18年2月15日在22:23

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

– Edzer Pebesma
18年2月16日在12:53

#2 楼

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

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

以下是调查步骤:

 $ 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中可以找到几何形状(位置)。



AIS消息协议。

使用系统调用GDB进行shapefile对话,并使用软件包foreign读取dbf,这是R中的完整解决方法:



$ 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


#3 楼

Esri最近在R和ArcGIS之间发布了一个集成,称为R ArcGIS Tools。它提供了R和ArcGIS之间的集成,从而使得可以互换地访问R工具和ArcGIS资源。通过这种集成,您应该能够访问地理数据库要素类/表。

此处提供了示例R工具,并在此处提供了说明地理处理脚本中R用法的示例工具。

#4 楼

不确定是否可以使用readOGR进行此操作,但请尝试

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


如果不行,请直接尝试ogr2ogr,它可以将非几何图形导出到表中。 (一旦您使进程崩溃,也许可以尝试使用R软件包gdalUtils来运行该软件包。)

评论


不幸的是,readOGR没有读取gdb表的功能。

–亚伦♦
16 Mar 9 '16 at 4:39



现在可能会这样。

–mdsumner
17年7月3日在22:21

截至rgdal 1.2-8,gdal 2.0.1仍未

– gregmacfarlane
17年9月27日在14:37

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

–mdsumner
17年9月27日在21:57

#5 楼

此自定义函数基本上遵循@huckfinn概述的路径,但使用@mdsumner建议的gdalUtils库。

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”安装的二进制文件和说明。

#6 楼

我能够通过Conda安装GDAL并通过以下步骤运行readOGR。
所需程序:
Rstudio(可从此处下载:https://rstudio.com/products/rstudio/download/)
Anaconda3(可从此处下载:https://www.anaconda.com/products/individual)
您将需要安装GDAL才能运行Rstudio函数来打开.gdb文件。安装GDAL的一种方法是通过Conda,我将在这里进行描述:
在Conda中安装GDAL:

在提供的链接中安装Anaconda3。
在Windows中搜索Anaconda Navigator。搜索框。
单击Anaconda Navigator左侧的环境。
创建一个新环境,其左下角带有+按钮。
在环境的顶部栏中,单击在下拉菜单中选择“未安装”。
在“未安装”软件包中搜索gdal。
安装r-gdalutils,r-rgdal,gdal和libgdal。 (我不确定所有这些是否确实必要,我只是安装了名称为gdal的任何东西)。安装可能需要几分钟。

readGDBlayer函数适用于Marine Cadastre上的2014 .gdb文件(示例数据源自此),但无法在2009-2013年打开.gdb文件。我不确定为什么会这样。 readOGR函数能够打开2009年至2013年的.gdb文件。
这里是2009 AIS数据的链接,您可以下载https://coast.noaa.gov/htdata/CMSP/AISDataHandler/2009/ index.html。有谁知道为什么readGDBlayer函数不能使用此数据?

评论


请不要在“答案”中提出问题。

–文斯
20/12/11在1:19