1. public class PolygonGapChecker : CheckProgressMessageSender, IChecker, ICheckProgressChangeEvent
  2. {
  3. private IFeatureLayer featureLayer;
  4. /// <summary>
  5. /// 待检查的面要素类图层
  6. /// </summary>
  7. public IFeatureLayer FeatureLayer
  8. {
  9. set
  10. {
  11. if (value != null)
  12. {
  13. if (value.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
  14. featureLayer = value;
  15. else
  16. throw new ArgumentException("要素类不是期望的类型,应是面要素类。");
  17. }
  18. else
  19. throw new ArgumentException("要素类对象传入的是null");
  20. }
  21. }
  22.  
  23. private int featureCount = -;
  24. /// <summary>
  25. /// 受检要素类的要素个数
  26. /// </summary>
  27. public int FeatureCount { get { return featureCount; } }
  28.  
  29. //private double distance = 0.2;
  30. /// <summary>
  31. /// 距离值,一个大于零的值
  32. /// </summary>
  33. public double Distance { set { } }
  34.  
  35. private double tolerance = 0.001;
  36. /// <summary>
  37. /// 容差值,一个大于零的值
  38. /// </summary>
  39. public double Tolerance { set {
  40. if (value <= )
  41. throw new ArgumentException("容差应是一个大于0的小数。");
  42. else
  43. tolerance = value;
  44. }
  45. }
  46.  
  47. //private double angle = 10.0;
  48. /// <summary>
  49. /// 角度值,一个大于零的值
  50. /// </summary>
  51. public double Angle { set { } }
  52.  
  53. private string workspacePath = string.Empty;
  54. /// <summary>
  55. /// FGDB或文件夹的路径
  56. /// </summary>
  57. public string WorkspacePath
  58. {
  59. set
  60. {
  61. if (System.IO.Directory.Exists(value))
  62. workspacePath = value;
  63. else
  64. throw new ArgumentException("给定FGDB或文件夹的路径不存在!");
  65. }
  66. }
  67.  
  68. private readonly CheckerType checkerType = CheckerType.面缝隙或孔洞;
  69. /// <summary>
  70. /// 检查类型
  71. /// </summary>
  72. public CheckerType CheckerType { get { return checkerType; } }
  73.  
  74. /// <summary>
  75. /// 检查方法
  76. /// </summary>
  77. /// <returns>检查结果要素类</returns>
  78. public IFeatureClass Check()
  79. {
  80.  
  81. IFeatureClass featureClass_cover;
  82. //IFeatureClass featureClass_erase;
  83. //IFeatureClass featureClass_erase_explode;
  84. IFeatureClass featureClass_result;
  85. IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactory();
  86. string featureClass_cover_Name=featureLayer.Name+"_cover.shp";
  87. string featureClass_erase_Name = $"{workspacePath}\\{featureLayer.Name}_erase.shp";
  88. string featureClass_result_Name = $"{workspacePath}\\{featureLayer.Name}_gap.shp";
  89. if (workspacePath.Split('.').Last().ToLower() == "gdb")
  90. {
  91. //确定要素类的名称,如workspace是文件地理数据库那么要素类名字最后没有有.shp。
  92. featureClass_cover_Name= featureClass_cover_Name.Replace(".shp", "");
  93. featureClass_erase_Name=featureClass_erase_Name.Replace(".shp", "");
  94. featureClass_result_Name=featureClass_result_Name.Replace(".shp", "");
  95. //若是文件地理数据库,应实例化FileGDBWorkspaceFactoryClass对象。
  96. workspaceFactory = new FileGDBWorkspaceFactoryClass();
  97. }
  98. IFeatureWorkspace featureWorkspace = workspaceFactory.OpenFromFile(workspacePath, ) as IFeatureWorkspace;
  99.  
  100. #region 创建Cover要素类,用于被擦除
  101. FeatureClassCreator featureClassCreator = new FeatureClassCreator(featureLayer, featureClass_cover_Name, esriGeometryType.esriGeometryPolygon, workspacePath);
  102. featureClass_cover = featureClassCreator.Create();
  103. OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Cover。");
  104. IPolygon polygon_cover = new PolygonClass();
  105. IPoint pointUpperLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.X - , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.Y- };
  106. IPoint pointUpperRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.X + , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.Y- };
  107. IPoint pointLowerRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.X + , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.Y+ };
  108. IPoint pointLowerLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.X - , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.Y+ };
  109. IPointCollection pointCollection_cover = polygon_cover as IPointCollection;
  110. pointCollection_cover.AddPoint(pointUpperLeft);
  111. pointCollection_cover.AddPoint(pointUpperRight);
  112. pointCollection_cover.AddPoint(pointLowerRight);
  113. pointCollection_cover.AddPoint(pointLowerLeft);
  114. pointCollection_cover.AddPoint(pointUpperLeft);
  115. IFeature feature_cover= featureClass_cover.CreateFeature();
  116. feature_cover.Shape = polygon_cover;
  117. feature_cover.Store();
  118. OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Cover要素,准备执行Erase。");
  119. #endregion
  120.  
  121. Geoprocessor.Geoprocessor gp = new Geoprocessor.Geoprocessor
  122. {
  123. AddOutputsToMap = false,
  124. OverwriteOutput = true
  125. };
  126. Erase erase = new Erase
  127. {
  128. in_features = $"{workspacePath}\\{featureClass_cover_Name}",
  129. erase_features = featureLayer,
  130. out_feature_class = featureClass_erase_Name,
  131. cluster_tolerance = this.tolerance,
  132. };
  133. gp.Execute(erase, null);
  134. OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Erase,准备执行Explode。");
  135. MultipartToSinglepart multipartToSinglepart = new MultipartToSinglepart
  136. {
  137. in_features = featureClass_erase_Name,
  138. out_feature_class = featureClass_result_Name
  139. };
  140. gp.Execute(multipartToSinglepart, null);
  141.  
  142. featureClass_result = featureWorkspace.OpenFeatureClass(featureClass_result_Name.Replace($"{workspacePath}\\", ""));
  143. CheckAuxiliaryHelper.SpatialSearchAndDeleteFeatures(featureClass_result, pointUpperLeft, esriSpatialRelEnum.esriSpatialRelIntersects);
  144. featureClass_result.DeleteField(featureClass_result.Fields.Field[featureClass_result.FindField("ORIG_FID")]);
  145. CheckAuxiliaryHelper.DeleteFeatureClass(featureClass_cover_Name, featureWorkspace);
  146. CheckAuxiliaryHelper.DeleteFeatureClass(featureClass_erase_Name, featureWorkspace);
  147. return featureClass_result;
  148. }
  149. private CheckProgressChangeEventHandler checkProgressChangeEventHandler;
  150. /// <summary>
  151. /// 进度改变事件
  152. /// </summary>
  153. public event CheckProgressChangeEventHandler CheckProgressChangeEvent
  154. {
  155. add
  156. {
  157. this.checkProgressChangeEventHandler += value;
  158. }
  159.  
  160. remove
  161. {
  162. this.checkProgressChangeEventHandler-=value;
  163. }
  164. }
  165.  
  166. }

