Suite

Vb.net arcobjects requête spatiale obtenir la valeur des champs de la couche souhaitée uniquement


Actuellement, j'utilise ArcObjects (10.2.1) dans vb.net (vs 2012). Ce que j'ai l'intention de développer est un outil de requête spatiale. Il y a 2 étapes dans la fonction :

(1) Utilisez l'outil "Sélectionner des entités" dans ArcMap pour sélectionner des entités dans une certaine zone.

(2) Lister les différents champs d'entités sélectionnés d'une couche.

Ma question est de savoir comment obtenir les valeurs de champ uniquement pour une couche d'entités souhaitée. Mon code est listé ci-dessous. Cela ne fonctionne que lorsque seule la couche souhaitée est activée sur ArcMap.

Dim pMxDoc As IMxDocument Dim pMap As IMap Dim pEnumFeature As IEnumFeature Dim pEnumFeatureSetup As IEnumFeatureSetup Dim pFeature As IFeature pMxDoc = My.ArcMap.Document pMap = pMxDoc.Focus.FocusMap pEnumFeature = True Dim layerNum = GetIndexNumberFromLayerName(pActiveView, "testdb.DBO.testTable") pFeatSel = pMap.Layer(layerNum) Dim tempArr As New List(Of String) Do While (pas pFeature Is Nothing) tempArr.Add(pFeature.Value(pFeature. Fields.FindField("Item_ID")).ToString) pFeature = pEnumFeature.Next Loop Dim message = String.Join(Environment.NewLine, tempArr.ToArray()) Dim lstOfString As List(Of String) = New List(Of String) (tempArr) Dim selectedCount = lstOfString.Count End If Public Function GetIndexNumberFromLayerName(ByVal activeView As ESRI.ArcGIS.Carto.IActiveView, ByVal layerName As System.String) As System.Int32 Si activeView n'est rien OuElse layerName n'est rien alors Return -1 End If Dim map As ESRI.ArcGIS.Carto.IMap = activeView.FocusMap Dim numberOfLayers As System.Int32 = map.LayerCount Dim i As System.Int32 = 0 Do While i < numberOfLayers If layerName = map.Layer(i ).Name Then Return i End If i += 1 Loop Return -1 LayerNumber = i End Function

Je pense que vous rendez cela plus difficile que cela ne devrait l'être. Vous obtenez vos caractéristiques sélectionnées à partir d'IMap.FeatureSelection. Ainsi, plusieurs couches pourraient renvoyer une sélection.

Une bien meilleure façon est de maîtriser votre ILayer, jette ça dans un IFeatureCalque puis pointez un IFeatureSelection interface avec IFeatureCalque. De cela, vous pouvez obtenir un ISelectionSet. Cela a une méthode de recherche qui renvoie un curseur sur la sélection dans cette couche spécifique.

Voici un petit exemple de code :

Dim pFeatureSelection As IFeatureSelection pFeatureSelection = pFeatureLayer Dim pSelectionSet As ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet Dim pFeatureCursor As IFeatureCursor = Rien pSelectionSet.Search(Nothing, True, pFeatureCursor)

Voici le code entièrement fonctionnel :

pMxDoc = My.ArcMap.Application.Document pMap = pMxDoc.FocusMap pActiveView = pMxDoc.FocusMap Dim layerNum = GetIndexNumberFromLayerName(pActiveView, "testdb.DBO.testTable") Dim pFeatureLayer As ILayerLayer pFeap pFeatureSelection = pFeatureLayer Dim pSelectionSet As ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet Dim pFeatureCursor As IFeatureCursor = Nothing pSelectionSet.Search(Nothing, True, pFeatureCursor) Dim tempArr As New List (Of String) Dim pFeature As IFeature DoCursor (Nothing, True, pFeatureCursor) pFeature n'est rien) tempArr.Add(pFeature.Value(pFeature.Fields.FindField("Item_ID")).ToString) pFeature = pFeatureCursor.NextFeature Loop