Arcgis二次开发,道路合并C#

情况说明:

客户提供了道路面数据,但是同样名称的道路有多个Feature,也就是说一条道路分成了多个对象,由于系统的要求需要交叉口定位功能,需要将同名称的道路合并成一个对象。故在网上查询方法,做以下总结,但是有点小问题,执行一次只能合并一条记录,如果说有3条相同的,第一次执行变成2条,仍需在执行一次。由于多次执行能够达到系统要求的数据,故没有做细节更改。

网上查询到的VB代码:

先通过IQueryFilter接口查找所有路名相同的道路实体,然后通过ITopologicalOperator接口的Union方法合并Geometry

Dim pQueryFilter As IQueryFilter
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureCursor As IFeatureCursor
Dim pScFeature As IFeature
Dim pDstFeature As IFeature
Dim pTopo As ITopologicalOperator
Dim pGeometry As IGeometry
Dim pFeature As IFeature
Set pFeatureLayer = AxMapControl1.Map.layer(0)
Set pQueryFilter = New QueryFilter
pQueryFilter.WhereClause = "Name='***路'"
Set pFeatureCursor = pFeatureLayer.Search(pQueryFilter, False)
Set pScFeature = pFeatureCursor.NextFeature
Do While Not pScFeature Is Nothing
Set pDstFeature = pFeatureCursor.NextFeature
If Not pDstFeature Is Nothing Then
If pDstFeature.Shape.IsEmpty Then
pDstFeature.Delete
Else
Set pTopo = pDstFeature.Shape
pTopo.Simplify
Set pTopo = pScFeature.Shape
pTopo.Simplify
Set pGeometry = pTopo.Union(pDstFeature.Shape)
Set pScFeature.Shape = pGeometry
pScFeature.Store
pDstFeature.Delete
End If
Else
Exit Do
End If
Loop

 

 

由于本人的项目是C#,在根据自己的情况,修改如下:

string roadname;
ITopologicalOperator pTopo;
IGeometry pGeometry;
IFeatureCursor pFCursor;
IFeatureClass pFCls;
IFeatureLayer pFLayer = JJComFun.GetFLyrByName(hook.FocusMap, "道路数据");// "道路数据"为原始道路数据的中文表名称
pFCls = pFLayer.FeatureClass;
ISpatialFilter pSFilter = new SpatialFilterClass();
for (int j = 0; j < this.grid.Rows-1; j++)
{

IFeature pFeature;
IFeature SpFeature;
roadname = this.grid.Cell(j+1, 1).Text;
pSFilter.WhereClause = "STNAME='"+roadname+"'";
IQueryFilter pQFilter;
pQFilter = pSFilter;
pFCursor = pFCls.Search(pQFilter, false);

SpFeature = pFCursor.NextFeature();

pFeature = pFCursor.NextFeature();

pTopo = (ITopologicalOperator)pFeature.Shape;
pTopo = (ITopologicalOperator)SpFeature.Shape;
pGeometry = pTopo.Union(pFeature.Shape);//合并

SpFeature.Shape = pGeometry;
SpFeature.Store();
pFeature.Delete();
if (pFCursor != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFCursor);

}
MessageBox.Show("完成");

 

该功能主要利用的ITopologicalOperator这个接口,Union方法,具体可以查看官网上的内容。

 

posted @ 2016-07-07 15:15  开发界的小菜鸟  阅读(1392)  评论(0编辑  收藏  举报