柳州网络网站建设,北京网站建设建站公司,山东信达建设工程有限公司网站,北京商城网站建设1、前言
很久没写ArcEngine的内容了#xff0c;正好这次有同志提了一个问题#xff1a;如何用ArcEngine实现批量提取面要素之间的公共边#xff1f;捣鼓了半天总算是解决了#xff0c;下面就来说一说解决思路。
2、ArcMap的实现方法
首先准备一份测试数据#xff0c;如…1、前言
很久没写ArcEngine的内容了正好这次有同志提了一个问题如何用ArcEngine实现批量提取面要素之间的公共边捣鼓了半天总算是解决了下面就来说一说解决思路。
2、ArcMap的实现方法
首先准备一份测试数据如下图所示 提取公共边用ArcMap做非常简单只需要打开Analysis Tools下的Intersect相交工具将Output Type设置为LINE运行工具马上就能得到面要素的公共边。如下图所示 结果如下图所示 3、方法一调用GP提取公共边
既然已经知道了在ArcMap中如何使用Intersect工具来提取公共边那么我们就可以在ArcEngine中调用GP工具来实现。不过需要注意ArcEngine代码初始化时需要设置License的权限代码如下
using ESRI.ArcGIS.Geoprocessor;
using System;
using System.Windows.Forms;namespace App
{public partial class MainForm : Form{public MainForm(){InitializeComponent();}private void btn_Click(object sender, EventArgs e){// 设置参数ESRI.ArcGIS.AnalysisTools.Intersect tool new ESRI.ArcGIS.AnalysisTools.Intersect();tool.in_features C:\Users\Virtual\Desktop\data\面.shp;tool.output_type LINE;tool.out_feature_class C:\Users\Virtual\Desktop\data\线.shp;// 执行GPGeoprocessor gp new Geoprocessor();gp.OverwriteOutput true;gp.Execute(tool, null);}}
}运行结果如下图所示 4、方法二根据空间关系及拓扑工具提取公共边
获取两个面之间的公共边分以下两步
利用IRelationalOperator判断两个Polygon是否为Touches关系如果是Touches关系利用ITopologicalOperator的Intersect方法提取相交部分即可
代码如下
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using System;
using System.Collections.Generic;
using System.Windows.Forms;namespace App
{public partial class MainForm : Form{public MainForm(){InitializeComponent();}private void btn_Click(object sender, EventArgs e){IFeatureClass pFeatureClass GetFeatureClass(C:\Users\Virtual\Desktop\data\面.shp);ListIPolygon polygons GetPolygonList(pFeatureClass);ListIPolyline polylines GetPolylineList(polygons);CreateFeatureClass(polylines, C:\Users\Virtual\Desktop\data\线.shp);}// 获取要素类private IFeatureClass GetFeatureClass(string filePath){IWorkspaceFactory pWorkspaceFactory new ShapefileWorkspaceFactory();IWorkspaceFactoryLockControl pWorkspaceFactoryLockControl pWorkspaceFactory as IWorkspaceFactoryLockControl;if (pWorkspaceFactoryLockControl.SchemaLockingEnabled){pWorkspaceFactoryLockControl.DisableSchemaLocking();}IWorkspace pWorkspace pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);IFeatureWorkspace pFeatureWorkspace pWorkspace as IFeatureWorkspace;IFeatureClass pFeatureClass pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileName(filePath));return pFeatureClass;}// 获取Polygon集合private ListIPolygon GetPolygonList(IFeatureClass pFeatureClass){IFeatureCursor pFeatureCursor pFeatureClass.Search(null, true);IFeature pFeature pFeatureCursor.NextFeature();if (pFeature null){return null;}// 遍历游标ListIPolygon list new ListIPolygon();while (pFeature ! null){list.Add(pFeature.ShapeCopy as IPolygon);pFeature pFeatureCursor.NextFeature();}// 返回System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);return list;}// 获取Polyline集合private ListIPolyline GetPolylineList(ListIPolygon polygons){ListIPolyline list new ListIPolyline();for (int i 0; i polygons.Count; i){for (int j 0; j polygons.Count; j){if (i j){continue;}IRelationalOperator pRelationalOperator polygons[i] as IRelationalOperator;if (pRelationalOperator.Touches(polygons[j])){ITopologicalOperator pTopologicalOperator polygons[i] as ITopologicalOperator;IGeometry pIntersectGeometry pTopologicalOperator.Intersect(polygons[j], esriGeometryDimension.esriGeometry1Dimension);list.Add(pIntersectGeometry as IPolyline);}}}return list;}// 创建要素类private IFeatureClass CreateFeatureClass(ListIPolyline polylines, string filePath){// 设置空间参考IGeometryDef pGeometryDef new GeometryDef();IGeometryDefEdit pGeometryDefEdit pGeometryDef as IGeometryDefEdit;pGeometryDefEdit.GeometryType_2 esriGeometryType.esriGeometryPolyline;pGeometryDefEdit.HasM_2 false;pGeometryDefEdit.HasZ_2 false;pGeometryDefEdit.SpatialReference_2 axMapControl1.SpatialReference;// 字段集合IFields pFields new Fields();IFieldsEdit pFieldsEdit pFields as IFieldsEdit;// ShapeIField pField new Field();IFieldEdit pFieldEdit pField as IFieldEdit;pFieldEdit.Type_2 esriFieldType.esriFieldTypeGeometry;pFieldEdit.GeometryDef_2 pGeometryDef;pFieldEdit.AliasName_2 Shape;pFieldEdit.Name_2 Shape;pFieldEdit.IsNullable_2 false;pFieldEdit.Required_2 true;pFieldsEdit.AddField(pField);// 创建要素类IWorkspaceFactory pWorkspaceFactory new ShapefileWorkspaceFactory();IWorkspace pWorkspace pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);IFeatureWorkspace pFeatureWorkspace pWorkspace as IFeatureWorkspace;IFeatureClass pFeatureClass pFeatureWorkspace.CreateFeatureClass(System.IO.Path.GetFileName(filePath), pFields, null, null, esriFeatureType.esriFTSimple, Shape, );// 要素游标IFeatureBuffer pFeatureBuffer pFeatureClass.CreateFeatureBuffer();IFeatureCursor pFeatureCursor pFeatureClass.Insert(true);for (int i 0; i polylines.Count; i){pFeatureBuffer.Shape polylines[i];pFeatureCursor.InsertFeature(pFeatureBuffer);}pFeatureCursor.Flush();// 返回System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureBuffer);System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);return pFeatureClass;}}
}运行结果如下图所示 5、结语
本文主要介绍了ArcEngine中提取公共边的实现方法。其实对于第二种方法即利用空间关系和拓扑工具提取公共边我个人是不太满意的因为这是纯粹的暴力解法数据量一旦较多效率肯定是个大问题。可惜不知道ESRI是怎么实现的有了解的同志也可以讲讲这个问题最优的解决方法是什么。