【gis插件】arcgis插件界址点编号工具、C#实现思路

news2024/10/6 14:26:34

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

要求:找出宗地对应的所有界址点号,对这些界址点号以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里边,展点,就是我们想要的结果了。

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

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

相关文章

c语言小项目——通讯录初阶

通讯录中阶&#xff1a;点这里 通讯录&#xff08;初阶&#xff09; 项目简介项目中遇到的难点1.给复杂结构体初始化错误写法正确写法 2.枚举和switch可以结合一下&#xff0c;方便查看switch的case中是什么功能&#xff0c;double3.ShowContact中printf的新认知4.FindByName加…

Vue 打包到生产环境部署后图标不见了

问题描述&#xff1a;打包完后部署到正式环境有些图标不显示&#xff0c;如下图&#xff0c;显示为小方块。 解决方案&#xff1a; 这个问题可能是vue-cli脚手架配置问题 在build/webpack.prod.conf.js中 把extract&#xff1a;true 改为 fasle&#xff0c;然后再重新build就…

商城-学习整理-基础-项目简介和分布式概念(一)

目录 前言&#xff1a;一、项目简介1、项目背景2、项目架构图 二、分布式基础概念1、微服务2、集群&分布式&节点3、远程调用4、负载均衡5、服务注册/发现&注册中心6、配置中心7、服务熔断&服务降级8、APP网关 前言&#xff1a; 该项目基于逆向工程进行开发&am…

nginx+lua+redis环境搭建(文末赋上脚本)

目录 需求背景 环境搭建后nginx和redis版本 系统环境 搭建步骤 配置服务器DNS 安装ntpdate同步一下系统时间 安装网络工具、编译工具及依赖库 创建软件包下载目录、nginx和redis安装目录 下载配置安装lua解释器LuaJIT 下载nginx NDK&#xff08;ngx_devel_kit&#xff09…

51单片机学习--独立按键控制LED

功能&#xff1a;按下K1时D1亮&#xff0c;松开时D1灭&#xff0c;P3_1对应K1 , P2_0对应D1 #include <REGX52.H>void main() {while(1) {if(P3_1 0) //按下K1{P2_0 0;}else{P2_0 1;}}} 按下按钮和松开按钮时会有抖动&#xff0c;所以需要用延时函数来避免抖动造成的…

C国演义 [第十章]

第十章 最佳买卖股票时机含冷冻期题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机含手续费题目理解步骤dp数组递推公式初始化遍历方向 代码 最佳买卖股票时机含冷冻期 力扣链接 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格…

瀚高数据库企业版V4单机版-安装手册(Windows)

目录 瀚高数据库企业版V4单机版-安装手册&#xff08;Windows&#xff09; 1. 环境准备 2. 软件安装 3.设置环境变量 4 配置数据库文件 瀚高数据库企业版V4单机版-安装手册&#xff08;Windows&#xff09; 1. 环境准备 ①.安装数据库之前&#xff0c;请确保vcredist_x6…

鸽了百万用户四年的赛博皮卡终于要来啦

作者 | Amy 编辑 | 德新 本月15号&#xff0c;特斯拉官方宣布&#xff0c;第一辆 赛博皮卡已在特斯拉得州工厂下线。 而就在本月初&#xff0c;马斯克还发推预热了一波&#xff0c;「开着赛博皮卡在奥斯汀&#xff08;特斯拉得州工厂所在地&#xff09;溜了一圈&#xff01…

网页动态表单 ,网页动态参数

有的时候因为参数太多 无法 一一 创建 所有采用动态创建 自己遇到的一个实际情况今天写个例子 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>form demo</title><link rel"stylesheet" href&quo…

Windows查看电脑出厂时间

方法一&#xff1a;CMD命令查询 CMD输入命令 >systeminfoBIOS版本时间大概就是出厂时间

基于Mybatis-Plus的代码自动生成器

