R का उपयोग करके ESRI फ़ाइल जियोडैटेबेस (.gdb) की एक तालिका पढ़ें


21

मैं आरएसआई में एक ईएसआरआई फ़ाइल जियोडैटाबेस से एक तालिका को सीधे पढ़ने की कोशिश कर रहा हूं। एक उदाहरण डेटा फ़ाइल यहां डाउनलोड की जा सकती है । डेटाबेस में एक बिंदु सुविधा वर्ग (Zone9_2014_01_Broadcast) और दो लिंक की गई तालिकाएँ (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या ogrInfo। हालाँकि, ogrInfoएक चेतावनी देता है:

चेतावनी संदेश: ogrInfo में ("Zone9_2014_01.gdb", परत = "ज़ोन 9_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, layer = layer) में, एन्कोडिंग, एन्कोडिंग, use_iconv = use_iconv, \ _rv, \ _ \ _ सभी सुविधाएँ NULL

इस प्रकार, ऐसा प्रतीत होता है कि केवल भौगोलिक विशेषताओं को readOGR द्वारा पढ़ा जा सकता है। क्या तालिकाओं को सीधे आर में आयात करने का कोई तरीका है या आर्कगिस से पहले निर्यात करने का एकमात्र समाधान है। * .dbf (या * .txt) फाइलों को इस उत्तर के रूप में ?

इसके अतिरिक्त, यदि कोई R से एक अजगर स्क्रिप्ट को कॉल प्रदान कर सकता है जो * csv (अधिमानतः) या * .dbf फ़ाइलों के निर्यात को स्वचालित करता है, तो यह एक स्वीकार्य कार्य है। समाधान के लिए केवल मापनीय और स्वचालित होना चाहिए।


2
क्या आपने R और ArcGIS का नया एकीकरण देखा है? r-arcgis.github.io शायद आपके काम के लिए कुछ उपयोगी हो।
एलेक्स टेरेशेनकोव

सुझाव के लिए धन्यवाद ... मैंने एक बिंदु पर इसका उल्लेख देखा था, लेकिन कभी भी इसे अधिक अच्छी तरह से नहीं देखा। शायद अब ऐसा करने का एक अच्छा समय होगा!
कपास। रॉकवुड

@AlexTereshenkov, यदि आप इस समाधान के लिए एक संक्षिप्त उत्तर लिखना चाहते हैं, तो मैं इसे स्वीकार करूंगा क्योंकि यह वही है जो मैं देख रहा था।
कॉटन.रोकवुड

1
यह R-ArcGIS ब्रिज की तरह दिखता है, जिसका उल्लेख @AlexTereshenkov में टेबल को सीधे R में पढ़ने की कार्यक्षमता है। एकीकरण के लिए ArcGIS डेस्कटॉप> 10.3.1 (या ArcGIS Pro) और R> 3.2 की आवश्यकता है। 64-बिट आर का उपयोग केवल 64-बिट बैकग्राउंड जियोप्रोसेसिंग के साथ किया जा सकता है (और केवल आरसीजीआईएस से उपयोग करने की अनुमति देता है, आर से नहीं) या आर्कगिस प्रो। एक बार बाइंडिंग स्थापित होने के बाद, आप 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")

यह एक चेतावनी देता है (वर्तमान में कोई सुविधा ज्यामिति नहीं) लेकिन तालिका के साथ एक डेटा.फ्रेम भी। यहां शुरू होने वाले धागे को देखें: https://stat.ethz.ch/pipermail/r-sig-geo/2018-Febdays/026344.html


अति उत्कृष्ट! धन्यवाद एडजर ... यह देखकर और sf के विकास में खुशी हुई !!
कॉटन.रॉकवुड

अजीब बात है, मैं इसे 3 मशीनों पर नहीं चला पा रहा था: मुझे कोई त्रुटि मिलती है, चेतावनी नहीं?
मटिफॉ

1
आपको स्रोत से, जीथब से देव संस्करण को स्थापित करने की आवश्यकता होगी, या अगले महीने 0.6-1 रिलीज होने तक प्रतीक्षा करें
एडज़र पेबसेमा

पार्टी की तुलना में बेहतर कभी नहीं! मैं इस पार्टी में आया ~ 2 साल पहले और पिछले समाधानों में से एक का कार्यान्वयन था। मैं बस एक sfसमाधान की तलाश में चला गया और Google ने मुझे खुशी के साथ सुपर सहायक समाधान के साथ एक ही पार्टी में वापस लाया (इसलिए मैंने खुशी से इस प्रश्न के साथ अपने उत्थान को जोड़ा)।
डी। वुड्स

9

मैं GDAL 2.0.2 का उपयोग करता हूं जो कि एफडीजीबी समर्थन के साथ "शिप" है और उस सामान की जांच के लिए एक एफजीडीबी ड्राइवर के बिना तीसरे पक्ष के है । परीक्षण का वातावरण डेबियन जेसी 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। आप डेटा को किसी आकृति फ़ाइल में बदल सकते हैं 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

वेसल और यात्रा एआईएस संदेश प्रोटोकॉल के अनुसार कोई स्थिति डेटा नहीं है

यहां GDB के लिए एक सिस्टम कॉल का उपयोग करके आर में पूर्ण वर्कअराउंड बातचीत को आकार देने के foreignलिए और dbf को पढ़ने के लिए पैकेज :

# 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

धन्यवाद @ हफ़्फ़िन! यह एक अच्छा समाधान है। मेरे पास काफी फाइलें हैं (जिनमें से कई उदाहरण से बहुत बड़ी हैं), इसलिए मैं इसे एक शॉट दूंगा और देखूंगा कि कैसे एक आकृति में रूपांतरण प्रसंस्करण समय को प्रभावित करता है। मैं भी आशान्वित हूं, आर में एक सीधा समाधान है, लेकिन अगर कोई एक के साथ जवाब नहीं देता है, तो मैं जवाब के रूप में आपका चयन करूंगा।
कपास। रौकवुड

3

यकीन है कि अगर आप readOGR के साथ ऐसा नहीं कर सकते हैं, लेकिन कोशिश करें

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

यदि वह ogr2ogrसीधे काम नहीं करता है , जो गैर-ज्यामितीयों को तालिका में निर्यात कर सकता है। (हो सकता है कि आर पैकेज gdalUtilsको चलाने की कोशिश करें , एक बार जब आप अपनी प्रक्रिया को समाप्त कर लें।)


1
दुर्भाग्य से, readOGRgdb तालिकाओं को पढ़ने की क्षमता नहीं है।
हारून

1
यह शायद, अब करता है।
मडसमनर

फिर भी नहीं के रूप में rgdal 1.2-8, gdal 2.0.1
gregmacfarlane

इसे ओगड्राइवर्स () $ नाम में OpenFileGDB कहा जाता है, शायद आप एक रास्टर पढ़ने की कोशिश कर रहे हैं? यह अभी भी लागू किया जा रहा है, किसी भी तरह से यदि आप यह जानना चाहते हैं कि आप अपने सिस्टम के बारे में विवरण और आपने क्या प्रयास किया है, के साथ एक प्रश्न पोस्ट कर सकते हैं।
मडसुमेर 21

3

आर्री से आर और आर्किजीएस के बीच हाल ही में जारी एकीकरण है, जिसे आर आर्किस टूल्स कहा जाता है । यह आर और आर्कजीआईएस के बीच एकीकरण प्रदान करता है जिससे यह संभव हो पाता है कि आर उपकरण और आर्कजीआईएस संसाधनों का आदान-प्रदान हो सके। आपको इस एकीकरण के साथ जियोडेटाबेस फ़ीचर क्लासेस / टेबल तक पहुँचने में सक्षम होना चाहिए।

नमूना आर उपकरण उपलब्ध हैं यहाँ और लिपियों 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। आप यहाँ 'गदल' स्थापना के लिए बायनेरिज़ और निर्देश पा सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.