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 = -1;
        /// <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 <= 0 )
                    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, 0) 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 - 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperLeft.Y-100 };
            IPoint pointUpperRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.X + 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.UpperRight.Y-100 };
            IPoint pointLowerRight = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.X + 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerRight.Y+100 };
            IPoint pointLowerLeft = new PointClass { X = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.X - 100, Y = (featureLayer.FeatureClass as IGeoDataset).Extent.LowerLeft.Y+100 };
            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;
            }
        }

    }

原文地址:https://www.cnblogs.com/yzhyingcool/p/11963660.html

时间: 2024-10-09 09:04:49

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

将位图导入为ArcGIS面要素

本文根据笔者经验,介绍一种从位图图像导入ArcGIS称为要素的方法.这种方法适用于从现有出版物图片中获取地理信息的情况. 首先要说明的是,从位图导入要素是非常非常不精确的方式,如果有其它数据来源,那么就不应该采用此方法. 另外,如果位图包含的内容相对简单,区域结构紧凑不零散,则可以考虑ArcMap绘制地图,而不用此方法. 为让表述更直观,笔者从百度卫星地图截取了 辽宁省康平县 西泡子水库附近的区域,作为操作的说明. 00_orign 1. 制作灰度图 为便于在ArcMap中处理,将原始图像的色彩

连接Access数据库代码,以及.Net4.0版本的报表查询代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using data1; using DA1; using data5; using DA5; namespace 连接仓库.管理员

三大框架中模糊查询代码

js获取查询条件,并去后台查询 function queryByName(){                    //获取查询条件的用户名                    var queryName=$("#queryName").val();                    alert(queryName);                    //进行后台跳转                    window.location.href="<%=

将一个php的一个查询代码改成go语言

一个朋友的网站用php开发的,总是感觉慢. 我将其中的查询sql server 代码改成go语言 (有7000多条记录) 都能感觉到速度比以前快多了. 努力继续学go语言吧. php没有使用任何框架. package main import ( _ "github.com/lunny/godbc" "github.com/go-xorm/xorm" "net/http" "fmt" ) func testweb(w http.

ArcGIS Engine开发之空间查询

空间查询功能是通过用户选择的空间几何体以及该几何体与当前地图中要素之间的几何关系进行空间查找,从而得到查询结果的操作. 相关类与接口 空间查询相关的类主要是SpatialFilter类,其实现的接口主要为ISpatialFilter接口.SpatialFilter类是空间关系过滤类,ISpatialFilter接口的成员主要用于返回和修改数据过滤器所使用的空间关系.ISpatialFilter接口同时包含了空间和属性两种查询约束,它继承了IQueryFilter接口. 1.Geometry属性:

ArcGIS 创建要素时提示“表已经被注册(table already registered)”

今天一位实施大哥在ArcCatalog中要重建一个要素类,所以就在ArcCatalog中连接上Oracle数据库,直接删除了要素类,然后重新创建了一个新的要素类,可是却报错“表已经被创建”,并提示不可以在'sde_table_registry'表中插入重复的键值,记得以前碰到过这种状态,删除的不彻底,虽然将数据库中的数据表删除了,可以在sde用户下的元数据表中的记录没有被清除,导致再次创建时报错. 既然如此,就到元数据表中将相关的信息删除掉好了,所以就到sde用户下删除了table_regist

ArcGIS创建要素类

在使用ARCGIS软件进行工作时,免不了要建立地理数据库和要素类之类的.一下是我创建文件地理数据库并在数据库中创建要素类写相关步骤: 1.启动软件,可以使用ARCCatalog直接进行创建也可以使用ArcMap中ARCCatalog窗口进行创建.总之需要用到ARCCatalog这个数据管理工具:这里我们直接启动ArcMap: 2.在ArcCatalog窗口文件连接中展开到你需要创建的位置的文件夹,右键单击选择新建——文件地理数据库,创建完成可进行重命名: 3.选择你创建好的文件地理数据,右键单击

MVC 对中国省市区的联动查询代码。

Model里的代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Mvcshengshiqu.Models { public class ChinaBF { private masterDataContext _Context = new masterDataContext(); public List<ChinaStates> Select() {

ArcGIS Engine要素渲染和专题图制作(转)

摘要:Feature的常用的绘制方法包括:1.简单绘制:2.唯一值绘制/多字段唯一值绘制:3.点密度/多字段点密度绘制:4.数据分级绘制:5.质量图(饼图/直方图): 6.按比例尺渲染:7.比例符号渲染. 一.Feature的基本渲染方法    Feature的常用的绘制方法包括:1.简单绘制:2.唯一值绘制/多字段唯一值绘制:3.点密度/多字段点密度绘制:4.数据分级绘制:5.质量图(饼图/直方图): 6.按比例尺渲染:7.比例符号渲染.  1.简单渲染     简单渲染是ArcEngine的