Как заставить rgdal открыть файл базы геоданных (.gdb)? - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь читать в файле .gdb, используя rgdal :: readOGR. Я наконец-то заставил его работать несколько дней назад, убрав завершающий символ "/" в конце пути и .gdb в конце имени файла. Тогда пуф! сегодня мой код не будет работать. Насколько я могу сказать, ничего не изменилось!

После сбоя моего кода я попытался обновить все, и теперь я работаю: Mac OS10.14.4, RStudio v1.2.1335, R v3.6.0 и rgdal v1.4-3. Я проверил, что у rgdal есть драйвер OpenFileGDB. Я также попытался добавить расширение .gdb к имени файла и изменить имя файла .lyr, чтобы оно совпадало с именем файла .gdb, но ничего не работает.

Вот код, который я использую ...

gdb <- path.expand("Data/GIS/CA_LandUse2014/ds2677")
luca <- readOGR(gdb, "ds2677")

А вот и сообщение об ошибке:

Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,  : 
  Cannot open data source

Это файлы в папке ds2677:

> list.files(path.expand("Data/GIS/CA_LandUse2014/ds2677"))
[1] "ds2677_LandUse2014.lyr" "ds2677.gdb"        

А это файлы в ds2677.gdb.

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

Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Что ogrListLayers(src) говорит вам?Я думаю, что src должен быть путь до и включая ds2677.gdb.

Вот что мне подходит - RI_geodatabase_wetlands.gdb - это папка со всеми файлами a0000001.etc в:

> 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

Теперь у меня есть имена слоев, которые я могу читать по слоям одновременно:

> 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

Глядя на то, что вы пытались здесь:

gdb <- path.expand("Data/GIS/CA_LandUse2014/ds2677")
luca <- readOGR(gdb, "ds2677")

Я подозреваю, что вы должны сделать:

gdb <- path.expand("Data/GIS/CA_LandUse2014/ds2677/ds2677.gdb")    
ogrListLayers(gdb)

затем выберите желаемое имя слоя и сделайте:

luca <- readOGR(gdb, "some_layer_name")
0 голосов
/ 30 мая 2019

Так я поступил в R 3.60 с драйверами rgdal 1.4-4 для Windows 10 без лицензий ARC-GIS. Обратите внимание, что я в конечном итоге конвертирую * .gdbtable файлы в shp-файл для использования в Google Планета Земля Про. Только один из файлов gdbtable не имел «нулевой геометрии» или полей, которые меня интересовали. Поэтому нумерованные файлы мне не были интересны. Но ogrInfo доказал, что "a0000000b.gdbtable" был интересным. Предостережение: я просто публикую, как я это взломал. Большую часть времени я нахожу ГИС-код достаточно понятным, чтобы я не удосужился понять функциональные возможности библиотек так, как мне следовало бы. Я просто заставляю его работать достаточно хорошо, чтобы дать мне shp-файл ESRI для импорта.

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)) 
0 голосов
/ 29 апреля 2019

Я не использовал rgdal, но другой надежной альтернативой для взаимодействия с пространственными данными является пакет sf. Для загрузки из базы геоданных вы должны использовать st_read (dsn, layer), например

library(sf)
luca <- st_read("data/mygeodatabase.gdb", layer = "layername")
...