Agregar GeoPackage a ArcGIS Desktop usando ArcObjects

Oct 27 2020

¿Cómo agrego una capa GeoPackage a ArcGIS Desktop usando código ArcObjects (preferiblemente c #)?

De la documentación de ESRI:

WorkspaceFactoryProgID identifica el ProgID del objeto WorkspaceFactory que se utiliza para abrir ese espacio de trabajo en particular.

Aquí hay una lista de algunos de los posibles WorkspaceFactoryProgID:

esriDataSourcesGDB.AccessWorkspaceFactory
esriDataSourcesFile.ArcInfoWorkspaceFactory
esriDataSourcesFile.CadWorkspaceFactory 
esriDataSourcesGDB.FileGDBWorkspaceFactory
esriDataSourcesOleDB.OLEDBWorkspaceFactory
esriDataSourcesFile.PCCoverageWorkspaceFactory
esriDataSourcesRaster.RasterWorkspaceFactory
esriDataSourcesGDB.SdeWorkspaceFactory
esriDataSourcesFile.ShapefileWorkspaceFactory
esriDataSourcesOleDB.TextFileWorkspaceFactory
esriDataSourcesFile.TinWorkspaceFactory
esriDataSourcesFile.VpfWorkspaceFactory

El uso de la palabra "algunos" me hace pensar que podría haber más fábricas disponibles. Ciertamente, puede agregar capas de GeoPackage usando el botón AddData en ArcMap.

Respuestas

3 Hornbydd Oct 28 2020 at 14:34

A continuación se muestra un código VBA que cargaría un FeatureClass en un geoPackage en un mapa en ArcMap. Necesitas acceder a él a través de SqlWorkspaceFactory.

Public Sub AddDataToMap()
    ' Path to geopackage
    Dim sPath As String
    Let sPath = "C:\Scratch\test.gpkg"
    
    ' Create workspace factory
    Dim pWSFac As IWorkspaceFactory2
    Set pWSFac = New esriDataSourcesGDB.SqlWorkspaceFactory
    
    ' Open workspace
    Dim pWS As IWorkspace
    Set pWS = pWSFac.OpenFromFile(sPath, 0)
    
    ' cast into Featureworkspace
    Dim pFWS As IFeatureWorkspace
    Set pFWS = pWS
    
    ' open FeatureClass
    Dim pFC As IFeatureClass
    Set pFC = pFWS.OpenFeatureClass("main.fcLines")
    
    ' Create layer
    Dim pFl As IFeatureLayer
    Set pFl = New FeatureLayer
    Set pFl.FeatureClass = pFC
    pFl.Name = "Lines dataset"
    
    ' Add to current map and refresh
    Dim pmxd As IMxDocument
    Set pmxd = ThisDocument
    pmxd.FocusMap.AddLayer pFl
    pmxd.ActiveView.Refresh
    pmxd.UpdateContents        
End Sub