R kullanarak ESRI dosya coğrafi veritabanından (.gdb) bir tablo okuma


21

Ben indirilebilir R. Bir örnek veri dosyası içine bir ESRI dosya coğrafi veritabanından doğrudan bir tablo okumaya çalışıyorum burada . Veritabanı bir nokta özellik sınıfı (Zone9_2014_01_Broadcast) ve iki bağlantılı tablo (Zone9_2014_01_Vessel ve Zone9_2014_01_Voyage) içerir. R'deki şekil readOGRdosyasını rgeospaketten kullanarak okuyabilirsiniz :

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

Bağlantılı iki tablo da ogrListLayersveya kullandığınızda gösterilir ogrInfo. Ancak, ogrInfobir uyarı verir:

Uyarı mesajı: ogrInfo'da ("Zone9_2014_01.gdb", layer = "Zone9_2014_01_Vessel"): ogrInfo: tüm özellikler NULL

Ve readOGRtablolarda kullanmaya çalışırsanız bir hata alırsınız:

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

ReadOGR hatası (dsn = "Zone9_2014_01.gdb", katman = "Zone9_2014_01_Vessel"): özellik bulunamadı Ek olarak: Uyarı iletisi: ogrInfo (dsn = dsn, katman = katman, kodlama = kodlama, use_iconv = use_iconv,: ogrInfo: tüm özellikler NULL

Böylece, sadece coğrafi özelliklerin readOGR tarafından okunabileceği görülmektedir. Tabloları doğrudan R'ye aktarmanın herhangi bir yolu var mı veya ArcGIS'ten önce bu yanıtta olduğu gibi * .dbf (veya * .txt) dosyaları olarak dışa aktarmak için tek çözüm var mı?

Ek olarak, herhangi biri R'den * csv (tercihen) veya * .dbf dosyalarının dışa aktarılmasını otomatikleştiren bir python betiğine çağrı sağlayabilirse, bu kabul edilebilir bir çözümdür. Çözümün sadece ölçeklenebilir ve otomatik olması gerekir.


2
R ve ArcGIS'in yeni entegrasyonunu gördünüz mü? r-arcgis.github.io belki işiniz için yararlı bir şey.
Alex Tereshenkov

Öneri için teşekkürler ... Bir noktada bundan bahsetmiştim, ama asla daha ayrıntılı bir şekilde bakmadım. Belki şimdi bunu yapmak için iyi bir zaman olurdu!
Cotton.Rockwood

@AlexTereshenkov, bu çözüm için kısa bir cevap yazmak istiyorsanız, aradığım şey olduğu için kabul edeceğim.
Cotton.Rockwood

1
Bahsedilen @AlexTereshenkov'un tabloları doğrudan R'ye okuma işlevine sahip olduğu R-ArcGIS köprüsüne benziyor Entegrasyon ArcGIS Desktop> 10.3.1 (veya ArcGIS Pro) ve R> 3.2 gerektirir. 64 bit R yalnızca 64 bit arka plan coğrafi işlemesi ile kullanılabilir (ve yalnızca ArcGIS tarafından kullanılmasına izin verir, R'den değil) veya ArcGIS Pro. Bağlamalar kurulduktan sonra, paketi arcgisbbindingR dilinde kullanabilirsiniz . İşlev arc.open()tabloyu bir arc.dataset-class object. Doğrudan a olarak açmak data.tableiçin işlevi kullanın arc.select.
Cotton.Rockwood

bunu bildiğim iyi oldu. Sadece konuyu kapatmak için bir cevap ekledim, ancak her şeyi kendi başınıza çözdünüz, bu yüzden kabul edin, ancak oy kullanmayın: D
Alex Tereshenkov

Yanıtlar:


18

Biraz partisine geç bit değilim, ama bu artık tarafından okunabilir sfile,

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

Bir uyarı (özellik geometrisi yok) değil, aynı zamanda tablo içeren bir data.frame döndürür. Buradan başlayan konuya bakın: https://stat.ethz.ch/pipermail/r-sig-geo/2018-Şubat/026344.html


mükemmel! Teşekkür Edzer ... Bunu ve SF evrimi görmek için sevindim !!
Cotton.Rockwood

garip, bunu 3 makinede çalıştıramadım: Bir hata alıyorum, uyarı değil mi?
Matifou

1
dev sürümünü github'dan, kaynaktan yüklemeniz veya gelecek ay 0.6-1 sürümüne kadar beklemeniz gerekir
Edzer Pebesma

Partiye geç kalmak hiç olmadığı kadar iyi! Bu partiye ~ 2 yıl önce geldim ve önceki çözümlerden birini uyguladım. Ben sadece bir sfçözüm aramaya gittim ve Google beni çok yardımcı bir çözümle aynı partiye geri getirdi (bu yüzden mutlu bir şekilde bu soruya oyumu ekledim).
D. Woods

9

Ben FDGB desteği ile "sevk" GDAL 2.0.2 ve üçüncü taraf olmadan bir FGDB sürücüsü bu şeyleri araştırmak için kullanıyorum. Test ortamı Debian Jessie 64 bit'tir.

Kısacası, "katman" Zone9_2014_01_Vesselsaf öznitelik verileri ve katman Zone9_2014_01_Broadcastkonum verileri içeriyor gibi görünüyor . R içinde bir sistem çağrısı ve GDB'nin bir şekil dosyası kapsayıcısı (yanıtın sonundaki son komut dosyası) ile konuşulması yoluyla bir geçici çözüm kullanabilirsiniz.

İşte araştırma adımları:

$ 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

Gördüğünüz gibi alan Geometryolarak ayarlanmış None. Verileri kullanarak bir şekil dosyasına dönüştürebilir ve ogr2ogryalnızca dbase öznitelik dosyasını da alabilirsiniz:

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

Zone9_2014_01_Vessel.dbf

Geometriler (pozisyonlar) katmanda bulunabilir 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 mesaj protokolüne göre pozisyon verisi içermeyen Gemi ve Yolculuk .

Burada R'de tam bir çözüm kullanarak GDB'nin şekil dosyası konuşmasını çağırması ve paketin foreigndbf'leri okuması gerekir:

# 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

teşekkürler @huckfinn! Bu güzel bir çözüm. Birçoğu örnekten çok daha büyük olan birkaç dosyam var, bu yüzden bir çekim yapacağım ve bir şekil dosyasına dönüştürme işlem sürelerini nasıl etkilediğini göreceğim. Ayrıca umutluyum, R'de doğrudan bir çözüm var, ancak kimse biriyle cevap vermezse, cevap olarak sizinkini seçeceğim.
Cotton.Rockwood

3

Bunu readOGR ile yapıp yapamayacağınızdan emin değilsiniz, ancak

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

Bu işe yaramazsa ogr2ogr, geometri dışı tabloları dışa aktarabilen doğrudan deneyin . (İşleminizi tamamladıktan sonra R paketini gdalUtilsçalıştırmayı deneyin .)


1
Ne yazık ki, readOGRgdb tablolarını okuyamaz.
Aaron

1
Muhtemelen şimdi.
mdsumner

Hala rgdal 1.2-8, gdal 2.0.1 itibariyle değil
gregmacfarlane

OgrDrivers () $ name içinde OpenFileGDB olarak adlandırılır, belki bir tarama okumaya çalışıyorsunuzdur? Her iki durumda da, sisteminiz ve denedikleriniz hakkında ayrıntılar içeren bir soru gönderebileceğinizi öğrenmek istiyorsanız, bu hala uygulanmaktadır.
mdsumner

3

Esri'den R ArcGIS Tools adı verilen R ve ArcGIS arasında yakın zamanda yayınlanan bir entegrasyon var . R ve ArcGIS arasında entegrasyon sağlar ve R araçlarına ve ArcGIS kaynaklarına dönüşümlü olarak erişmeyi mümkün kılar. Bu bütünleştirme ile coğrafi veritabanı özellik sınıflarına / tablolarına erişebilmeniz gerekir.

Örnek R araçları burada mevcuttur ve coğrafi işlem komut dosyalarında R kullanımını gösteren örnek araçlar buradadır .


1

Bu özel işlev temelde @huckfinn tarafından belirtilen yolu izler, ancak gdalUtilsmdsumner tarafından önerilen kütüphaneyi kullanır .

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

Bu şekilde çalıştırın:

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

Henüz gdalyüklemediyseniz, erişim sağlamak için yüklemeniz gerekir gdalUtils. 'Gdal' kurulumu için ikili dosyaları ve talimatları burada bulabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.