อ่านตารางจากฐานข้อมูลไฟล์ทางภูมิศาสตร์ (.gdb) โดยใช้ R


21

ฉันพยายามที่จะอ่านตารางโดยตรงจากแฟ้มของ Geodatabase ESRI เข้าไปในอาร์ไฟล์ตัวอย่างเช่นข้อมูลที่สามารถดาวน์โหลดได้ที่นี่ ฐานข้อมูลมีคลาสคุณลักษณะจุด (Zone9_2014_01_Broadcast) และตารางที่เชื่อมโยงสองตาราง (Zone9_2014_01_Vessel และ Zone9_2014_01_Voyage) คุณสามารถอ่าน shapefile ใน R โดยใช้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")

ทั้งสองตารางที่เชื่อมโยงยังแสดงให้เห็นเมื่อคุณใช้หรือ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 = layer, การเข้ารหัส = การเข้ารหัส, use_iconv = use_iconv,: ogrInfo: คุณสมบัติทั้งหมดเป็นโมฆะ

ดังนั้นจึงปรากฏว่าคุณลักษณะทางภูมิศาสตร์เท่านั้นที่สามารถอ่านได้โดย readOGR มีวิธีใดที่จะนำเข้าตารางโดยตรงไปยัง R หรือเป็นทางออกเดียวที่จะส่งออกจาก ArcGIS เป็นไฟล์ * .dbf (หรือ * .txt) เช่นเดียวกับคำตอบนี้หรือไม่?

นอกจากนี้หากใครก็ตามสามารถโทรจาก R ไปยังสคริปต์ python ที่ทำการเอ็กซ์พอร์ตไฟล์ * csv (ดีกว่า) หรือ * .dbf โดยอัตโนมัตินั่นจะเป็นการแก้ไขที่ยอมรับได้ การแก้ปัญหาเพียงแค่ต้องปรับขนาดได้และเป็นแบบอัตโนมัติ


2
คุณเคยเห็นการรวมตัวใหม่ของ R และ ArcGIS หรือไม่? r-arcgis.github.ioอาจเป็นสิ่งที่มีประโยชน์สำหรับงานของคุณ
Alex Tereshenkov

ขอบคุณสำหรับคำแนะนำ ... ฉันเคยเห็นการกล่าวถึงในจุดหนึ่ง แต่ไม่เคยดูมันอย่างละเอียดมากขึ้น บางทีตอนนี้อาจเป็นเวลาที่ดีที่จะทำเช่นนั้น!
ผ้าฝ้ายร็อควูด

@AlexTereshenkov ถ้าคุณต้องการที่จะเขียนคำตอบสั้น ๆ สำหรับการแก้ปัญหานี้ฉันจะยอมรับเพราะมันเป็นสิ่งที่ฉันกำลังมองหา
ผ้าฝ้ายร็อควูด

1
ดูเหมือนว่าสะพาน R-ArcGIS ที่ @AlexTereshenkov ที่กล่าวถึงมีฟังก์ชั่นในการอ่านตารางโดยตรงใน R การรวมเข้าด้วยกันต้องใช้ ArcGIS Desktop> 10.3.1 (หรือ ArcGIS Pro) และ R> 3.2 64- บิต R สามารถใช้ได้เฉพาะกับการประมวลผลพื้นหลัง 64 บิต (และอนุญาตให้ใช้จาก ArcGIS เท่านั้นไม่ใช่จาก R) หรือ ArcGIS Pro เมื่อมีการติดตั้งวงกบประตูคุณสามารถใช้แพคเกจarcgisbbindingในอาร์ฟังก์ชั่นจะเปิดตารางในฐานะที่เป็นarc.open() arc.dataset-class objectเพื่อเปิดโดยตรงเป็นฟังก์ชั่นการใช้งานdata.table arc.select
ผ้าฝ้ายร็อควู้ด

ดีแล้วที่รู้. ฉันได้เพิ่มคำตอบเพียงเพื่อปิดเธรด แต่คุณได้คิดทุกอย่างด้วยตัวเองดังนั้นยอมรับ แต่ไม่ upvote: D
Alex 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-F กุมภาพันธ์/026344.html


