J'essaye de lire un fichier .gdb en utilisant rgdal :: readOGR. Je l'ai finalement fait fonctionner il y a quelques jours en supprimant le "/" à la fin du chemin et le .gdb à la fin du nom de fichier. Alors, pouf! aujourd'hui mon code ne fonctionnera pas. Pour autant que je sache, rien n'a changé!
Après l'échec de mon code, j'ai essayé de tout mettre à jour, donc j'utilise maintenant: Mac OS10.14.4, RStudio v1.2.1335, R v3.6.0 et rgdal v1.4 -3. J'ai vérifié que rgdal a le pilote OpenFileGDB. J'ai également essayé d'ajouter l'extension .gdb au nom de fichier et de changer le nom de fichier .lyr pour qu'il corresponde à ce nom de fichier .gdb, mais rien ne fonctionne.
Voici le code que j'utilise ...
> list.files(path.expand("Data/GIS/CA_LandUse2014/ds2677/ds2677.gdb"))
[1] "a00000001.freelist" "a00000001.gdbindexes"
[3] "a00000001.gdbtable" "a00000001.gdbtablx"
[5] "a00000001.TablesByName.atx" "a00000002.gdbtable"
[7] "a00000002.gdbtablx" "a00000003.gdbindexes"
[9] "a00000003.gdbtable" "a00000003.gdbtablx"
[11] "a00000004.CatItemsByPhysicalName.atx" "a00000004.CatItemsByType.atx"
[13] "a00000004.FDO_UUID.atx" "a00000004.freelist"
[15] "a00000004.gdbindexes" "a00000004.gdbtable"
[17] "a00000004.gdbtablx" "a00000004.spx"
[19] "a00000005.CatItemTypesByName.atx" "a00000005.CatItemTypesByParentTypeID.atx"
[21] "a00000005.CatItemTypesByUUID.atx" "a00000005.gdbindexes"
[23] "a00000005.gdbtable" "a00000005.gdbtablx"
[25] "a00000006.CatRelsByDestinationID.atx" "a00000006.CatRelsByOriginID.atx"
[27] "a00000006.CatRelsByType.atx" "a00000006.FDO_UUID.atx"
[29] "a00000006.freelist" "a00000006.gdbindexes"
[31] "a00000006.gdbtable" "a00000006.gdbtablx"
[33] "a00000007.CatRelTypesByBackwardLabel.atx" "a00000007.CatRelTypesByDestItemTypeID.atx"
[35] "a00000007.CatRelTypesByForwardLabel.atx" "a00000007.CatRelTypesByName.atx"
[37] "a00000007.CatRelTypesByOriginItemTypeID.atx" "a00000007.CatRelTypesByUUID.atx"
[39] "a00000007.gdbindexes" "a00000007.gdbtable"
[41] "a00000007.gdbtablx" "a0000000a.FDO_GlobalID.atx"
[43] "a0000000a.gdbindexes" "a0000000a.gdbtable"
[45] "a0000000a.gdbtablx" "a0000000a.spx"
[47] "gdb" "timestamps"
Et voici le message d'erreur:
> list.files(path.expand("Data/GIS/CA_LandUse2014/ds2677"))
[1] "ds2677_LandUse2014.lyr" "ds2677.gdb"
Voici les fichiers dans le dossier ds2677:
XXX
Et voici les fichiers dans ds2677.gdb.
Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv, : Cannot open data source
Veuillez aider!
3 Réponses :
Je n'ai pas utilisé rgdal mais une autre alternative robuste pour interagir avec les données spatiales est le paquet sf. Pour charger à partir d'une géodatabase, vous utiliseriez st_read (dsn, layer), par exemple
library(sf)
luca <- st_read("data/mygeodatabase.gdb", layer = "layername")
Que vous dit ogrListLayers (src) ? Je pense que src doit être le chemin jusqu'à et y compris le ds2677.gdb .
Voici ce qui fonctionne pour moi - RI_geodatabase_wetlands.gdb est le dossier avec tous les fichiers a0000001.etc dans:
luca <- readOGR(gdb, "some_layer_name")
Maintenant, j'ai les noms de couches que je peux lire une couche à la fois:
gdb <- path.expand("Data/GIS/CA_LandUse2014/ds2677/ds2677.gdb")
ogrListLayers(gdb)
En regardant ce que vous avez essayé ici:
gdb <- path.expand("Data/GIS/CA_LandUse2014/ds2677")
luca <- readOGR(gdb, "ds2677")
Je pense que vous devriez faire:
> RI = readOGR("/data/gdb/RI_geodatabase_wetlands.gdb","Rhode_Island")
OGR data source with driver: OpenFileGDB
Source: "/data/gdb/RI_geodatabase_wetlands.gdb", layer: "Rhode_Island"
with 1 features
It has 5 fields
puis choisissez le nom du calque que vous voulez et faites:
> ogrListLayers("/data/gdb/RI_geodatabase_wetlands.gdb")
[1] "Rhode_Island" "RI_Wetlands"
[3] "RI_Wetlands_Project_Metadata" "RI_Wetlands_Historic_Map_Info"
attr(,"driver")
[1] "OpenFileGDB"
attr(,"nlayers")
[1] 4
Ça le fait! Merci! Incidemment, cette géodatabase n'a qu'une seule couche.
Voici comment j'ai procédé dans R 3.60 avec les pilotes rgdal 1.4-4 sur Windows 10 sans licence ARC-GIS. Notez que je convertis des fichiers * .gdbtable en un fichier shp éventuellement pour une utilisation sur Google Earth Pro. Un seul des fichiers gdbtable n'avait pas de «géométrie nulle» ou de champs qui m'intéressaient. Les fichiers numérotés ne m'intéressaient donc pas. Mais ogrInfo a prouvé que "a0000000b.gdbtable" était intéressant. Mise en garde: je publie simplement comment j'ai piraté cela. La plupart du temps, je trouve le code SIG dans R assez idiosyncratique pour que je ne prenne pas la peine de comprendre le fonctionnement des bibliothèques comme je le devrais. Je le fais juste fonctionner assez bien pour me donner un fichier ESRI shp à importer.
dir(pattern="*gdbtable")
[1] "a00000001.gdbtable" "a00000002.gdbtable" "a00000003.gdbtable" "a00000004.gdbtable" "a00000005.gdbtable" "a00000006.gdbtable" "a00000007.gdbtable" "a0000000b.gdbtable"
library(data.table)
library(rgdal) #rgdal_1.4-4
sessionInfo()
nrow(ogrDrivers())
as.data.table(ogrDrivers())[grepl("ESRI",long_name),]
cat('
name long_name write copy isVector
1: ESRI Shapefile ESRI Shapefile TRUE FALSE TRUE
2: OpenFileGDB ESRI FileGDB FALSE FALSE TRUE
')
setwd("C:/Users/username/Downloads/EAP_ENV_AmbientStations/EAP_ENV_AmbientStations.gdb")
ogrInfo("a0000000b.gdbtable")
cat('
Source: "C:\Users\username\Downloads\EAP_ENV_AmbientStations\EAP_ENV_AmbientStations.gdb\a0000000b.gdbtable", layer: "EAP_ENV_AmbientStations"
Driver: OpenFileGDB; number of rows: 557
Feature type: wkbPoint with 2 dimensions
Extent: (623276.8 93472.33) - (2533932 1367270)
CRS: +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs
Number of fields: 22
name type length typeName
1 STATION 4 6 String
2 STANAME 4 35 String
3 WBID 4 10 String
... ')
a0000000b <- readOGR("a0000000b.gdbtable")
writeOGR(a0000000b,dsn="EAP_ENV_AmbientStations.gdb",layer="EAP_ENV_AmbientStations_b",driver="ESRI Shapefile")
as.data.table(data.frame(a0000000b))[,names(.SD)]
[1] "STATION" "STANAME" "WBID" "DECOREGN" "ECORGN" "WATERSHED" "GLACIAL" "SPECIALCRI" "CORE" "STRUCT" "SURROUND" "LOCATIONTY" "ELEV" "RMI" "LAT_DD" "LONG_DD" "TRS" "QUAD" "COUNTY"
[20] "CONGDIST" "LEGDIST" "CLASS" "coords.x1" "coords.x2" "optional"
bubble(a0000000b['LAT_DD'], col=rgb(0.5,0.5,1,0.5))