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")
使用
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 =层, encoding =编码,use_iconv = use_iconv,:
ogrInfo:所有要素均为NULL
因此,看来readOGR只能读取地理要素,是否有任何导入方法将表直接导入R中,还是按此答案首先从ArcGIS中将它们导出为* .dbf(或* .txt)文件的唯一解决方案?
此外,如果有人可以提供来自R到可以自动导出* csv(最好是)或* .dbf文件的python脚本,这是可以接受的解决方法。该解决方案只需要可扩展和自动化。
#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
评论
您是否看到过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