! ที่ดีเยี่ยม ขอบคุณ Edzer ... ดีใจที่ได้เห็นสิ่งนี้และวิวัฒนาการของเอสเอฟ !!
Cotton.Rockwood

แปลกฉันไม่สามารถเรียกใช้บนเครื่อง 3 เครื่อง: ฉันได้รับข้อผิดพลาดไม่ใช่คำเตือน?
Matifou

1
คุณจะต้องติดตั้งรุ่น dev จาก github จากแหล่งที่มาหรือรอจนกว่าจะปล่อย 0.6-1 ในเดือนหน้า
Edzer Pebesma

ดีกว่าไปงานเลี้ยงสายกว่าไม่เคย! ฉันมาที่ปาร์ตี้นี้เมื่อ 2 ปีก่อนและมีการดำเนินการตามหนึ่งในวิธีแก้ไขปัญหาก่อนหน้านี้ ฉันเพิ่งไปหาsfวิธีแก้ปัญหาและ Google นำฉันกลับมาอย่างมีความสุขในปาร์ตี้เดียวกันนี้ด้วยโซลูชันที่มีประโยชน์มาก (ฉันจึงเพิ่ม upvote ของฉันลงในคำถามนี้อย่างมีความสุข)
D. Woods

9

ฉันใช้ GDAL 2.0.2 ที่ "ส่งมอบ" พร้อมการสนับสนุน FDGB และไม่มีFGDB ไดรเวอร์ของบุคคลที่สามเพื่อตรวจสอบสิ่งนั้น สภาพแวดล้อมการทดสอบเป็น Debian Jessie 64-bit

ในระยะสั้นดูเหมือนว่า "เลเยอร์" 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สามารถพบได้ในชั้น

$ 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

เรือและการเดินทางที่มีไม่มีข้อมูลที่ตำแหน่งตามที่เอไอเอสข้อความโปรโตคอล

นี่คือวิธีแก้ปัญหาที่สมบูรณ์ใน R โดยใช้การเรียกระบบสำหรับการสนทนา GDB เพื่อกำหนดรูปร่างและแพ็คเกจforeignเพื่ออ่าน dbf's:

# 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โดยตรงซึ่งสามารถส่งออกรูปแบบที่ไม่ใช่รูปทรงไปยังตาราง (อาจลองใช้แพ็กเกจ R gdalUtilsเพื่อเรียกใช้ทันทีที่คุณทำเสร็จแล้ว)


1
น่าเสียดายที่readOGRไม่มีความสามารถในการอ่านตาราง gdb
แอรอน

1
ตอนนี้อาจเป็นไปได้
mdsumner

ยังไม่เป็นของ rgdal 1.2-8, gdal 2.0.1
gregmacfarlane

มันเรียกว่า OpenFileGDB ในชื่อ ogrDrivers () $ บางทีคุณพยายามอ่านแรสเตอร์? ยังคงมีการใช้งานไม่ว่าด้วยวิธีใดหากคุณต้องการทราบว่าคุณสามารถโพสต์คำถามพร้อมรายละเอียดเกี่ยวกับระบบของคุณและสิ่งที่คุณได้ลอง
mdsumner

3

มีการบูรณาการการปล่อยตัวออกมาเมื่อเร็ว ๆ นี้ระหว่าง R และ ArcGIS จาก Esri เรียกว่าเป็นR ArcGIS เครื่องมือ มันมีการบูรณาการระหว่าง R และ ArcGIS ทำให้สามารถเข้าถึงเครื่องมือ R และทรัพยากร ArcGIS คุณควรจะสามารถเข้าถึงคลาส / ตารางคุณลักษณะทางภูมิศาสตร์ฐานข้อมูลด้วยการรวมนี้

เครื่องมือ R ตัวอย่างที่มีอยู่ที่นี่และเครื่องมือที่แสดงตัวอย่างการใช้งาน R ใน Geoprocessing สคริปต์ที่นี่


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' การติดตั้งที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.