当前位置: 首页 > news >正文

网站规划与建设与安全管理网站设计公司 知道万维科技

网站规划与建设与安全管理,网站设计公司 知道万维科技,爱奇艺做视频网站的,做生鲜的网站1、前言 很久没写ArcEngine的内容了,正好这次有同志提了一个问题:如何用ArcEngine实现批量提取面要素之间的公共边?捣鼓了半天总算是解决了,下面就来说一说解决思路。 2、ArcMap的实现方法 首先准备一份测试数据,如…

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、方法二:根据空间关系及拓扑工具提取公共边

获取两个面之间的公共边分以下两步:

  1. 利用IRelationalOperator判断两个Polygon是否为Touches关系?
  2. 如果是Touches关系,利用ITopologicalOperatorIntersect方法提取相交部分即可

代码如下:

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");List<IPolygon> polygons = GetPolygonList(pFeatureClass);List<IPolyline> 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 List<IPolygon> GetPolygonList(IFeatureClass pFeatureClass){IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true);IFeature pFeature = pFeatureCursor.NextFeature();if (pFeature == null){return null;}// 遍历游标List<IPolygon> list = new List<IPolygon>();while (pFeature != null){list.Add(pFeature.ShapeCopy as IPolygon);pFeature = pFeatureCursor.NextFeature();}// 返回System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);return list;}// 获取Polyline集合private List<IPolyline> GetPolylineList(List<IPolygon> polygons){List<IPolyline> list = new List<IPolyline>();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(List<IPolyline> 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是怎么实现的,有了解的同志也可以讲讲这个问题最优的解决方法是什么。

http://www.yayakq.cn/news/874169/

相关文章:

  • 网站后台管理权限设计网站缩放代码
  • 外卖网站制作网络营销公司取名字大全
  • 比特币矿池网站怎么做全网营销系统是干什么的
  • 网站定制牛七科技安装wordpress+000
  • 网站维护指导深圳几个区的分布图
  • 南昌做兼职的网站微网站不能分享朋友圈
  • 如何自己建设网站电子商务公司注册资金最低多少
  • 云服务器搭建个人网站html5企业网站开发
  • 营销型网站 开源程序泉州台商区建设局网站
  • 企业网站seo数据网络技术课程
  • 同城型网站开发网站模板怎么设计
  • 江汉网站建设WordPress关闭邮箱通知
  • 腾讯云怎么做网站做网站后台程序是怎么来的
  • 国际知名平面设计网站网络营销渠道具有交互性的特点
  • 同安网站建设环球影城可以寄存东西吗
  • vipkid网站开发团队有哪些网站建设工作室
  • 如何做网站搜索栏实现网站开发
  • 推荐微信网站建设免费cms建站五指
  • 快速建站教程兰州网站建设报价
  • 寿光网站建设定制jsp网站购物车怎么做
  • 备案公司网站建设方案书凡科网做的网站保存后就上传了吗
  • 网站的营销与推广wordpress批量修改文章内的代码
  • 做音乐网站之前的准备wordpress网站底部导航代码
  • 盐城网站优化seo推广的全称是
  • 绍兴 网站制作平面设计作品欣赏官网
  • 好的flash网站seo专业推广
  • 百度收录了我新网站的2篇文章了wordpress文档结构
  • 茶叶响应式网站自己服务器建设网站
  • 微电影网站源码xiazai三联网站建设价格
  • 哪个网站买域名便宜aspnet网站开发实例视频