ArcGIS 面要素缝隙孔洞检查代码 C# GP的更多相关文章

  1. ESLint 检查代码质量

    利用 ESLint 检查代码质量 其实很早的时候就想尝试 ESLint 了,但是很多次都是玩了一下就觉得这东西巨复杂,一执行检查就是满屏的error,简直是不堪入目,遂放弃.直到某天终于下定决心深入看 ...

  2. C#编译器怎么检查代码是否会执行

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#编译器怎么检查代码是否会执行.

  3. 利用ESLint检查代码质量

    1. ESLint ESLint 是一个插件化的 javascript 代码检测工具,它可以用于检查常见的 JavaScript 代码错误,也可以进行代码风格检查,这样我们就可以根据自己的喜好指定一套 ...

  4. 将位图导入为ArcGIS面要素

    本文根据笔者经验,介绍一种从位图图像导入ArcGIS称为要素的方法.这种方法适用于从现有出版物图片中获取地理信息的情况. 首先要说明的是,从位图导入要素是非常非常不精确的方式,如果有其它数据来源,那么 ...

  5. 在IDEA中停止和关闭SonarLint自动检查,手动运行SonarLint检查代码

    关闭SonarLint自动检查代码 有时敲一行代码SonarLint插件就会自动检查,让人感觉很不舒服,还会使电脑卡顿: 依次点击:File -> Settings 或直接Ctrl+Alt+S ...

  6. android 中的一些资源注解,让编译器帮你检查代码

    android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...

  7. 使用eslint检查代码质量

    1.安装 全局安装 npm install eslint -g 局部安装 npm install eslint --save 2.初始化一个配置文件 eslint --init 执行后根据项目需要回答 ...

  8. 项目git commit时卡主不良代码:husky让Git检查代码规范化工作

    看完 <前端规范之Git工作流规范(Husky + Commitlint + Lint-staged) https://www.cnblogs.com/Yellow-ice/p/15349873 ...

  9. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)

    一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...

随机推荐

  1. 搭建个人使用服务器-vultr

    内容来自https://www.noobyy.com/31.html  谢谢教程,侵权的话会立即删除! 1. 首先进入Vultr官网注册:https://www.vultr.com 注册完开始充值,我 ...

  2. Swift--Unmanaged使用

    Unmanaged使用 作者 Nate Cook 翻译者 Croath Liu 2015年4月13日        API 对于开发者来说不只是把功能点接口暴露出来而已,同时也传达给我们一些其他的信息 ...

  3. 大数据之hadoop框架知识

    https://blog.csdn.net/zytbft/article/details/79285500

  4. mysql Got a packet bigger than 'max_allowed_packet' bytes

    背景 数据库备份执行SQL文件时,执行到图片表插入图片数据时错误: 错误提示:Got a packet bigger than 'max_allowed_packet' bytes 原因分析及解决 m ...

  5. Web核心之Response对象

    http协议的响应部分 格式: HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 Content-Length: 101 Date: Wed, ...

  6. Delphi Win API 函数 [ ShellAPI ] ShellExecute 函数

    引用单元:uses ShellAPI; 函数原型:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory ...

  7. python学习笔记(二)列表操作

    列表及列表操作: 列表是最常用的数据类型之一,列表也叫数组,列表定义,使用[]即可:列表里面可以再套列表,一个里面套一个列表,叫二维数组:一个里面套一个列表,里面的列表再套一个列表,这个叫三位数组,套 ...

  8. php pi()函数 语法

    php pi()函数 语法 pi()函数是什么意思? php pi()函数用于获取圆周率值,语法是pi(),这个函数只是单纯的用来获取圆周率值深圳大理石平台 作用:获取圆周率值 语法:pi() 参数: ...

  9. 数据挖掘:周期性分析SMCA算法

    数据挖掘:周期性分析SMCA算法 原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978 算法介绍 以时间顺序挖掘周期性的模式 ...

  10. 【Linux】端口反查进程

    平时时常遇到端口占用的情况,又不知道端口是哪个服务启的. 本文以80端口为例. [root@localhost jenkins]# netstat -tunlp | grep 80 tcp6 0 0 ...