gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1496回复:1

[转帖]如何从Polygon创建Polyline

楼主#
更多 发布于:2005-07-20 22:15
<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&micro;到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>
喜欢0 评分0
GIS麦田守望者,期待与您交流。
shixcn
外卖仔
外卖仔
  • 注册日期2003-11-02
  • 发帖数73
  • QQ
  • 铜币180枚
  • 威望0点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
1楼#
发布于:2005-07-20 22:32
<P>   那么如何从一个PolyLine的shape文件挑选出闭合或近似闭合的PolyLine转成polygon的shape文件呢?</P>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部