28 votos

Leer una tabla de una geodatabase de archivo de ESRI (.gdb) utilizando R

Estoy tratando de leer una tabla directamente desde 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 característica de punto (Zone9_2014_01_Broadcast) y dos tablas vinculadas (Zone9_2014_01_Vessel y Zone9_2014_01_Voyage). Puede leer el shapefile en R utilizando readOGR de la rgeos paquete:

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 muestran cuando se utiliza 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 tratas de usar readOGR en las tablas se obtiene 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 han encontrado 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 sólo los accidentes geográficos pueden ser leídos por elOGR. ¿Hay alguna forma de importar las tablas directamente a R o la única solución es exportarlas primero desde ArcGIS como archivos *.dbf (o *.txt) como en este ¿Respuesta?

Además, si alguien puede proporcionar llamadas desde R a un python script que automatice la exportación de archivos *csv (preferiblemente) o *.dbf, sería una solución aceptable. La solución sólo tiene que ser escalable y automatizada.

2 votos

¿Has visto la nueva integración de R y ArcGIS? r-arcgis.github.io tal vez algo útil para su trabajo.

0 votos

Gracias por la sugerencia... Había visto que se mencionaba en algún momento, pero nunca lo había investigado más a fondo. Quizás ahora sea un buen momento para hacerlo.

0 votos

@AlexTereshenkov, si quieres escribir una respuesta corta para esta solución, la aceptaré ya que es lo que estaba buscando.

36voto

Josh Peterson Puntos 108

Esto puede ser leído ahora por sf con

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

Devuelve una advertencia (no hay geometrías de características presentes) pero también un data.frame con la tabla. Ver el hilo que comenzó aquí: https://stat.ethz.ch/pipermail/r-sig-geo/2018-February/026344.html

0 votos

Es extraño, no he sido capaz de ejecutar esto en 3 máquinas: Me sale un error, no una advertencia?

1 votos

Tendrás que instalar la versión de desarrollo desde github, desde el código fuente, o esperar hasta el lanzamiento de la versión 0.6-1 el próximo mes

9voto

huckfinn Puntos 698

Utilizo GDAL 2.0.2 que se "envía" con soporte FDGB y sin tercero un controlador FGDB 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 utilizar una solución dentro de R a través de una llamada al sistema y la conversación del GDB a un contenedor shapefile (último script al final de la respuesta).

Estos son los pasos de la 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

Al ver el campo Geometry se ajusta a None . Puede convertir los datos en un archivo shape utilizando ogr2ogr y obtener también sólo un archivo de atributos de la base de datos:

$ 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 encuentran 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

Buque y travesía que no contiene datos de posición según el Protocolo de mensajes AIS .

Aquí la solución completa en R utilizando una llamada al sistema para la conversación GDB to shapefile 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

4voto

Alex Tereshenkov Puntos 13433

Existe una integración recientemente publicada entre R y ArcGIS de Esri, llamada Herramientas R ArcGIS . Proporciona una integración entre R y ArcGIS que permite acceder indistintamente a las herramientas de R y a los recursos de ArcGIS. Con esta integración debería poder acceder a las clases/tablas de características de las bases de datos geográficas.

Hay disponibles herramientas de R de muestra aquí y herramientas de ejemplo que ilustran el uso de R en scripts de geoprocesamiento son aquí .

3voto

sgwill Puntos 2444

No estoy seguro de si se puede hacer esto con readOGR pero intente

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

Si eso no funciona, pruebe con ogr2ogr directamente, que puede exportar las no-geometrías a la tabla. (Tal vez pruebe con el paquete R gdalUtils para ejecutar eso, una vez que tengas tu proceso).

1 votos

Desgraciadamente, readOGR no tiene la capacidad de leer las tablas de gdb.

1 votos

Probablemente lo haga, ahora.

0 votos

Todavía no a partir de rgdal 1.2-8, gdal 2.0.1

1voto

NeilDurant Puntos 872

Esta función personalizada sigue básicamente el camino señalado por @huckfinn pero utiliza el gdalUtils biblioteca 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)
}

Hazlo así:

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, tendrá que instalarlo para dar acceso a gdalUtils . Puede encontrar binarios e instrucciones para la instalación de 'gdal' aquí .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X