Select to view content in your preferred language

Get IFeatureLayer and ITable from feature class stored in "in memory" workspace

2666
2
Jump to solution
12-22-2012 03:25 AM
StanStas
Deactivated User
Hi,

I use "InMemoryWorkspace" as output of geoprocessing tool. I'd like to get IFeatureLayer and ITable from that output. How can I get it?

My try: 🙂
        output = "in_memory/file"        Dim pWorkspaceFactory As IWorkspaceFactory = New ESRI.ArcGIS.DataSourcesGDB.InMemoryWorkspaceFactory Dim pFeatureWorkspace As IFeatureWorkspace = pWorkspaceFactory.OpenFromFile("in_memory", 0) Dim pFLayer As IFeatureLayer = New FeatureLayer pFLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileName(output)) Dim pTable As ITable = pFeatureWorkspace.OpenTable(System.IO.Path.GetFileName(output))


Thanks for tips!
0 Kudos
1 Solution

Accepted Solutions
KenBuja
MVP Esteemed Contributor
Here's the code I use to get the output from a geoprocessing tool. In this case, I'm running a Dissolve with the output being a string of the final location. This string is used in the function ReturnObjectfromResult, which can return a feature class, feature layer,  or a table.

    Friend Function DissolveDataset(ByVal InputName As Object, ByVal DissolveField As String, ByVal StatsFields As String, ByVal OutputName As String) As ESRI.ArcGIS.Geodatabase.IFeatureClass          Dim DissolveDS As New ESRI.ArcGIS.DataManagementTools.Dissolve         Dim Result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2          Try             Using releaser As New ESRI.ArcGIS.ADF.ComReleaser                 releaser.ManageLifetime(DissolveDS)                 DissolveDS.in_features = InputName                 DissolveDS.dissolve_field = DissolveField                 DissolveDS.statistics_fields = StatsFields                 DissolveDS.out_feature_class = OutputName                  Result = RunTool(DissolveDS, Nothing)                 If Result Is Nothing Then                     System.Windows.Forms.MessageBox.Show("Could not dissolve dataset")                     Return Nothing                 End If                  Return ReturnObjectfromResult(Result, "Feature Class")             End Using          Catch ex As Exception             System.Windows.Forms.MessageBox.Show(ex.ToString, "Dissolve error")             Return Nothing         End Try      End Function      Private Sub ReturnMessages(ByVal pResult As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2, ByVal Title As String)          If pResult Is Nothing Then Exit Sub          Dim ErrorMessage As String          If pResult.MessageCount > 0 Then             For Count As Integer = 0 To pResult.MessageCount - 1                 ErrorMessage += pResult.GetMessage(Count)             Next         End If          System.Windows.Forms.MessageBox.Show(ErrorMessage, Title)      End Sub      Friend Function ReturnObjectfromResult(ByVal result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2, ByVal Type As String) As Object          Dim GPVal As ESRI.ArcGIS.Geodatabase.IGPValue         Dim InMemFC As String         Dim GPUtil As ESRI.ArcGIS.Geoprocessing.IGPUtilities3 = New ESRI.ArcGIS.Geoprocessing.GPUtilities          Try             GPVal = result.GetOutput(0)             InMemFC = GPVal.GetAsText()              Select Case Type                 Case "Feature Class"                     Return GPUtil.OpenFeatureClassFromString(InMemFC)                 Case "Table"                     Return GPUtil.OpenTableFromString(InMemFC)                 Case "Feature Layer"                     Return GPUtil.OpenFeatureLayerFromString(InMemFC)                 Case Else                     Return Nothing             End Select          Catch ex As Exception             System.Windows.Forms.MessageBox.Show(ex.ToString, "ReturnObjectfromResult error")             Return Nothing         End Try      End Function       Friend Function RunTool(ByVal Process As ESRI.ArcGIS.Geoprocessor.IGPProcess, ByVal TC As ESRI.ArcGIS.esriSystem.ITrackCancel2, Optional ByVal AddOutput As Boolean = False) As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2          Dim Result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2          Try             System.Windows.Forms.Cursor.Current = Windows.Forms.Cursors.WaitCursor             Dim GP As New ESRI.ArcGIS.Geoprocessor.Geoprocessor              GP.AddOutputsToMap = AddOutput             GP.OverwriteOutput = True              Result = CType(GP.Execute(Process, Nothing), ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2)             If Result.Status <> ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded Then ReturnMessages(Result, "Geoprocessing Error")             GP.ClearMessages()         Catch ex As Exception             ReturnMessages(Result, "Fail")             System.Windows.Forms.MessageBox.Show(ex.ToString, "Run Geoprocessor")         End Try          Return Result      End Function

