【gis插件】arcgis插件界址点编号工具、C#实现思路(附插件下载链接)

数据:界址点图层、宗地图层

要求:找出宗地对应的所有界址点号,对这些界址点号以J1开始按顺序排列


        要找出宗地所对应的所有界址点号,这里只要执行一个标识 即可得到这样得到的结果。

难点在于对界址点的编号,经过检查,这些界址点存在明显的乱序,比如这样:132564 

 图形复杂,太复杂了,这种图形,用arcgis无论怎么排序、编号,它编号都得乱哇。 

不得已只能动用C#的神秘力量

第一步做一个标识的操作,让所有的界址点有了归属,标记了每一个界址点属于哪一个宗地。

接下来的任务就是对宗地的界址点进行编号,每个宗地的界址点都从J1 开始编号。

宗地内遍历每一个界址点,找到距离这个界址点最近的宗地点,然后给这个界址点赋予这个宗地点的这个序号。遍历完界址点之后,对这个界址点进行排序就会得到我们想要的结果了。

    public void aaaa222(IFeatureClass fc_jzd, IFeatureClass fc_zd,string fieldname)
        {
            string txtfile = "";
            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "文本|*.txt";
            if (save.ShowDialog() != DialogResult.OK) return;
            txtfile = save.FileName;
            
            int jaindex = fc_jzd.FindField(fieldname);
            if (jaindex < 0)
            {
                MessageBox.Show("界址点图层不包含"+ fieldname+"字段,请先做标识操作。");
                return;
            }
            jaindex = fc_zd.FindField(fieldname);
            if (jaindex < 0)
            {
                MessageBox.Show("宗地图层不包含" + fieldname + "字段,修改输入字段名称。");
                return;
            }


            List<string> vsdata = GetUniqueValue(fc_jzd, fieldname);
            ISpatialFilter spatialFilter = new SpatialFilterClass();
            List<string> dataitem_result = new List<string>();
            dataitem_result.Add("序号,"+fieldname+",界址点编号,X,Y");//+ "\r\n";
            int index = 1;
            //spatialFilter.WhereClause = fieldname + " = ";
            foreach (string str in vsdata)
            {
                spatialFilter = new SpatialFilterClass();
                spatialFilter.WhereClause = fieldname + " = '" + str + "'";

                IFeatureCursor fcur_zd = fc_zd.Search(spatialFilter, false);

                IFeatureCursor fcur_jzd = fc_jzd.Search(spatialFilter, false);
                List<mPoint> jzd_ps = new List<mPoint>();
                List<mPoint> presult = new List<mPoint>();
                IFeature feature_zd = null;
                IFeature feature_jzd = null;
                mPoint mp = null;
                List<mPoint> zd_points = new List<mPoint>();
                while ((feature_zd = fcur_zd.NextFeature()) != null)
                {
                    IGeometryCollection geoCol = feature_zd.Shape as IGeometryCollection;  
                    while ((feature_jzd = fcur_jzd.NextFeature()) != null)
                    {
                        mp = new mPoint();
                        mp.X = (feature_jzd.Shape as IPoint).X;
                        mp.Y = (feature_jzd.Shape as IPoint).Y;
                        jzd_ps.Add(mp);
                    }
                    IPoint pp = null;
                    IPointCollection h1 = geoCol.Geometry[0] as IPointCollection;                    
                    for (int a = 0; a < h1.PointCount; a++)
                    {
                        pp = h1.get_Point(a);
                        mp = new mPoint();
                        mp.X = pp.X;
                        mp.Y = pp.Y;
                        mp.index = a;
                        zd_points.Add(mp);   
                    }

                    IPolygon4 p4 = feature_zd.Shape as IPolygon4;
                    IGeometryBag interbag = p4.get_InteriorRingBag(geoCol.Geometry[0] as IRing);
                    IGeometryCollection interCol = interbag as IGeometryCollection;
                    int neihuan = 1;
                    for (int c = 0; c < interCol.GeometryCount; c++)
                    {
                        IPointCollection inth = interCol.get_Geometry(c) as IPointCollection;
                        for (int a = 0; a < inth.PointCount; a++)
                        {
                            pp = inth.get_Point(a);                           
                            mp = new mPoint();
                            mp.X = pp.X;
                            mp.Y = pp.Y;
                            mp.index = h1.PointCount+ neihuan;
                            zd_points.Add(mp);
                            neihuan++;
                        }
                    }

                    List<mPoint> temppp = new List<mPoint>();
                    foreach(mPoint ppitem in jzd_ps)
                    {
                        mPoint pi = GetDirect2(ppitem, zd_points);
                        //zd_points.Where(x => GetDirect(ppitem, x));
                        //mPoint pi= zd_points.FirstOrDefault(x => GetDirect(ppitem, x) == true);
                        if(pi!=null)
                        temppp.Add(pi);                      
                    }
                    temppp = temppp.OrderBy(x=>x.index).ToList();
                    int reallyjzd = 1;
                    temppp.ForEach(x=> 
                    {
                        if(x!=null)
                        dataitem_result.Add((index++) + "," + str + ",J" +( reallyjzd++) + "," + x.X + "," + x.Y);//+ "\r\n";
                    });
                    
                }  
            }
            File.WriteAllLines(txtfile, dataitem_result);

            MessageBox.Show("执行完成!");
        }

