|
阅读:1496回复:1
[转帖]如何从Polygon创建Polyline
<P >本例要实现的功能是根据一个FeatureLayer中被选择的一个Polygon生成一条Polyline,并把该Polyline做为一个新的Feature保存在一个Polyline类型的FeatureLayer中。</P>
<P >l 要点</P> <P >通过所选择Polygon创建一个新的Polyline,即要根据Polylgon中的每个Ring生成相应的Path,程序中用到ISegmentCollection接口,将它实例化为Path,利用它的方法AddSegmentCollection实现了这一目的。</P> <P >l 程序说明</P> <P >程序中添加了两个图层,第一图层Polylgon型,第二图层Polyline型。因为Polygon型的图层中不能放Polyline型的数据,所以多增加一个Polyline层,以便将通过Polygon来创建的一个新的Polyline显示到上面,使得程序运行结果清晰明了。</P> <P >函数PolygonToPolyline(ByRef pPolylgon As IPolygon)中, pSegmentCollectionPath.AddSegmentCollection创建了一个新Ring,其中pSegmentCollectionPath是一个实例化为Ring的ISegmentCollection接口变量。</P> <P >l 代码</P> <TABLE height=43 width=541 align=center border=0><!--DWLayoutTable--> <TR> <TD vAlign=top width=535 height=75> <P >Private Function PolygonToPolyline(ByRef pPolygon As IPolygon) As IGeometryCollection<BR> Dim pGeometryCollectionPolygon As IGeometryCollection<BR> Dim pClone As IClone<BR> Dim pSegmentCollectionPath As ISegmentCollection<BR> Dim i As Long<BR> On Error GoTo ErrorHander<BR> '创建一个新的Polyline geometry.<BR> Set PolygonToPolyline = New Polyline<BR> ' 克隆即将要操作的Polygon<BR> Set pClone = pPolygon<BR> Set pGeometryCollectionPolygon = pClone.Clone<BR> '把Polygon的每个Ring创建为一个新的Path,并把Path增加到一个新的Polyline<BR> For i = 0 To pGeometryCollectionPolygon.GeometryCount - 1<BR> Set pSegmentCollectionPath = New Path<BR> pSegmentCollectionPath.AddSegmentCollection pGeometryCollectionPolygon.Geometry(i)<BR> PolygonToPolyline.AddGeometry pSegmentCollectionPath<BR> Next i<BR> Exit Function<BR>ErrorHander:<BR> MsgBox Err.Description<BR>End Function </P> <P >Public Sub CreateNewPolylineFromPolygonGraphic()<BR> Dim pMxDocument As IMxDocument<BR> Dim pEnumFeature As IEnumFeature<BR> Dim pFeature0 As IFeature<BR> Dim pFeatureClass0 As IFeatureClass<BR> Dim pFeatureLayer0 As IFeatureLayer<BR> Dim pFeature1 As IFeature<BR> Dim pFeatureClass1 As IFeatureClass<BR> Dim pFeatureLayer1 As IFeatureLayer<BR> Dim pDataSet As IDataset<BR> Dim pWorkspaceFactory As IWorkspaceFactory<BR> Dim pWorkspaceEdit As IWorkspaceEdit<BR> Dim pPolygon As IPolygon<BR> Dim pPolyline As IPolyline<BR> Dim pMap As IMap<BR> Dim pActiveView As IActiveView<BR> On Error GoTo ErrorHander<BR> Set pActiveView = pMap<BR> Set pMxDocument = ThisDocument<BR> Set pMap = pMxDocument.FocusMap<BR> '得到0,1层的FeatureClass,pFeatureClass0,pFeatureClass1<BR> Set pFeatureLayer0 = pMxDocument.FocusMap.Layer(0)<BR> Set pFeatureClass0 = pFeatureLayer0.FeatureClass<BR> Set pFeatureLayer1 = pMxDocument.FocusMap.Layer(1)<BR> Set pFeatureClass1 = pFeatureLayer1.FeatureClass<BR> '创建一个编辑工作区<BR> Set pDataSet = pFeatureClass1<BR> Set pWorkspaceFactory = New ShapefileWorkspaceFactory<BR> Set pWorkspaceEdit = pWorkspaceFactory.OpenFromFile(pDataSet.Workspace.PathName, 0)<BR> '开始编辑<BR> pWorkspaceEdit.StartEditOperation<BR> pWorkspaceEdit.StartEditing True<BR> '从当前层上得到选择的Feature<BR> Set pEnumFeature = pMxDocument.FocusMap.FeatureSelection<BR> Set pFeature0 = pEnumFeature.Next<BR> '循环Feature<BR> While Not pFeature0 Is Nothing<BR> If pFeature0.ShapeCopy.GeometryType = esriGeometryPolygon Then<BR> 'Copy当前层上的一个Featureµ到Polygon<BR> Set pPolygon = pFeature0.ShapeCopy<BR> '将Polygon创建为Polyline<BR> Set pPolyline = PolygonToPolyline(pPolygon)<BR> '将创建的Polyline,加到Polyline层上,新建的Feature中<BR> Set pFeature1 = pFeatureClass1.CreateFeature<BR> Set pFeature1.Shape = pPolyline<BR> '保存Feature<BR> pFeature1.Store<BR> Else<BR> MsgBox "Must have Polygon in position 0"<BR> Exit Sub<BR> End If<BR> Set pFeature0 = pEnumFeature.Next<BR> Wend<BR> pMxDocument.ActiveView.Refresh<BR> '停止编辑<BR> pWorkspaceEdit.StopEditOperation<BR> pWorkspaceEdit.StopEditing True<BR> Exit Sub<BR>ErrorHander:<BR>pWorkspaceEdit. AbortEditOperation<BR>MsgBox Err.Description<BR>End Sub</P></TD></TR></TABLE> |
|
|
|
1楼#
发布于:2005-07-20 22:32
<P> 那么如何从一个PolyLine的shape文件挑选出闭合或近似闭合的PolyLine转成polygon的shape文件呢?</P>
|
|