View solution in original post

0 Kudos
2 Replies
ModyBuchbinder
Esri Regular Contributor
Hi Stan

You just created the inMemory workspace so I do not think you have any feature class or table in it.
After you create them (using CreateFeatureClass or CreateTable) you can just open them by name.
You do not give full path to open a feature class or table you just give the name.
The same is true for FGDB or ArcSDE workspace.
You set the path when you open the workspace (n need for memory workspace).

Have Fun
Mody
0 Kudos
KenBuja
MVP Esteemed Contributor
Here's the code I use to get the output from a geoprocessing tool. In this case, I'm running a Dissolve with the output being a string of the final location. This string is used in the function ReturnObjectfromResult, which can return a feature class, feature layer,  or a table.

    Friend Function DissolveDataset(ByVal InputName As Object, ByVal DissolveField As String, ByVal StatsFields As String, ByVal OutputName As String) As ESRI.ArcGIS.Geodatabase.IFeatureClass          Dim DissolveDS As New ESRI.ArcGIS.DataManagementTools.Dissolve         Dim Result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2          Try             Using releaser As New ESRI.ArcGIS.ADF.ComReleaser                 releaser.ManageLifetime(DissolveDS)                 DissolveDS.in_features = InputName                 DissolveDS.dissolve_field = DissolveField                 DissolveDS.statistics_fields = StatsFields                 DissolveDS.out_feature_class = OutputName                  Result = RunTool(DissolveDS, Nothing)                 If Result Is Nothing Then                     System.Windows.Forms.MessageBox.Show("Could not dissolve dataset")                     Return Nothing                 End If                  Return ReturnObjectfromResult(Result, "Feature Class")             End Using          Catch ex As Exception             System.Windows.Forms.MessageBox.Show(ex.ToString, "Dissolve error")             Return Nothing         End Try      End Function      Private Sub ReturnMessages(ByVal pResult As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2, ByVal Title As String)          If pResult Is Nothing Then Exit Sub          Dim ErrorMessage As String          If pResult.MessageCount > 0 Then             For Count As Integer = 0 To pResult.MessageCount - 1                 ErrorMessage += pResult.GetMessage(Count)             Next         End If          System.Windows.Forms.MessageBox.Show(ErrorMessage, Title)      End Sub      Friend Function ReturnObjectfromResult(ByVal result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2, ByVal Type As String) As Object          Dim GPVal As ESRI.ArcGIS.Geodatabase.IGPValue         Dim InMemFC As String         Dim GPUtil As ESRI.ArcGIS.Geoprocessing.IGPUtilities3 = New ESRI.ArcGIS.Geoprocessing.GPUtilities          Try             GPVal = result.GetOutput(0)             InMemFC = GPVal.GetAsText()              Select Case Type                 Case "Feature Class"                     Return GPUtil.OpenFeatureClassFromString(InMemFC)                 Case "Table"                     Return GPUtil.OpenTableFromString(InMemFC)                 Case "Feature Layer"                     Return GPUtil.OpenFeatureLayerFromString(InMemFC)                 Case Else                     Return Nothing             End Select          Catch ex As Exception             System.Windows.Forms.MessageBox.Show(ex.ToString, "ReturnObjectfromResult error")             Return Nothing         End Try      End Function       Friend Function RunTool(ByVal Process As ESRI.ArcGIS.Geoprocessor.IGPProcess, ByVal TC As ESRI.ArcGIS.esriSystem.ITrackCancel2, Optional ByVal AddOutput As Boolean = False) As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2          Dim Result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2          Try             System.Windows.Forms.Cursor.Current = Windows.Forms.Cursors.WaitCursor             Dim GP As New ESRI.ArcGIS.Geoprocessor.Geoprocessor              GP.AddOutputsToMap = AddOutput             GP.OverwriteOutput = True              Result = CType(GP.Execute(Process, Nothing), ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2)             If Result.Status <> ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded Then ReturnMessages(Result, "Geoprocessing Error")             GP.ClearMessages()         Catch ex As Exception             ReturnMessages(Result, "Fail")             System.Windows.Forms.MessageBox.Show(ex.ToString, "Run Geoprocessor")         End Try          Return Result      End Function
0 Kudos