代码自动生成器 由于在普通业务开发中大多数增删改查操作都是重复的大量的&#xff0c;修改的内容也是相当的少&#xff0c;就如一个模版一样。所以在此构造一个基于Mybatis-Plus的代码生成器&#xff0c;旨在于快速生成项目结构和基础代码。 1、搭建环境 新建一个Springboo…

C语言实现通讯录——动态内存

好与不好&#xff0c;干嘛从别人口中找答案 大家好&#xff0c;我是纪宁。 考试周过去了&#xff0c;刚放暑假也陆陆续续有一些事&#xff0c;这两天才开始静下心来好好学习。希望你我都能过一个充实且快乐的暑假&#xff01; 今天的文章是用C语言实现一个动态版的通讯录 文章…

ARM基础(5):内存屏障的必要性、内存类型和内存排序

在我们写代码的过程中&#xff0c;经常会发现在SDK中会出现__ISB()或__DSB()等语句&#xff0c;这也做的目的是建立一个内存屏障&#xff0c;内存屏障可以由处理器内的硬件操作或内存屏障指令触发&#xff0c;它能够让CPU或编译器对屏障指令之前和之后的内存操作施加排序约束。…

cmake默认编译模式Debug or Release

CMAKE的编译选项 在阅读一些工程源码中&#xff0c;CMakeLists文件通常看到一下内容&#xff1a; set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -g -Wall")那我们的编译时&#xff0c;用的到底是哪一个呢&a…

TypeScript 学习笔记(五):泛型

一、泛型是什么&#xff1f;有什么作用 软件工程中&#xff0c;我们不仅要创建一致的定义良好的API&#xff0c;同时也要考虑可重用性。 组件不仅能够支持当前的数据类型&#xff0c;同时也能支持未来的数据类型&#xff0c;这在创建大型系统时为你提供了十分灵活的功能。 在像…

【MySQL异常解决】Operation not allowed when innodb_forced_recovery > 0 的解决办法

Operation not allowed when innodb_forced_recovery > 0 的解决办法 一、背景描述二、解决方案三、拓展 一、背景描述 Spring Boot 项目&#xff0c;能正常启动&#xff0c;就是访问数据库时后台报错&#xff0c;Cause: java.sql.SQLException: Operation not allowed whe…

禁用 OPTIONS 请求

背景&#xff1a; 渗透测试结果为 不安全的HTTP方法 OPTIONS 描述 验证 curl -v -X OPTIONS http://localhost/xcall/token/refresh?_t1689589608解决方案&#xff08;2选1&#xff09;&#xff1a; 1.spring项目加上&#xff1a; import org.apache.tomcat.util.descript…

基于xinetd部署pwn题(百分百搭成并且可以nc靶场地址)

这种搭建方法需要你先装好docker&#xff0c;关于docker命令的安装这里就不过多介绍了&#xff0c;下面讲的是基于你已经安装好了docker&#xff0c;我们再使用xinetd在CTFd上部署pwn题目。 首先讲一下我自己搭建pwn题的一些经历&#xff0c;我最开始参考的是用socat命令来搭&a…

【DC-DC】APS54083 降压恒流驱动器大功率深度调光 舞台 RGB 汽车照明 台灯驱动芯片

产品描述 APS54083 是一款 PWM 工作模式,高效率、外围简单、外置功率 MOS 管&#xff0c;适用于 5-220V 输入高精度降压 LED 恒流驱动芯片。输出最大功率150W最大电流 6A。APS54083 可实现线性调光和 PWM 调光&#xff0c;线性调光脚有效电压范围 0.5-2.5V.PWM 调光频率范围 1…

MySQL第四章、表的增删查改(进阶)

目录 一、数据库约束 1.1约束类型 1.2NULL约束 1.3 UNIQUE&#xff1a;唯一约束 1.4 DEFAULT&#xff1a;默认值约束 1.5 PRIMARY KEY&#xff1a;主键约束 1.6 FOREIGN KEY&#xff1a;外键约束 1.7 CHECK约束&#xff08;了解&#xff09; 二、表的设计 2.1 一对一…