ArcGIS 面要素缝隙孔洞检查代码 C# GP
public class PolygonGapChecker : CheckProgressMessageSender, IChecker, ICheckProgressChangeEvent
{
private IFeatureLayer featureLayer;
/// <summary>
/// 待检查的面要素类图层
/// </summary>
public IFeatureLayer FeatureLayer
{
set
{
if (value != null)
{
if (value.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
featureLayer = value;
else
throw new ArgumentException("要素类不是期望的类型,应是面要素类。");
}
else
throw new ArgumentException("要素类对象传入的是null");
}
} private int featureCount = -;
/// <summary>
/// 受检要素类的要素个数
/// </summary>
public int FeatureCount { get { return featureCount; } } //private double distance = 0.2;
/// <summary>
/// 距离值,一个大于零的值
/// </summary>
public double Distance { set { } } private double tolerance = 0.001;
/// <summary>
/// 容差值,一个大于零的值
/// </summary>
public double Tolerance { set {
if (value <= )
throw new ArgumentException("容差应是一个大于0的小数。");
else
tolerance = value;
}
} //private double angle = 10.0;
/// <summary>
/// 角度值,一个大于零的值
/// </summary>
public double Angle { set { } } private string workspacePath = string.Empty;
/// <summary>
/// FGDB或文件夹的路径
/// </summary>
public string WorkspacePath
{
set
{
if (System.IO.Directory.Exists(value))
workspacePath = value;
else
throw new ArgumentException("给定FGDB或文件夹的路径不存在!");
}
} private readonly CheckerType checkerType = CheckerType.面缝隙或孔洞;
/// <summary>
/// 检查类型
/// </summary>
public CheckerType CheckerType { get { return checkerType; } } /// <summary>
/// 检查方法
/// </summary>
/// <returns>检查结果要素类</returns>
public IFeatureClass Check()
{ IFeatureClass featureClass_cover;
//IFeatureClass featureClass_erase;
//IFeatureClass featureClass_erase_explode;
IFeatureClass featureClass_result;
IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactory();
string featureClass_cover_Name=featureLayer.Name+"_cover.shp";
string featureClass_erase_Name = $"{workspacePath}\\{featureLayer.Name}_erase.shp";
string featureClass_result_Name = $"{workspacePath}\\{featureLayer.Name}_gap.shp";
if (workspacePath.Split('.').Last().ToLower() == "gdb")
{
//确定要素类的名称,如workspace是文件地理数据库那么要素类名字最后没有有.shp。
featureClass_cover_Name= featureClass_cover_Name.Replace(".shp", "");
featureClass_erase_Name=featureClass_erase_Name.Replace(".shp", "");
featureClass_result_Name=featureClass_result_Name.Replace(".shp", "");
//若是文件地理数据库,应实例化FileGDBWorkspaceFactoryClass对象。
workspaceFactory = new FileGDBWorkspaceFactoryClass();
}
IFeatureWorkspace featureWorkspace = workspaceFactory.OpenFromFile(workspacePath, ) as IFeatureWorkspace; #region 创建Cover要素类,用于被擦除
FeatureClassCreator featureClassCreator = new FeatureClassCreator(featureLayer, featureClass_cover_Name, esriGeometryType.esriGeometryPolygon, workspacePath);
featureClass_cover = featureClassCreator.Create();
OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Cover。");
IPolygon polygon_cover = new PolygonClass();
IPoint pointUpperLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.X - , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.Y- };
IPoint pointUpperRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.X + , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.Y- };
IPoint pointLowerRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.X + , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.Y+ };
IPoint pointLowerLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.X - , Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.Y+ };
IPointCollection pointCollection_cover = polygon_cover as IPointCollection;
pointCollection_cover.AddPoint(pointUpperLeft);
pointCollection_cover.AddPoint(pointUpperRight);
pointCollection_cover.AddPoint(pointLowerRight);
pointCollection_cover.AddPoint(pointLowerLeft);
pointCollection_cover.AddPoint(pointUpperLeft);
IFeature feature_cover= featureClass_cover.CreateFeature();
feature_cover.Shape = polygon_cover;
feature_cover.Store();
OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Cover要素,准备执行Erase。");
#endregion Geoprocessor.Geoprocessor gp = new Geoprocessor.Geoprocessor
{
AddOutputsToMap = false,
OverwriteOutput = true
};
Erase erase = new Erase
{
in_features = $"{workspacePath}\\{featureClass_cover_Name}",
erase_features = featureLayer,
out_feature_class = featureClass_erase_Name,
cluster_tolerance = this.tolerance,
};
gp.Execute(erase, null);
OnCheckProgresChange(checkProgressChangeEventHandler, ">>>成功创建Erase,准备执行Explode。");
MultipartToSinglepart multipartToSinglepart = new MultipartToSinglepart
{
in_features = featureClass_erase_Name,
out_feature_class = featureClass_result_Name
};
gp.Execute(multipartToSinglepart, null); featureClass_result = featureWorkspace.OpenFeatureClass(featureClass_result_Name.Replace($"{workspacePath}\\", ""));
CheckAuxiliaryHelper.SpatialSearchAndDeleteFeatures(featureClass_result, pointUpperLeft, esriSpatialRelEnum.esriSpatialRelIntersects);
featureClass_result.DeleteField(featureClass_result.Fields.Field[featureClass_result.FindField("ORIG_FID")]);
CheckAuxiliaryHelper.DeleteFeatureClass(featureClass_cover_Name, featureWorkspace);
CheckAuxiliaryHelper.DeleteFeatureClass(featureClass_erase_Name, featureWorkspace);
return featureClass_result;
}
private CheckProgressChangeEventHandler checkProgressChangeEventHandler;
/// <summary>
/// 进度改变事件
/// </summary>
public event CheckProgressChangeEventHandler CheckProgressChangeEvent
{
add
{
this.checkProgressChangeEventHandler += value;
} remove
{
this.checkProgressChangeEventHandler-=value;
}
} }


