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

news2024/11/22 19:25:30

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

要求:找出宗地对应的所有界址点号,对这些界址点号以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.coloradmin.cn/o/773594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)

目录 1. \r 和 \n2. 通过一个小程序观察现象3. 进度条 1. \r 和 \n 回车和换行符在 linux 系统下的 gcc 编辑器中&#xff0c;是能观测出有明显区别的。 \n&#xff1a;换行 --> 光标去往下一行的相同位置 \r&#xff1a;回车 --> 光标回到该行最左侧 &#xff08;两步之…

综合案例:书籍购物车

待练习 记得写key <tbody><tr v-for"(item, index) in books":key"item.id"click"rowClick(index)":class"{ active: index currentIndex }"><td>{{ index 1 }}</td><td>{{ item.name }}</td>…

数据库应用:MySQL高级语句(二)

目录 一、理论 1.表连接查询 2.视图 3.联集 4.交集值 5.无交集值 6.CASE 7.空值&#xff08;NULL&#xff09;和无值&#xff08;’ &#xff09;的区别 8.正则表达式&#xff08;精确查询) 二、实验 1.表连接查询 2.视图 3.联集 4.交集值 5.无交集值 6.CASE 7…

Ollydbg(1)字符串解决

链接&#xff1a;https://pan.baidu.com/s/1BaROP5e9UbJMSN1sgOOKbA 提取码&#xff1a;z2i6 输入序列号&#xff0c;如果不正确&#xff0c;提示输入不正确 右键→中文搜索引擎→智能搜索→文本字符串→双击 流程&#xff1a; 一.找到关键处并且修改 两个均可以实现功能的修改…

电力市场经济与管理自学笔记

电力市场经济与管理自学笔记 第二章 电力经济学基本原理2.1 供给、需求与均衡2.1.1 需求曲线2.1.2 供给曲线2.1.3 供给需求的平衡 写本文主要是用于为以后可能从事的电力市场相关方向做点铺垫 第二章 电力经济学基本原理 这一章和高中政治时学的《经济生活》有点类似&#xf…

信息摘要 秘钥签名 数字签名 数字证书 数字验证 数字信封 这都是什么东西?

信息摘要 秘钥签名 数字签名 数字证书 数字验证 数字信封 这都是什么东西&#xff1f; 一下遇见这么多相近的名词&#xff0c;实在是难以区分理解&#xff0c;还是从这些概念产生的缘由理解吧 先看需求&#xff1a;如何保证 数据 在网络中传输时正确的&#xff1f;有没有被篡…

CentOS7安装Mysql8并进行主从复制配置

场景 CentOS7中安装Mysql8并配置远程连接和修改密码等&#xff1a; CentOS7中安装Mysql8并配置远程连接和修改密码等_霸道流氓气质的博客-CSDN博客 在上面实现安装Mysql8的基础上&#xff0c;克隆出两台机器&#xff0c;修改ip后进行mysql的主从复制搭建。 Mysql主从复制 …

vue组件 导出excel,并且可以合并单元格,设置宽度,字体颜色,换行等

需求:在开发后台管理系统中,经常会有导出表格的需求,本案例实现了在导出时,可以合并单元格,设置单元格字体颜色和宽度,并且可以根据 \n 自动换行 插件:xlsx(0.18.4),xlsx-style(0.8.13),file-saver(2.0.5) 效果如下: 注意:不同的版本之间可能方法不能共用 …

【蓝图】p28-p29按键+鼠标点击实现开关门

p28-p29按键鼠标点击实现开关门 p28&#xff0c;创建门的蓝图类创建一个Actor注意&#xff08;当门的中心点不在边角上时&#xff09; 蓝图三个旋转区别按E键开关门使鼠标点击也可以开门可能遇到的bug问题 p28&#xff0c;创建门的蓝图类 actor和组件的区别、门的轴心点修改 …

HttpRunner自动化之初始化和清理操作--hook机制

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…

Uncaught TypeError: Cannot read properties of null (reading ‘name‘) 和NoSuchMethodException

问题1&#xff1a;Uncaught TypeError: Cannot read properties of null (reading name) 分析&#xff1a;这是由于还没登录&#xff0c;data.name 还没获取到值&#xff0c;所以为null 方法1&#xff1a;可以不管&#xff0c;它不会影响其他功能&#xff0c;当你登录后&#x…

2023年9月江苏/北京/深圳DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

书接上文——DETR评估可视化

在上一篇文章中&#xff0c;详细记录了如何使用官方开源的DETR项目开发训练自己的数据集&#xff0c;有详细的教程&#xff0c;感兴趣可以看下&#xff1a;《DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程》 在文末我还附上了自己简单的绘图实践…

深入理解Spring事务传播机制-原理与实例说明

事务传播机制 简化记忆版本 REQUIRED:有事务加入&#xff0c;没有事务创建&#xff0c;Spring默认MANDATORY:必须在事务中被调用&#xff0c;没有抛异常SUPPORTS:有事务加入&#xff0c;没有以非事务运行NOT_SUPPORTED:不需要事务&#xff0c;有事务则挂起&#xff0c;避免回…

java学习003

Java数组 Java 语言中提供的数组是用来存储固定大小的同类型元素&#xff0c;这一点和PHP语言的可变数组长度不同。 声明变量数组 首先必须声明数组变量&#xff0c;才能在程序中使用数组。下面是声明数组变量的语法&#xff1a; dataType[] arrayRefVar; // 首选的方法 或 …

C/C++ 高效判断素数原理和代码实现

素数判断 素数是质数&#xff0c;指一个数的因数只有1和本身&#xff0c;1不是质数 所以需要在i [2 , x-1] 内判断x%i 是否是0&#xff0c;如果存在整除的&#xff0c;就不是质数 在数据量大时&#xff0c;我们采用更高效的方式&#xff0c;求[2,sqrt(x)]即可 对于一个数x,如…

华为产品测评官-开发者之声 - 华为云CodeArts真实体验感想

华为产品测评官&#xff0d;开发者之声 - 华为云CodeArts真实体验感想 我先是在6月17日参加了华为在深圳举办的开发者大会&#xff0c;后面看到群里发的"2023华为产品测评官&#xff0d;开发者之声"活动&#xff0c;简单看了一下体验活动的具体事情&#xff0c;感觉…

亚马逊卖家如何自己快速处理恶意差评

亚马逊卖家朋友自己遇到被恶意差评不要慌&#xff0c;可以通过大量买家号进行自己处理&#xff0c;方法如下&#xff1a; 1、点击差评下的report abuse按钮 如果是买家恶意差评&#xff0c;评价与实际不符合&#xff0c;商家可以在评价下找到report abuse&#xff0c;点击按钮…

手把手带你实现ChatGLM2-6B的P-Tuning微调

参考文献&#xff1a;chatglm2ptuning 注意问题1&#xff1a;AttributeError: ‘Seq2SeqTrainer’ object has no attribute is_deepspeed_enabl torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 可能是版本太高&#xff0c;可以参考chatglm2的环境

使用Linux Deploy搭建服务器(三)Linux Deploy安装宝塔面板

宝塔面板是一个免费的服务器管理平台,可以在你的服务器上安装它,然后你就能很方便的管理你的服务器,以及搭建各种服务平台,在此基础上我们可以使用内网穿透,搭建出自己的Linux服务器。可以这样一个相对便宜的方式,进行Linux、网站搭建、web服务部署等一系列操作的学习。 …