本文是一些和layer相關的函數,如獲得某一類型的所有layer,根據圖層名獲得layer,獲得某layer所屬的grouplayer等。
''' <summary>
''' 得到pMap中所有的FeatureLayer圖層
''' </summary>
''' <param name="pMap">IMap對象</param>
''' <returns>查詢圖層列表</returns>
''' <remarks></remarks>
Public Shared Function GetAllFeatureLayer(ByVal pMap As IMap) As IEnumLayer
If pMap Is Nothing OrElse pMap.LayerCount = 0 Then Return Nothing
Dim pEnumLayer As IEnumLayer
Dim pId As New UID
Try
pId.Value = "{" & GetType(IFeatureLayer).GUID.ToString & "}" ''尋找出所有的IFeatureLayer對象(包括IAnnotationLayer)
pEnumLayer = pMap.Layers(pId, True)
Return pEnumLayer
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' 獲得當前地圖中所有某一類型的圖層
''' </summary>
''' <param name="pMap">IMap對象</param>
''' <param name="pType">圖層類型,形式如:GetType(ILayer)</param>
''' <returns>該類型圖層的list</returns>
''' <remarks></remarks>
Public Shared Function GetAllLayers(ByVal pMap As IMap, ByVal pType As Type) As List(Of ILayer)
If pMap Is Nothing OrElse pMap.LayerCount = 0 Then Return Nothing
Dim pLayers As New List(Of ILayer)
Dim pEnumLayer As IEnumLayer
Dim pId As New UID
Try
pId.Value = "{" & pType.GUID.ToString & "}" ''尋找出所有的IFeatureLayer對象(包括IAnnotationLayer)
pEnumLayer = pMap.Layers(pId, True)
Dim pLayer As ILayer = pEnumLayer.Next()
While Not pLayer Is Nothing
pLayers.Add(pLayer)
pLayer = pEnumLayer.Next()
End While
Return pLayers
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' 在地圖中選擇出對應為pFClass的第一個圖層
''' </summary>
''' <param name="pMap">IMap對象</param>
''' <param name="pFClass">IFeatureClass對象</param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetLayerByFeatureClass(ByVal pMap As IMap, ByVal pFClass As IFeatureClass) As IFeatureLayer
If pMap Is Nothing OrElse pFClass Is Nothing Then Return Nothing
Dim pEnumLayer As IEnumLayer
Dim pId As New UID
Try
pId.Value = "{" & GetType(IFeatureLayer).GUID.ToString & "}" ''尋找出所有的IFeatureLayer對象(包括IAnnotationLayer)
pEnumLayer = pMap.Layers(pId, True)
Dim pLayer As IFeatureLayer = pEnumLayer.Next()
While Not pLayer Is Nothing
If pLayer.FeatureClass Is pFClass Then
Return pLayer
End If
pLayer = pEnumLayer.Next()
End While
Return Nothing
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' 查詢pLayer所在的IGroupLayer
''' </summary>
''' <param name="pMap">IMap對象</param>
''' <param name="pLayer">ILayer對象</param>
''' <returns>IGroupLayer對象</returns>
''' <remarks>
''' 無或異常返回Nothing
''' </remarks>
Public Shared Function GetGroupLayerByLayer(ByVal pMap As IMap, ByVal pLayer As ILayer) As IGroupLayer
If pMap Is Nothing OrElse pLayer Is Nothing Then Return Nothing
Dim pEnumLayer As IEnumLayer
Dim pId As New UID
Try
pId.Value = "{" & GetType(IGroupLayer).GUID.ToString & "}" ''尋找出所有的IFeatureLayer對象(包括IAnnotationLayer)
pEnumLayer = pMap.Layers(pId, True)
Dim pGLayer As IGroupLayer = pEnumLayer.Next()
While Not pGLayer Is Nothing
Dim i As Integer
For i = 0 To CType(pGLayer, ICompositeLayer).Count - 1
If CType(pGLayer, ICompositeLayer).Layer(i) Is pLayer Then
Return pGLayer
End If
Next
pGLayer = pEnumLayer.Next()
End While
Return Nothing
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' 尋找出pFeature所在的圖層
''' </summary>
''' <param name="pFeature">IFeature對象</param>
''' <param name="pMap">IMap對象</param>
''' <returns>查詢圖層</returns>
''' <remarks>
''' 通過比對IMap中圖層的FeatureClass.AliasName和IFeature.Class.AliasName進行判斷
''' </remarks>
Public Shared Function SearchLayer(ByVal pFeature As IFeature, ByVal pMap As IMap) As IFeatureLayer
Try
If pFeature Is Nothing Or pMap Is Nothing OrElse pMap.LayerCount = 0 Then Return Nothing
Dim pEnumLayer As IEnumLayer
Dim pLayer As IFeatureLayer
Dim pId As New UID
pId.Value = "{" & GetType(IFeatureLayer).GUID.ToString & "}"
pEnumLayer = pMap.Layers(pId, True)
pEnumLayer.Reset()
pLayer = pEnumLayer.Next
While pLayer IsNot Nothing
If pLayer.FeatureClass IsNot Nothing Then
If pLayer.FeatureClass.AliasName = pFeature.Class.AliasName Then '當pLayer中沒有對象時,pLayer.FeatureClass為空白
Return (pLayer)
End If
End If
pLayer = pEnumLayer.Next
End While
Return Nothing
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' 查詢Map中的圖層名為sLayerName的圖層
''' </summary>
''' <param name="pMap">IMap對象</param>
''' <param name="sLayerName">圖層名稱</param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetLayerByName(ByVal pMap As IMap, ByVal sLayerName As String) As ILayer
If pMap Is Nothing OrElse pMap.LayerCount = 0 Then Return Nothing
Try
Dim pId As New UID
pId.Value = "{" & GetType(ILayer).GUID.ToString & "}"
Dim pEnumLayer As IEnumLayer = pMap.Layers(pId, True)
pEnumLayer.Reset()
Dim pLayer As ILayer
pLayer = pEnumLayer.Next
While pLayer IsNot Nothing
If pLayer.Name = sLayerName Then
Exit While
End If
pLayer = pEnumLayer.Next
End While
Return pLayer
Catch ex As Exception
Return Nothing
End Try
End Function
''' <summary>
''' 根據圖層名稱取得其圖層所在編號,如果沒有此圖層,則返回-1
''' </summary>
''' <param name="LayerName"></param>
''' <param name="pMap"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetFeatureLayerIndex(ByVal LayerName As String, ByVal pMap As IMap) As Integer
If pMap Is Nothing OrElse pMap.LayerCount = 0 Then Return -1
Dim Counter As Long
Try
For Counter = 0 To pMap.LayerCount - 1
If TypeOf pMap.Layer(Counter) Is IFeatureLayer Then
If pMap.Layer(Counter).Name = LayerName Then
Return Counter
End If
End If
Next Counter
Return -1
Catch ex As Exception
Return -1
End Try
End Function
''' <summary>
''' 根據檔案路徑建立layer
''' </summary>
''' <param name="pFilePath">檔案全路徑</param>
''' <returns>返回建立的layer</returns>
''' <remarks></remarks>
Shared Function CreateLayerFromPath(ByVal pFilePath As String) As ILayer
Try
'Get the ILayerFactoryHelper interface
Dim pLayerFactoryHelper As ILayerFactoryHelper
pLayerFactoryHelper = New LayerFactoryHelper
'Get the IEnumLayer interface through the ILayerFatcoryHelper interface
Dim pFileName As IFileName = New FileName
pFileName.Path = pFilePath
Dim pEnumLayer As IEnumLayer
pEnumLayer = pLayerFactoryHelper.CreateLayersFromName(pFileName)
pEnumLayer.Reset()
'Get the ILayer interface
Dim pLayer As ILayer
pLayer = pEnumLayer.Next
'Loop through layers
Dim pReLayer As ILayer = Nothing
Do While Not pLayer Is Nothing
'Add the layer to the map
pReLayer = pLayer
pLayer = pEnumLayer.Next
Loop
Return pReLayer
Catch ex As Exception
Return Nothing
End Try
End Function