这一个方法需要界址点、宗地图层有一个相同的字段,也就是先必须进行标识操作。

后来想了想,如果直接用代码执行按位置进行选择,也能得到和宗地对应的界址点。于是就能把标识这一个步骤省略掉了。 勾选上 “按位置进行编号” 即可。

   public void aaaa_position(IFeatureClass fc_jzd, IFeatureClass fc_zd, string fieldname)
        {
            string txtfile = "";
            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "文本|*.txt";
            if (save.ShowDialog() != DialogResult.OK) return;
            txtfile = save.FileName;

            int jaindex = fc_zd.FindField(fieldname);
            if (jaindex < 0)
            {
                MessageBox.Show("宗地图层不包含" + fieldname + "字段,修改输入字段名称。");
                return;
            }
            List<string> dataitem_result = new List<string>();
            dataitem_result.Add("序号," + fieldname + ",界址点编号,X,Y");
            int index = 1;
            IFeature feature_zd = null;
            IFeatureCursor fcur = fc_zd.Search(null,false);
            while ((feature_zd = fcur.NextFeature())!=null)
            {
                IGeometryCollection geoCol = feature_zd.Shape as IGeometryCollection;
               
                string strJAvalue = feature_zd.get_Value(jaindex).ToString();
                ISpatialFilter spatialFilter2 = new SpatialFilterClass
                {
                    Geometry = feature_zd.Shape as IGeometry,   //
                    SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects,   //相接
                };
                IPoint point1 = (feature_zd.Shape as IArea).LabelPoint;
                IFeatureCursor featureCursor2 = fc_jzd.Search(spatialFilter2, true);
                IFeature feature_jzd = null;//
                List<mPoint> jzd_ps = new List<mPoint>();//界址点点集存放
                List<mPoint> zd_ps = new List<mPoint>();//宗地点集存放
                mPoint mp = new mPoint();
                while ((feature_jzd = featureCursor2.NextFeature()) != null)
                {
                    mp = new mPoint();
                    mp.X = (feature_jzd.Shape as IPoint).X;
                    mp.Y = (feature_jzd.Shape as IPoint).Y;
                    jzd_ps.Add(mp);
                }
                #region 获取宗地的点集

                IPoint pp = null;
                IPointCollection h1 = geoCol.Geometry[0] as IPointCollection;
                for (int a = 0; a < h1.PointCount; a++)
                {
                    pp = h1.get_Point(a);
                    mp = new mPoint();
                    mp.X = pp.X;
                    mp.Y = pp.Y;
                    mp.index = a;
                    zd_ps.Add(mp);
                }

                IPolygon4 p4 = feature_zd.Shape as IPolygon4;
                IGeometryBag interbag = p4.get_InteriorRingBag(geoCol.Geometry[0] as IRing);
                IGeometryCollection interCol = interbag as IGeometryCollection;
                int neihuan = 1;
                for (int c = 0; c < interCol.GeometryCount; c++)
                {
                    IPointCollection inth = interCol.get_Geometry(c) as IPointCollection;
                    for (int a = 0; a < inth.PointCount; a++)
                    {
                        pp = inth.get_Point(a);
                        mp = new mPoint();
                        mp.X = pp.X;
                        mp.Y = pp.Y;
                        mp.index = h1.PointCount + neihuan;
                        zd_ps.Add(mp);
                        neihuan++;
                    }
                }

                #endregion

                List<mPoint> temppp = new List<mPoint>();
                foreach (mPoint ppitem in jzd_ps)//遍历每一个界址点
                {
                    mPoint pi = GetDirect2(ppitem, zd_ps);
                    //zd_points.Where(x => GetDirect(ppitem, x));
                    //mPoint pi= zd_points.FirstOrDefault(x => GetDirect(ppitem, x) == true);
                    if (pi != null)
                        temppp.Add(pi);
                }
                temppp = temppp.OrderBy(x => x.index).ToList();//从新排序
                int reallyjzd = 1;
                
                temppp.ForEach(x =>
                {
                    if (x != null)
                        dataitem_result.Add((index++) + "," + strJAvalue + ",J" + (reallyjzd++) + "," + x.X + "," + x.Y);//+ "\r\n";
                });
               
            }
            File.WriteAllLines(txtfile, dataitem_result);//输出TXT文件

            MessageBox.Show("执行完成!");


        }


