Đọc bảng từ cơ sở dữ liệu địa lý tệp ESRI (.gdb) bằng R


21

Tôi đang cố đọc một bảng trực tiếp từ cơ sở dữ liệu địa lý tệp ESRI vào R. Một tệp dữ liệu mẫu có thể được tải xuống ở đây . Cơ sở dữ liệu chứa một lớp đối tượng điểm (Zone9_2014_01_Broadcast) và hai bảng được liên kết (Zone9_2014_01_V Tàu và Zone9_2014_01_Voyage). Bạn có thể đọc shapefile trong R sử dụng readOGRtừ rgeosgói:

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

Hai bảng được liên kết cũng hiển thị khi bạn sử dụng ogrListLayershoặc ogrInfo. Tuy nhiên, ogrInfođưa ra một cảnh báo:

Thông báo cảnh báo: Trong ogrInfo ("Zone9_2014_01.gdb", layer = "Zone9_2014_01_V Tàu"): ogrInfo: tất cả các tính năng NULL

Và nếu bạn cố gắng sử dụng readOGRtrên các bảng, bạn sẽ gặp lỗi:

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

Lỗi trong readOGR (dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_V Tàu"): không tìm thấy tính năng nào Ngoài ra: Thông báo cảnh báo: Trong ogrInfo (dsn = dsn, layer = layer, mã hóa = mã hóa, sử dụng tất cả các tính năng NULL

Do đó, dường như chỉ có các tính năng địa lý có thể được đọc bởi readOGR. Có cách nào để nhập các bảng trực tiếp vào R hoặc là giải pháp duy nhất để xuất chúng đầu tiên từ ArcGIS dưới dạng tệp * .dbf (hoặc * .txt) như trong câu trả lời này ?

Ngoài ra, nếu bất kỳ ai cũng có thể cung cấp các cuộc gọi từ R đến tập lệnh python tự động hóa việc xuất các tệp * csv (ưu tiên) hoặc * .dbf, thì đó sẽ là một công việc có thể chấp nhận được. Các giải pháp chỉ cần có thể mở rộng và tự động.


2
Bạn đã thấy sự tích hợp mới của R và ArcGIS chưa? r-arcgis.github.io có thể một cái gì đó hữu ích cho công việc của bạn.
Alex Tereshenkov

Cảm ơn về lời đề nghị ... Tôi đã thấy đề cập đến nó tại một thời điểm, nhưng không bao giờ nhìn vào nó kỹ lưỡng hơn. Có lẽ bây giờ sẽ là thời điểm tốt để làm điều đó!
Cotton.Rockwood

@AlexTereshenkov, nếu bạn muốn viết một câu trả lời ngắn cho giải pháp này, tôi sẽ chấp nhận vì đó là điều tôi đang tìm kiếm.
Cotton.Rockwood

1
Có vẻ như cây cầu R-ArcGIS mà @AlexTereshenkov đã đề cập có chức năng đọc các bảng trực tiếp vào R. Việc tích hợp yêu cầu ArcGIS Desktop> 10.3.1 (hoặc ArcGIS Pro) và R> 3.2. Chỉ có thể sử dụng R 64 bit với xử lý địa lý nền 64 bit (và chỉ cho phép sử dụng từ ArcGIS, không phải từ R) hoặc ArcGIS Pro. Khi các liên kết được cài đặt, bạn có thể sử dụng gói arcgisbbindingtrong R. Hàm arc.open()sẽ mở bảng dưới dạng arc.dataset-class object. Để mở trực tiếp như một data.table, sử dụng chức năng arc.select.
Cotton.Rockwood

tốt để biết Tôi đã thêm một câu trả lời chỉ để đóng chuỗi, nhưng bạn đã tự mình tìm ra mọi thứ, vì vậy hãy chấp nhận nhưng đừng phản đối: D
Alex Tereshenkov 14/03/2016

Câu trả lời:


18

Tôi đến bữa tiệc muộn một chút, nhưng giờ đây có thể đọc được sf, với

vessel <- sf::st_read(dsn = "Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel")

Nó trả về một cảnh báo (không có hình dạng đặc trưng hiện diện) mà còn là data.frame với bảng. Xem chủ đề bắt đầu tại đây: https://stat.ethz.ch/pipermail/r-sig-geo/2018-F/2/026344.html


Xuất sắc! Cảm ơn Edzer ... rất vui khi thấy điều này và sự phát triển của sf !!
Cotton.Rockwood

Thật lạ, tôi không thể chạy cái này trên 3 máy: Tôi gặp lỗi chứ không phải cảnh báo?
Matifou

1
bạn sẽ cần cài đặt phiên bản dev từ github, từ nguồn hoặc đợi đến ngày phát hành 0.6-1 vào tháng tới
Edzer Pebesma

Thà muộn bữa tiệc còn hơn không! Tôi đã đến bữa tiệc này ~ 2 năm trước và đã thực hiện một trong những giải pháp trước đó. Tôi vừa mới tìm kiếm một sfgiải pháp và Google vui vẻ đưa tôi trở lại cùng bữa tiệc này với một giải pháp siêu hữu ích (vì vậy tôi vui vẻ thêm phần nâng cao của mình vào câu hỏi này).
D. Rừng

9

Tôi sử dụng GDAL 2.0.2 được "xuất xưởng" với hỗ trợ FDGB và không có bên thứ ba trình điều khiển FGDB để điều tra nội dung đó. Môi trường thử nghiệm là Debian Jessie 64-bit.

Nói tóm lại, có vẻ như "lớp" Zone9_2014_01_Vesselchứa dữ liệu thuộc tính thuần túy và lớp Zone9_2014_01_Broadcastchứa dữ liệu vị trí. Bạn có thể sử dụng một cách giải quyết trong R thông qua một cuộc gọi hệ thống và cuộc hội thoại của GDB với một thùng chứa hình dạng (tập lệnh cuối cùng ở cuối câu trả lời).

Dưới đây là các bước điều tra:

$ 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

Như bạn thấy trường Geometryđược đặt thành None. Bạn có thể chuyển đổi dữ liệu thành tệp hình dạng bằng cách sử dụng ogr2ogrvà chỉ nhận tệp thuộc tính dbase:

$ ogr2ogr -f 'ESRI SHAPEFILE' test Zone9_2014_01.gdb Zone9_2014_01_Vessel
$ ls test

Zone9_2014_01_Vessel.dbf

Hình học (vị trí) có thể được tìm thấy trong lớp 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

Tàu và Voyage không chứa dữ liệu vị trí theo giao thức tin nhắn AIS .

Ở đây, cách giải quyết hoàn chỉnh trong R bằng cách sử dụng lệnh gọi hệ thống để GDB chuyển đổi cuộc hội thoại và gói foreignđể đọc 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

cảm ơn @huckfinn! Đây là một cách giải quyết tốt đẹp. Tôi có khá nhiều tệp (nhiều tệp lớn hơn nhiều so với ví dụ), vì vậy tôi sẽ cung cấp cho nó một shot và xem cách chuyển đổi sang shapefile ảnh hưởng đến thời gian xử lý. Tôi cũng hy vọng, có một giải pháp trực tiếp trong R, nhưng nếu không ai trả lời với ai, tôi sẽ chọn bạn làm câu trả lời.
Cotton.Rockwood

3

Không chắc chắn nếu bạn có thể làm điều này với readOGR nhưng hãy thử

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

Nếu điều đó không hiệu quả, hãy thử ogr2ogrtrực tiếp, có thể xuất phi hình học sang bảng. (Có thể thử gói R gdalUtilsđể chạy nó, khi bạn đã xử lý xong.)


1
Thật không may, readOGRkhông có khả năng đọc các bảng gdb.
Aaron

1
Nó có thể làm, bây giờ.
mdsumner

Vẫn chưa kể từ rgdal 1.2-8, gdal 2.0.1
gregmacfarlane

Nó được gọi là OpenFileGDB trong tên ogrDrivers () $, có lẽ bạn đang cố đọc một raster? Điều đó vẫn đang được triển khai, dù bằng cách nào, nếu bạn muốn tìm hiểu, bạn có thể đăng câu hỏi với chi tiết về hệ thống của bạn và những gì bạn đã thử.
mdsumner

3

Có một sự tích hợp được phát hành gần đây giữa R và ArcGIS từ Esri, được gọi là R ArcGIS Tools . Nó cung cấp tích hợp giữa R và ArcGIS cho phép truy cập lẫn nhau các công cụ R và tài nguyên ArcGIS. Bạn sẽ có thể truy cập các lớp / bảng tính năng cơ sở dữ liệu địa lý với tích hợp này.

Các công cụ mẫu R có sẵn ở đây và các công cụ mẫu minh họa việc sử dụng R trong các tập lệnh xử lý địa lý ở đây .


1

Hàm tùy chỉnh này về cơ bản theo đường dẫn được phác thảo bởi @huckfinn nhưng sử dụng gdalUtilsthư viện được đề xuất bởi @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)
}

Chạy nó như thế này:

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

Nếu bạn chưa gdalcài đặt, bạn sẽ cần cài đặt nó để cung cấp quyền truy cập gdalUtils. Bạn có thể tìm thấy nhị phân và hướng dẫn cài đặt 'gdal' tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.