Leer una tabla de una geodatabase de archivos ESRI (.gdb) usando R

16

Estoy intentando leer una tabla directamente de una geodatabase de archivos ESRI en R. Se puede descargar un archivo de datos de ejemplo aquí . La base de datos contiene una clase de entidad de puntos (Zone9_2014_01_Broadcast) y dos tablas vinculadas (Zone9_2014_01_Vessel y Zone9_2014_01_Voyage). Puede leer el shapefile en R usando readOGR del paquete 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")

Las dos tablas vinculadas también se muestran cuando usa ogrListLayers o ogrInfo . Sin embargo, ogrInfo da una advertencia:

  

Mensaje de advertencia:   En ogrInfo ("Zone9_2014_01.gdb", layer="Zone9_2014_01_Vessel"):     ogrInfo: todas las características NULL

Y si intentas usar readOGR en las tablas, obtienes un error:

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

Error en readOGR (dsn="Zone9_2014_01.gdb", layer="Zone9_2014_01_Vessel"):     no se encontraron características   Además: Mensaje de advertencia:   En ogrInfo (dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,:     ogrInfo: todas las características NULL

Por lo tanto, parece que solo las características geográficas se pueden leer con readOGR. ¿Hay alguna forma de importar las tablas directamente en R o es la única solución para exportarlas primero desde ArcGIS como archivos * .dbf (o * .txt) como en ¿esta respuesta?

Como complemento, si alguien puede proporcionar llamadas de R a un script de python que automatiza la exportación de archivos * csv (preferiblemente) o * .dbf, eso sería una solución alternativa aceptable. La solución solo necesita ser escalable y automatizada.

    
pregunta Cotton.Rockwood 09.03.2016 - 02:32

5 respuestas

11

Llego un poco tarde a la fiesta, pero sf ahora puede leer esto con

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

Devuelve una advertencia (no hay geometrías de entidad presentes) sino también un data.frame con la tabla. Vea el hilo que comenzó aquí: enlace

    
respondido por el Edzer Pebesma 11.02.2018 - 16:28
8

Uso GDAL 2.0.2 que se "envía" con soporte FDGB y sin un un controlador FGDB de terceros para investigar esas cosas El entorno de prueba es Debian Jessie de 64 bits.

En resumen, parece que la "capa" Zone9_2014_01_Vessel contiene datos de atributos puros y la capa Zone9_2014_01_Broadcast contiene datos de posición. Puede usar una solución alternativa dentro de R a través de una llamada del sistema y la conversación de la GDB a un contenedor de shapefile (último script al final de la respuesta).

Aquí están los pasos de investigación:

$ 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

Como se ve, el campo Geometry se establece en None . Puede convertir los datos en un archivo de forma usando ogr2ogr y obtener también solo un archivo de atributo dbase:

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

Zone9_2014_01_Vessel.dbf

Las geometrías (posiciones) se pueden encontrar en la capa 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

Vessel y Voyage no contienen datos de posición según el protocolo de mensajes AIS .

Aquí, la solución completa en R mediante una llamada al sistema para que la GDB forme una conversación con el archivo y el paquete foreign para leer los 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
    
respondido por el huckfinn 09.03.2016 - 07:34
3

No estoy seguro de poder hacer esto con readOGR pero intente

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

Si eso no funciona, intente ogr2ogr directamente, lo que puede exportar geometrías no a la tabla. (Tal vez intente R package gdalUtils para ejecutar eso, una vez que haya finalizado su proceso).

    
respondido por el mdsumner 09.03.2016 - 05:32
3

Hay una integración recientemente lanzada entre R y ArcGIS de Esri, llamada R ArcGIS Tools . Proporciona integración entre R y ArcGIS, lo que hace posible el acceso intercambiable de herramientas R y recursos de ArcGIS. Con esta integración, debería poder acceder a las clases / tablas de entidad de geodatabase.

Las herramientas R de muestra están disponibles aquí y herramientas de muestra La ilustración de uso de R en los scripts de geoprocesamiento es aquí .

    
respondido por el Alex Tereshenkov 14.03.2016 - 08:04
1

Esta función personalizada básicamente sigue la ruta descrita por @huckfinn pero usa la biblioteca gdalUtils sugerida por @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)
}

Ejecutalo de esta manera:

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

Si aún no tiene gdal instalado, deberá instalarlo para proporcionar acceso a gdalUtils . Puede encontrar los binarios e instrucciones para la instalación de 'gdal' aquí .

    
respondido por el D. Woods 11.10.2017 - 00:20

Lea otras preguntas en las etiquetas