结果

为了程序执行的效率以及稳定性,不生成图层、不存储字段信息,插件把处理的结果按

"序号,宗地代码,界址点编号,X,Y"

把所有信息输出到TXT。

直接把TXT文件拖到arcgis里边,展点,就是我们想要的结果了。

插件获取:

https://item.taobao.com/item.htm?ft=t&id=729540249438icon-default.png?t=N6B9https://item.taobao.com/item.htm?ft=t&id=729540249438

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/40910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APACHE KAFKA本机Hello World教程

目标 最近想要简单了解一下Apache Kafka&#xff0c;故需要在本机简单打个Kafka弄一弄Hello World级别的步骤。 高手Kafka大佬们&#xff0c;请忽略这里的内容。 步骤 Apacha Kafka要求按照Javak8以上版本的环境。从官网下载kafka并解压。 启动 # 生产kafka集群随机ID KA…

three.js学习(基础)

目录 前言&#xff1a; 参考文档&#xff1a; 实现 1、安装 2、声明 3、引入使用 前言&#xff1a; 前面学习了three.js物体的动画展示&#xff0c;接下来学习应用图形界面更改变量 目标、页面提供操作区域进行变量修改 参考文档&#xff1a; dat.gui - npmA lightwe…

javaweb使用Thymeleaf 最凝练的CRUD项目-中

javaweb使用Thymeleaf 最凝练的CRUD项目-中 6、显示首页 ①目标 浏览器访问index.html&#xff0c;通过首页Servlet&#xff0c;渲染视图&#xff0c;显示首页。 ②思路 ③代码 [1]创建PortalServlet <servlet><servlet-name>PortalServlet</servlet-name…

玩转内存修改函数——【C语言】

在上篇博客中&#xff0c;我们学习了字符串函数&#xff0c;针对一些字符串我们可以做出一系列操作。接下来我们将学习一些内存修改函数&#xff08;#inlcude<string.h>&#xff09;&#xff0c;让我们一起走进mempy、memmove、memcmp函数中。 目录 mempcy函数​编辑 m…

kaggle新赛:学生摘要评估大赛赛题解析(NLP)

赛题名称&#xff1a;CommonLit - Evaluate Student Summaries 赛题链接&#xff1a; https://www.kaggle.com/competitions/commonlit-evaluate-student-summaries/ 赛题背景 摘要写作是所有年龄段学习者的一项重要技能。总结可以增强阅读理解能力&#xff0c;特别是在第二…

12. 一些开发中遇到的SQL问题

文章目录 一些开发中遇到的SQL问题1. sql报11090错误,原因可能是以下错误&#xff0c;在&#xff1f;占位符后有一个空格2. 占位符&#xff1f;的位置不能是表名&#xff0c;否则会无法进行预编译3. mysql中desc是关键字&#xff0c;如果字段名称为desc会报错4. 数据库中时间格…

[JavaScript游戏开发] 2D二维地图绘制、人物移动、障碍检测

系列文章目录 第一章 2D二维地图绘制、人物移动、障碍检测 文章目录 系列文章目录前言一、列计划1.1、目标1.2、步骤 二、使用步骤2.1、准备素材(图片)&#xff1a;草坪、人物(熊猫)、障碍(石头)2.2、初始化布局(表格)&#xff0c;边距设置为0&#xff0c;无边框&#xff0c;设…

【java】【基础1】数据类型运算符

