【ArcGIS Pro二次开发】(34):从字符串中提取中文、英文、数字与特殊符号

这是一个基于字段计算的工具。

有时候我们会遇到一些混杂着各种中文、英文、数字、特殊符号的文字,这个工具的目的是从这些复杂文字中提取出想要的特定文字。

比如说从CAD测绘图中可以读取到类似【混3】、【砖2】的文字,如果想要从中提取出层数或结构,就可以用这个工具实现。


一、要实现的功能

如上图所示,点击【提取特定文字】工具,选择地图内的要素图层或独立表,再选择要处理的包含复杂文字的字段和要输出结果的字段,再选择提取模式,点击执行即可。

执行结果如下:

有点像字段计算器计算的结果,实际上用字段计算器也能实现上面的效果,有兴趣的可以看一下这一篇文章:Arcgis小技巧【10】——字段计算器的简单用法和示例


二、实现流程

首先要从当前选择的图层或独立表中获取【Table】,作为后续字段计算的载体。

因为选择的可能是要素图层或者独立表,写了一个通用方法,考虑的比以前要多一些。

        // 从图层获取Table
        public static Table GetTableFromLayer(string fcPath)
        {
            // 判断是否选择了图层
            if (fcPath == "")
            {
                MessageBox.Show("请选择一个要素图层或表");
                return null;
            }
            // 根据图层名找到当前图层
            var map = MapView.Active.Map;
            var init_featurelayer = map.FindLayers(fcPath);
            var init_table = map.FindStandaloneTables(fcPath);

            // 判断当前选择的是要素图层还是独立表
            if (init_featurelayer.Count == 0)
            {
                // 是独立表的情况
                StandaloneTable init_layer = map.FindStandaloneTables(fcPath)[0];
                return init_layer.GetTable();
            }
            if (init_table.Count == 0)
            {
                // 是要素图层的情况
                FeatureLayer init_layer = map.FindLayers(fcPath)[0] as FeatureLayer;
                return init_layer.GetTable();
            }
            return null;
        }

获取到【Table】之后,就可以通过游标进行字段计算了:

                await QueuedTask.Run(() =>
                {
                    // 获取所选图层的所有字段
                    var tb = ToolManager.GetTableFromLayer(layer_path);
                    // 字段计算
                    using (ArcGIS.Core.Data.Table table = tb)
                    {
                        using (RowCursor rowCursor = table.Search(null, false))
                        {
                            TableDefinition tableDefinition = table.GetDefinition();
                            while (rowCursor.MoveNext())
                            {
                                using (Row row = rowCursor.Current)
                                {
                                    // 获取输入字段的值
                                    var value_in = row[field_in].ToString();
                                    // 提取特定文字
                                    row[field_out] = ToolManager.GetWord(value_in, model);
                                    // 保存
                                    row.Store();
                                }
                            }
                        }
                    }
                });

这里的ToolManager.GetWord(value_in, model)方法就是最核心的代码了,主要是通过正则表达式来实现:

        // 提取特定文字【model包括:中文、英文、数字、特殊符号】
        public static string GetWord(string txt_in, string model = "中文")
        {
            string chinesePattern = "[\u4e00-\u9fa5]"; // 匹配中文字符的正则表达式
            string englishPattern = "[a-zA-Z]"; // 匹配英文字符的正则表达式
            string digitPattern = @"\d"; // 匹配数字的正则表达式
            string specialCharPattern = @"[^a-zA-Z0-9\u4e00-\u9fa5\s]"; // 匹配特殊符号的正则表达式

            string txt = "";

            if (model == "中文")
            {
                Regex chineseRegex = new Regex(chinesePattern);
                txt = ExtractMatches(txt_in, chineseRegex);
            }
            else if (model == "英文")
            {
                Regex englishRegex = new Regex(englishPattern);
                txt = ExtractMatches(txt_in, englishRegex);
            }
            else if (model == "数字")
            {
                Regex digitRegex = new Regex(digitPattern);
                txt = ExtractMatches(txt_in, digitRegex);
            }
            else if (model == "特殊符号")
            {
                Regex specialCharRegex = new Regex(specialCharPattern);
                txt = ExtractMatches(txt_in, specialCharRegex);
            }
            return txt;
        }
        // 正则匹配
        public static string ExtractMatches(string input, Regex regex)
        {
            string result = "";
            MatchCollection matches = regex.Matches(input);

            foreach (Match match in matches)
            {
                result += match.Value;
            }
            return result;
        }

核心代码并不长,正则表达式之前在python中用过,这次在c#中实现,基本差不多,还是很好用的。


三、工程文件分享

 最后,放上工程文件的链接:

GetWordicon-default.png?t=N4P3https://pan.baidu.com/s/1IJ6qDrMKcZqWCsPceAy5bA?pwd=y1vyPS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ArcGIS Pro二次开发是指使用ArcGIS Pro软件进行自定义功能开发的过程。对于初学者而言,开始二次开发可能感到无从入手,因为中文资料较少,官方文档对于英文不熟悉的人来说可能不太友好。 要开始ArcGIS Pro二次开发,你可以按照以下步骤进行操作: 1. 首先,以管理员身份运行Visual Studio 2019。如果没有安装Visual Studio 2019,你需要先下载并安装它。 2. 在Visual Studio,右键项目名称,选择"添加",然后选择"新建项"。 3. 在"新建项"下拉菜单,选择"ArcGIS",然后选择"ArcGIS Pro Add-ins",再选择"ArcGIS Pro按钮",最后点击"添加"。 4. 接下来,配置新项目。在Visual Studio,点击"文件",选择"新建",然后选择"项目"。 5. 在"新建项目"对话框,选择"C#"作为语言,选择"Windows"作为平台,然后选择"ArcGIS Pro SDK"。在项目类型选择"ArcGIS Pro模块加载项",然后点击"下一步"。 6. 设置新项目的配置,然后点击"创建"。等待项目创建完成。 通过以上步骤,你就可以开始进行ArcGIS Pro二次开发了。你可以根据你的需求,使用C#编程语言进行开发,并且利用ArcGIS Pro SDK提供的功能来扩展ArcGIS Pro软件的功能。 希望这些步骤能够帮助你入门ArcGIS Pro二次开发。如果你遇到了其他问题或需要更多详细的指导,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏](https://blog.csdn.net/xcc34452366/article/details/129223703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ArcGIS Pro二次开发环境配置及项目创建示例](https://blog.csdn.net/wsywsy00/article/details/128550006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

规划GIS会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值