Rを使用してESRIファイルジオデータベース(* .gdb)からテーブルを読み取る


21

ESRIファイルジオデータベースからRに直接テーブルを読み取ろうとしています。サンプルのデータファイルは、ここからダウンロードできます。データベースには、ポイントフィーチャクラス(Zone9_2014_01_Broadcast)と2つのリンクテーブル(Zone9_2014_01_VesselおよびZone9_2014_01_Voyage)が含まれています。パッケージreadOGRからRのシェープファイルを読むことができ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またはを使用すると、2つのリンクテーブルも表示されます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にインポートする方法はありますか、それとも最初に* .dbf(または* .txt)ファイルとしてArcGISからエクスポートする唯一のソリューションですますか?それともこの回答のですか?

さらに、誰かがRから* csv(できれば)または* .dbfファイルのエクスポートを自動化するpythonスクリプトへの呼び出しを提供できる場合、これは許容できる回避策になります。ソリューションは、スケーラブルで自動化されている必要があります。


2
RとArcGISの新しい統合を見ましたか?r-arcgis.github.ioは、作業に役立つかもしれません。
アレックステレシェンコフ

提案をありがとう...私はある時点でそれについて言及していましたが、それ以上徹底的に調べたことはありませんでした。おそらく今はそれを行うのに良い時期でしょう!
コットン。ロックウッド

@AlexTereshenkov、このソリューションの短い答えを書きたい場合、それは私が探していたものであるので受け入れます。
コットン。ロックウッド

1
@AlexTereshenkovが言及したR-ArcGISブリッジは、テーブルをRに直接読み込む機能を持っているように見えます。統合には、ArcGIS Desktop> 10.3.1(またはArcGIS Pro)およびR> 3.2が必要です。64ビットRは、64ビットバックグラウンドジオプロセシングでのみ使用できます(RからではなくArcGISからのみ使用可能)またはArcGIS Pro。バインディングがインストールされると、arcgisbbindingRでパッケージを使用できます。関数arc.open()はテーブルをとして開きますarc.dataset-class object。として直接開くにはdata.table、関数を使用しますarc.select
コットン。ロックウッド

知っておくといい。スレッドを閉じるためだけに答えを追加しましたが、あなたはすべてを自分で考え出したので、受け入れますが、
賛成

回答:


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の進化を見てうれしいです!!
コットン。ロックウッド

奇妙なことに、3台のマシンでこれを実行できませんでした。警告ではなくエラーが表示されますか?
マティフォー

1
githubまたはソースからdevバージョンをインストールするか、来月0.6-1リリースまで待つ必要があります
Edzer Pebesma

パーティーに遅刻することは、決してないよりも良い!私は2年前にこのパーティーに参加し、以前のソリューションの1つを実装しました。私はちょうどsf解決策を探しに行ったところ、Googleは非常に役立つ解決策でこの同じパーティーに喜んで連れ戻しました(したがって、この質問に喜んで賛成票を追加しました)。
D.ウッズ

9

私は、FDGBサポートを備えた「出荷済み」のGDAL 2.0.2を使用し、サードパーティなしでFGDBドライバーを使用して、そのようなことを調査します。テスト環境はDebian Jessie 64ビットです。

つまり、「レイヤー」に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ます。ogr2ogrdbase属性ファイルのみを使用してデータをシェープファイルに変換し、取得することもできます。

$ 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メッセージプロトコルに従って位置データを全く含まない船と航海。

ここでは、GDBのシステムコールを使用して会話をシェーピングし、パッケージでforeigndbfを読み取ることを使用したRの完全な回避策を示します。

# 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直接試してみてください、それは非幾何学をテーブルにエクスポートできます。(gdalUtilsプロセスを停止したら、Rパッケージを試して実行することもできます。)


1
残念ながら、readOGRgdbテーブルを読み取る機能はありません。
アーロン

1
今はおそらくそうでしょう。
mdsumner

まだ、rgdal 1.2から8のように、GDAL 2.0.1
gregmacfarlane

ogrDrivers()$ nameでOpenFileGDBと呼ばれていますが、おそらくラスターを読み取ろうとしていますか?いずれにせよ、それはまだ実装されています。知りたい場合は、システムの詳細と試したことを記載した質問を投稿できます。
mdsumner

3

RとEsriのArcGISの間には、R ArcGIS Toolsと呼ばれる最近リリースされた統合があります。RとArcGISを統合し、RツールとArcGISリソースに互換的にアクセスできるようにします。この統合により、ジオデータベースフィーチャクラス/テーブルにアクセスできるはずです。

サンプルRツールはこちらから入手でき、ジオプロセシングスクリプトでのRの使用法を示すサンプルツールはこちらです。


1

このカスタム関数は、基本的に@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」インストールのバイナリと手順については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.