目录 一、数据类型&#xff08;4大类8种&#xff09; 1.1类型转换 1、自动类型转换 2、表达式的自动类转换 3、强制类型转换 二、运算符 2.1基本算术运算符 2.2自增自减运算符 2.3赋值运算 2.4关系运算符 2.5逻辑运算符 2.6三元运算符 2.7运算符的优先级 三、API文档&am…

机械设计制造及其自动化专业向PLC方向发展的可行性

是的&#xff0c;机械设计制造及其自动化专业往PLC&#xff08;可编程逻辑控制器&#xff09;方向发展是可行的。PLC是一种用于控制和自动化各种机械设备和工业过程的计算机控制系统。它被广泛应用于工业自动化领域&#xff0c;包括制造业、能源行业、交通运输等。 我这里刚好…

uniapp引入echarts

作为前端在开发需求的时候经常会遇到将数据展示为图表的需求&#xff0c;之前一直用的HBuilder的图表插件uCharts&#xff0c;使用方法可以参考我的另一篇博客&#xff1a;uniapp 中使用图表&#xff08;秋云uCharts图表组件&#xff09; 但是最近发现uCharts很多功能都需要付…

基于单片机的智能路灯控制系统人体感应灯光控制系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前时间、年月日、时分秒&#xff1b;按键看看有设置自动手动模式&#xff1b;3路红外探头用来感应当前3个区域是否有人&#xff1b;按键可以设置当前时间、开启和关闭教室灯光时间&#xff1b;在手动模式下&#…

需求条目化与自动估算强强联合 助力软件估算自动化

痛点&#xff1a; 需求是产品的源头&#xff0c;是项目规模估算的基石。而传统的软件规模估算是由项目成员手工进行&#xff0c;对人员能力、经验、方法都有一定的要求&#xff0c;但是效果不好而且耗时费力&#xff0c;不能保持规模估算的一致性。 而导致这些问题的原因&#…

leetcode 101.对称二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;对称二叉树 思路&#xff1a; 这道题和 leetcode 100.相同的树 类似&#xff0c;是上一道的变形题。✨leetcode 100.相同的树 代码链接&#xff1a;【往期文章】leetcode 100.相同的树。这道题把根的左子树和右子树看作两…

CANoe如何配置Master/Slave模式

系列文章目录 文章目录 系列文章目录前言一、CANoe配置端口二、CANoe配置Master模式三、CANoe配置Slave模式前言 随着智能电动汽车的行业的发展,车载以太网的应用越来越广泛,最近很多朋友在问CANoe Master/Slave模式如何设置,车载以太网物理层也有一项是测试Master/Slave模式…

数据结构day5(2023.7.19)

一、Xmind整理&#xff1a; 双向链表的插入与删除&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;单链表任意元素删除 /** function: 按元素删除* param [ in] * param [out] * return 返回堆区首地址*/ Linklist delete_by_data(datatype key,Linklist L) …

物联网(IoT):连接未来的万物之网

引言&#xff1a; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过各种智能设备和传感器&#xff0c;使物体能够互联互通、收集和共享数据的网络。随着科技的不断进步和智能设备的普及&#xff0c;物联网的应用呈现出爆发式增长&#xff0c;对各…

Leetcode-每日一题【109.有序链表转换二叉搜索树】

题目 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9]输出: [0,-3,9,-…

Es存储和查询

基本概念 Cluster 集群&#xff0c;一个ES集群是由多个节点(Node)组成的&#xff0c;每个集群都有一个cluster name 作为标识&#xff0c; 在同一网段下的Es实例会通过cluster name 决定加入哪个集群下。 node 节点&#xff0c;一个ES实例就是一个node&#xff0c;一个机器可以…

SpringBoot(八)拦截器Interceptor

上篇介绍了Filter过滤器的使用&#xff0c;提起过滤器&#xff0c;就不得不再提起另外一个叫做拦截器的东西。两者的作用类似&#xff0c;都可以实现拦截请求的作用&#xff0c;但其实两者有着非常大的区别。本篇&#xff0c;我们就来学习下拦截器的使用。 如果你是新手&#x…

Java阶段五Day09

Java阶段五Day09 文章目录 Java阶段五Day09网关Gateway跨域的问题熔断限流组件sentinel微服务场景熔断降级限流降级 sentinel学习案例sentinel介绍重要的核心概念准备一个测试的工程定义资源定义规则sentinel运行原理本地文件定义规则整合nacos实现规则的远程读取规则的内容详解…
最新文章