Suite

Fusion de fonctionnalités en une seule par programmation


J'ai un fichier de formes avec des polygones. Je peux les fusionner manuellement en entrant dans la session d'édition et en sélectionnant certaines fonctionnalités à fusionner, puis en utilisant le bouton de fusion sous Éditeur.

Comment faire cela par programmation (en VBA) ?

J'ai trouvé des moyens analogues mais cela ne résout pas le problème:

  1. Standard Dissoudre tool (de ArcToolbox) ne fonctionne pas correctement à cette fin, car il coupe de nombreux champs et parce qu'il fonctionne avec la FeatureClass entière mais pas avec des entités séparées.
  2. Comme je le sais en lisant quelques exemples, en utilisant un IBasicGeoprocessor (VBA) ont le même problème - il fonctionne avec une FeatureClass entière, produisant une nouvelle FeatureClass, mais pas avec des fonctionnalités séparées, les regroupant dans la même FeatureClass.

@kenbuja, Voici mon essai dans vba (pas dans vb.net) : L'utilisation d'un CType provoque l'erreur de compilation : Sub ou Function non défini. Qu'est-ce que je fais de mal ?

Dim pMxDoc As IMxDocument Dim pCountyLayer As IFeatureSelection Dim pCountySelection As ISelectionSet Dim pCountyCursor As IFeatureCursor Dim pCountyCursor2 As IFeatureCursor Dim pFirstFeature As IFeature Dim pSecondFeature As pSecondFeatureD = IFeature Set1 Set pFoSetDim pThirdselection pCountyLayer.SelectionSet ' Crée un curseur à partir de l'entité sélectionnée dans la couche (1). pCountySelection.Search Nothing, True, pCountyCursor pCountySelection.Search Nothing, True, pCountyCursor2 ' Renvoie les entités sélectionnées à partir du curseur. Set pFirstFeature = pCountyCursor.NextFeature Set pThirdFeature = pCountyCursor2.NextFeature Set pSecondFeature = pCountyCursor2.NextFeature Dim pFirstGeometry As IGeometry Set pFirstGeometry = CType(pFirstFeature.Shape, IGeometry) Dim pTopoOperatorAsperator Définir pSecondGeom = CType(pSecondFeature.Shape, IGeometry) Dim pMergedGeom As IGeometry Définir pMergedGeom = pTopoOperator.Union(pSecondGeom)

Vous pouvez utiliser la méthode Union d'ITopologicalOperator pour fusionner par programme deux polygones ensemble. Cet exemple (écrit en VB.NET) montre comment procéder.

Dim pFirstGeometry As IGeometry = CType(pFirstFeature.shape, IGeometry) Dim pTopoOperator As ITopologicalOperator = CType(pFirstGeometry, ITopologicalOperator) Dim pSecondGeom As IGeometry = CType(pSecondFeature.shape, IGeogedOperatore) Dim

J'ai trouvé l'analogue de Editor_Merge dans vba :

Application.Document.CommandBars.Find(ArcID.Editor_Merge).Execute

mais la fenêtre apparaît qui permet de sélectionner l'entité à laquelle la géométrie du résultat sera affectée, et je ne sais pas comment choisir l'entité par programme.

J'ai donc trouvé un autre code - il fusionne les entités sélectionnées (et supprime les entités initiales après la fusion), le résultat reste dans la même classe d'entités

On Error GoTo EH Dim pMxDocument Comme IMxDocument Dim pmap qu'IMAP Dim pActiveView Comme IActiveView Dim pFeatureSelection Comme IFeatureSelection Dim pTopologicalOperator Comme ITopologicalOperator Dim pEnumGeometry Comme IEnumGeometry Dim pEnumGeometryBind Comme IEnumGeometryBind Dim pEnumFeature Comme IEnumFeature Dim pFeature Comme iFonction Dim pNewFeature Comme iFonction Dim pOutputGeometry Comme IGeometry Dim puid As New UID Dim pEditor As IEditor Dim pFeatureLayer As IFeatureLayer Dim pFeatureClass As IFeatureClass Set pMxDocument = ThisDocument Set pMap = pMxDocument.FocusMap Set pActiveView = pMxDocument.FocusMap Set pFeatureLayer = aFeatureLayer = aMapature.Layer Set pActiveView = pMxDocument.FocusMap Set pFeatureLayer = aFeatureLayer = aFeature.Layer à l'extension Éditeur. pUID = "esriEditor.Editor" Set pEditor = Application.FindExtensionByCLSID(pUID) Set pFeatureSelection = pFeatureLayer Set pEnumGeometryBind = New EnumFeatureGeometry pEnumGeometryBind.BindGeometrySource Nothing, pFeatureSelection.ExelectionSelectionSet 0 Si pFeatureSelectionGindT = New Polygon pTopologicalOperator.ConstructUnion pEnumGeometry ' Obtenir l'ensemble sélectionné et le placer dans le curseur. Set pEnumFeature = pMap.FeatureSelection Set pFeature = pEnumFeature.Next ' Obtenir la géométrie de chaque polygone, l'ajouter au nouveau polyon ' et supprimer l'original. Faire sans pFeature n'est rien si pOutputGeometry n'est rien, alors définissez pOutputGeometry = pFeature.Shape Else Set pOutputGeometry = pTopologicalOperator.Union(pFeature.Shape) End If Set pTopologicalOperator = pOutputGeometry pFeature.Delete Set pFeature = pEopFeature'Next mémoriser le numéro de demande. Set pNewFeature = pFeatureClass.CreateFeature Set pNewFeature.Shape = pOutputGeometry ' Stocke la nouvelle fonctionnalité fusionnée. pNewFeature.Store ' Arrête l'opération d'édition. 'pEditor.StopOperation ("Fusionner les polygones") ' Actualiser la vue de la carte pActiveView.Refresh Exit Sub EH: MsgBox Err.Description, vbInformation, "MergeCEPolygons"