默认头像
路人甲
路人甲
  • 注册日期2004-09-02
  • 发帖数8
  • QQ
  • 铜币74枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1229回复:0

[求助]通过Ploygon中的多个Ring创建多个Ploygon

楼主#
更多 发布于:2006-03-26 19:34

在一篇有关vba-AO开发的电子文档中有“通过Ploygon中的多个Ring创建多个Ploygon”说明及程序(见下),但我将程序copy到arcmap的宏编辑器中运行时,其提示“object variable or with block vaviable not set”错误。

想请此处的高手们帮忙解决这个问题,①或,如果修正此程序才能运行(我的系统winxp2,arcmap9.0+sp3);②或,请高手给出另一个更好的程序

thanks in advance!!

------------------------------------------------

1.1.1.   如何通过Polygon中的多个Ring创建多个Polygon

本例要实现的是如何在一个FeatureLayer中,选择Polygon(Feature)的Shape,如果它有多个Ring,则在另一个Polygon的图层上根据每一个Ring创建一个Polygon。

l 要点

取出Polygon中的每个Ring,声明一个IGeometryColletion接口,将其实例化为Polygon,利用此接口的方法AddGeometry生成一个Polygon,再用一个实例化为GeometryBag的IGeometryColletion接口变量来放置生成的每个Polygon。

l 程序说明

程序中添加了两个图层,两层都是Polylgon型。在第一个层选择有多个Ring的Polygon,再运行本函数,则在第二个层由这些多个Ring的Polygon创建生成了多个Polygon。

l 代码

Private Function PolygonsFromPolygonRings(pGeomColl As IGeometryCollection, bClone As Boolean) As _ IGeometryCollection

   Dim i                          As Long

   Dim pGeometryCollection        As IGeometryCollection

   Dim pTopologicalOperator       As ITopologicalOperator

   If Not pGeomColl Is Nothing Then

       If pGeomColl.GeometryCount > 0 Then

           Set PolygonsFromPolygonRings = New GeometryBag

           If bClone Then

               If TypeOf pGeomColl Is IClone Then

                   Dim pClone As IClone

                   Set pClone = pGeomColl

                   Set pGeomColl = pClone.Clone

               End If

           End If

           '为每个Ring创建一个新Polygon,将Polygon进行simplify后,放在GeometryBag中

           For i = 0 To pGeomColl.GeometryCount - 1

               If pGeomColl.Geometry(i).GeometryType = esriGeometryRing Then

                   Set pGeometryCollection = New Polygon

                   Set pTopologicalOperator = pGeometryCollection

                   pGeometryCollection.AddGeometry pGeomColl.Geometry(i)

                   pTopologicalOperator.Simplify

                   PolygonsFromPolygonRings.AddGeometry pGeometryCollection

               End If

           Next i

       End If

   End If

End Function

Public Sub PolygonRingsToPolygons()

   Dim pMxDocument                 As IMxDocument

   Dim pMap                        As IMap

   Dim pActiveView                 As IActiveView

   Dim pEnumFeature                As IEnumFeature

   Dim pFeature0                   As IFeature

   Dim pFeatureLayer0              As IFeatureLayer

   Dim pFeatureClass0              As IFeatureClass

   Dim pFeature1                   As IFeature

   Dim pFeatureLayer1              As IFeatureLayer

   Dim pFeatureClass1              As IFeatureClass

   Dim pPointCollection            As IPointCollection

   Dim pGeometryCollection         As IGeometryCollection

   Dim pDataSet                    As IDataset

   Dim pWorkspaceFactory           As IWorkspaceFactory

   Dim pWorkspaceEdit              As IWorkspaceEdit

   Dim pPolygon                    As IPolygon

   Dim pGeometryColPolygon         As IGeometryCollection

   Dim pGeometryColPolygonNew      As IGeometryCollection

   Dim pGeometryCollectionPolygon  As IgeometryCollection

   Dim lGeometryIndex              As Long

   Dim lPointFieldIndex            As Long

   

   On Error GoTo ErrorHanlder

   '得到当前层

   Set pMxDocument = ThisDocument

   Set pMap = pMxDocument.FocusMap

   Set pActiveView = pMap

   Set pPolygon1 = New Polygon

   Set pGeometryColPolygon = New Polygon

   Set pGeometryColPolygonNew = New Polygon

   Set pGeometryColPolygonNew1 = New Polygon

   Set pGeometryCollectionPolygon = New GeometryBag

   '得到0层和1层的FeatureClass

   Set pFeatureLayer0 = pMxDocument.FocusMap.Layer(0)

   Set pFeatureClass0 = pFeatureLayer0.FeatureClass

   Set pFeatureLayer1 = pMxDocument.FocusMap.Layer(1)

   Set pFeatureClass1 = pFeatureLayer1.FeatureClass

   '建立编辑工作区

   Set pDataSet = pFeatureClass1

   Set pWorkspaceFactory = New ShapefileWorkspaceFactory

   Set pWorkspaceEdit = pWorkspaceFactory.OpenFromFile(pDataSet.Workspace.PathName, 0)

   pWorkspaceEdit.StartEditOperation

   pWorkspaceEdit.StartEditing True

   '得到Feature

   Set pEnumFeature = pMxDocument.FocusMap.FeatureSelection

   Set pFeature0 = pEnumFeature.Next

   If pFeature0 Is Nothing Then

       MsgBox "Must have Select in Position 0"

       Exit Sub

   End If

'将一个Polygon上的多个Ring转换成多个Polygon

   Set pGeometryCollectionPolygon = PolygonsFromPolygonRings(pGeometryColPolygonNew, True)

   '将转换成的多个Polygon添加到第二层上

   For lGeometryIndex = 0 To pGeometryCollectionPolygon.GeometryCount - 1

       Set pFeature1 = pFeatureClass1.CreateFeature

       '把画的Polygon加到新建的Feature上

       Set pPolygon1 = pGeometryCollectionPolygon.Geometry(lGeometryIndex)

       Set pFeature1.Shape = pPolygon1

       '保存Feature

       pFeature1.Store

   Next

   pMxDocument.ActiveView.Refresh

   '停止编辑

   pWorkspaceEdit.StopEditOperation

   pWorkspaceEdit.StopEditing True

   Exit Sub

ErrorHanlder:

pWorkspaceEdit.AbortEditOperation

   MsgBox Err.Description

End Sub

喜欢0 评分0
默认头像

返回顶部