【问题标题】:How do I get rgdal to open a geodatabase (.gdb) file?如何让 rgdal 打开地理数据库 (.gdb) 文件?
【发布时间】:2019-09-18 11:50:38
【问题描述】:

我正在尝试使用 rgdal::readOGR 读取 .gdb 文件。几天前,我终于通过删除路径末尾的尾随“/”和文件名末尾的 .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")

这是错误信息:

ogrInfo 中的错误(dsn = dsn,层 = 层,编码 = 编码,use_iconv = use_iconv,: 无法打开数据源

这些是 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"     

请帮忙!

【问题讨论】:

    标签: r rgdal


    【解决方案1】:

    我没有使用 rgdal,但另一个与空间数据交互的强大替代方案是 sf 包。要从地理数据库加载,您可以使用 st_read(dsn, layer) 例如

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这就是它!谢谢!顺便说一下,这个地理数据库只有一层。
      【解决方案3】:

      这就是我在没有 ARC-GIS 许可证的 Windows 10 上使用 rgdal 1.4-4 驱动程序在 R 3.60 中进行此操作的方式。请注意,我最终将 *.gdbtable 文件转换为 shp 文件,以便在 Google Earth Pro 上使用。只有一个 gdbtable 文件没有“空几何”或我感兴趣的字段。所以编号文件对我来说并不感兴趣。但是 ogrInfo 证明“a0000000b.gdbtable”很有趣。警告:我只是在发布我是如何破解的。很多时候,我发现 R 中的 GIS 代码足够奇特,以至于我懒得去理解我应该理解的库的功能。我只是让它工作得很好,可以给我一个 ESRI shp 文件以供导入。

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

      【讨论】:

        猜你喜欢
        • 2016-06-04
        • 2014-02-25
        • 1970-01-01
        • 2016-10-08
        • 2022-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多