R을 사용하여 ESRI 파일 지오 데이터베이스 (.gdb)에서 테이블 읽기


21

ESRI 파일 지오 데이터베이스에서 R로 직접 테이블을 읽으려고합니다. 예제 데이터 파일은 여기에서 다운로드 할 수 있습니다 . 데이터베이스에는 포인트 피처 클래스 (Zone9_2014_01_Broadcast)와 두 개의 연결된 테이블 (Zone9_2014_01_Vessel 및 Zone9_2014_01_Voyage)이 있습니다. 다음을 사용하여 R에서 Shape 파일 읽을 수 readOGR로부터 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")

두 개의 연결된 테이블은 사용할 때 표시 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", 레이어 = "Zone9_2014_01_Vessel") : 기능을 찾을 수 없음 : 경고 메시지 : ogrInfo (dsn = dsn, 레이어 = 레이어, 인코딩 = 인코딩, use_iconv = use_iconv, : ogrInfo : 모든 기능은 NULL

따라서 readOGR은 지리적 기능 만 읽을 수있는 것으로 보입니다. 테이블을 R로 직접 가져 오는 방법 있습니까? 아니면 답변 에서와 같이 ArcGIS에서 * .dbf (또는 * .txt) 파일로 먼저 내보내는 유일한 솔루션 입니까?

또한, 누군가가 * csv (바람직하게) 또는 * .dbf 파일 내보내기를 자동화하는 Python 스크립트로 R에서 호출을 제공 할 수 있다면 이는 해결 가능한 방법입니다. 솔루션은 확장 가능하고 자동화되어야합니다.


2
R과 ArcGIS의 새로운 통합을 보셨습니까? r-arcgis.github.io는 아마도 귀하의 작업에 유용한 것입니다.
Alex Tereshenkov

제안에 감사드립니다 ... 한 시점에서 언급을 보았지만 더 철저하게 조사하지는 않았습니다. 아마도 지금은 그렇게하기에 좋은 시간이 될 것입니다!
Cotton.Rockwood

@ AlexTereshenkov,이 솔루션에 대한 짧은 답변을 작성하려면 내가 찾고있는 것이므로 받아 들일 것입니다.
Cotton.Rockwood

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.tablefunction을 사용하십시오 arc.select.
Cotton.Rockwood

알아 둘만 한. 난 그냥 스레드를 닫 대답을 추가했습니다,하지만 당신은 그렇게 받아, 자신에 알아 낸 모든 것을 가지고 있지만 upvote에 할 : D
알렉스 Tereshenkov

답변:


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의에서 DEV 버전을 설치하거나 0.6-1 출시 다음 달까지 기다려야합니다
Edzer Pebesma

결코 파티보다 늦는 것이 낫습니다! ~ 2 년 전이 파티에 와서 이전 솔루션 중 하나를 구현했습니다. 방금 sf해결책을 찾았고 Google은 매우 도움이되는 해결책 으로이 같은 사람에게 행복하게 돌아 왔습니다 (따라서이 질문에 행복하게 의견을 추가했습니다).
D. 우즈

9

FDGB를 지원하고 타사에 FGDB 드라이버 가 없는 상태로 "배송 된"GDAL 2.0.2를 사용 하여 해당 내용을 조사합니다. 테스트 환경은 Debian Jessie 64 비트입니다.

요컨대, "계층" Zone9_2014_01_Vessel은 순수한 속성 데이터를 Zone9_2014_01_Broadcast포함 하고 계층 은 위치 데이터를 포함 하는 것으로 보인다 . 시스템 호출과 GDB와 쉐이프 파일 컨테이너 (대응 끝에 마지막 스크립트)와의 대화를 통해 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있습니다. 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가 파일 대화를 쉐이핑하고 패키지 foreign가 dbf를 읽는 시스템 호출을 사용하는 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에 직접적인 해결책이 있기를 희망하지만, 아무도 대답하지 않으면 대답으로 당신을 선택할 것입니다.
Cotton.Rockwood

3

readOGR 로이 작업을 수행 할 수 있는지 확실하지 않지만 시도하십시오.

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

그래도 작동하지 않으면 ogr2ogr비 기하학을 테이블로 내보낼 수 있습니다. ( gdalUtils프로세스가 다운되면 R 패키지 를 실행하여 시도 하십시오.)


1
불행히도 readOGRgdb 테이블을 읽을 수있는 기능이 없습니다.
Aaron

1
아마 지금 할 것입니다.
mdsumner

여전히 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에 의해 요약 된 경로를 따르지만 @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.