ArcGIS 面要素缝隙孔洞检查代码 C# GP的更多相关文章
- ESLint 检查代码质量
利用 ESLint 检查代码质量 其实很早的时候就想尝试 ESLint 了,但是很多次都是玩了一下就觉得这东西巨复杂,一执行检查就是满屏的error,简直是不堪入目,遂放弃.直到某天终于下定决心深入看 ...
- C#编译器怎么检查代码是否会执行
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#编译器怎么检查代码是否会执行.
- 利用ESLint检查代码质量
1. ESLint ESLint 是一个插件化的 javascript 代码检测工具,它可以用于检查常见的 JavaScript 代码错误,也可以进行代码风格检查,这样我们就可以根据自己的喜好指定一套 ...
- 将位图导入为ArcGIS面要素
本文根据笔者经验,介绍一种从位图图像导入ArcGIS称为要素的方法.这种方法适用于从现有出版物图片中获取地理信息的情况. 首先要说明的是,从位图导入要素是非常非常不精确的方式,如果有其它数据来源,那么 ...
- 在IDEA中停止和关闭SonarLint自动检查,手动运行SonarLint检查代码
关闭SonarLint自动检查代码 有时敲一行代码SonarLint插件就会自动检查,让人感觉很不舒服,还会使电脑卡顿: 依次点击:File -> Settings 或直接Ctrl+Alt+S ...
- android 中的一些资源注解,让编译器帮你检查代码
android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...
- 使用eslint检查代码质量
1.安装 全局安装 npm install eslint -g 局部安装 npm install eslint --save 2.初始化一个配置文件 eslint --init 执行后根据项目需要回答 ...
- 项目git commit时卡主不良代码:husky让Git检查代码规范化工作
看完 <前端规范之Git工作流规范(Husky + Commitlint + Lint-staged) https://www.cnblogs.com/Yellow-ice/p/15349873 ...
- ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...
随机推荐
- 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)
前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...
- 使用join和CountDownLatch来等待线程结束
1.join方法的实现 join只能在start()之后调用, join 某个线程A,会使当前线程B进入等待,直到线程A结束生命周期(isAlive()==false) ,或者达到给定的时间. 在此期 ...
- python中单下划线(_)和双下划线(__)的特殊用法
单下划线开头(_) 在模块中使用单下划线开头 模块中使用单下划线(_)开头定义函数.全局变量和类不能被模块外部以: from module import *形式导入. 但可以用:from module ...
- 八皇后问题 -- python面向对象解法
# [8*8棋盘八皇后问题] class Queen: def __init__(self, row, col): self.row = row self.col = col self.pos = ( ...
- linux shell 指令
一.文件比较运算符 1. e filename 如果 filename存在,则为真 如: [ -e /var/log/syslog ] 2. -d filename 如果 filename为目录,则为 ...
- 【串线篇】sql映射文件-分布查询(上)association 1-1
1.场景 1把钥匙带1把锁 JavaBean:private Lock lock;//当前钥匙能开哪个锁: 1). interface KeyDao: public Key getKeyByIdSim ...
- instanceof是Java的一个二元操作符(运算符)
instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...
- PHP curl_exec函数
curl_exec — 执行一个cURL会话 说明 mixed curl_exec ( resource $ch ) 执行给定的cURL会话. 这个函数应该在初始化一个cURL会话并且全部的选项都被设 ...
- PHP curl_escape函数
curl_escape — 对给定的字符串进行URL编码. 说明 string curl_escape ( resource $ch , string $str ) 该函数对给定的字符串进行URL编码 ...
- 4412 RS485
一.485硬件原理 差分对传输数据的原理 IO数据的传输→差分对 rs232传输的距离在15米以下,RS485传输距离是几十米到1000米以上 为什么485可以传输这么远 差分对的机制可以降低电磁场的 ...