DayDreamInGIS 之 ArcGIS Pro二次開發 圖層屬性中換行符等特殊字符替換

具體參考ArcMap中類似的問題,本帖開發一個ArcGISPro版的工具

1.基礎庫部分

插件開發,經常需要處理圖層與界面的交互。基礎庫把常用的交互部分做了封裝,方便之后的重復使用。

(1)下述類定義了數據存儲結構,主要用于保存Combox中的label與值。比如,Name_Index類,用于保存名稱-數值索引,Name_Layer類,用于保存圖層名-圖層

using ArcGIS.Desktop.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace GISCommonHelper
{/// <summary>/// 名稱與索引,用于數據綁定時界面的顯示,適用于字段名與索引,圖層名與索引等/// </summary>public class Name_Index{public string name { get; set; }public int index { get; set; }public Name_Index(string name, int index){this.name = name;this.index = index;}}/// <summary>/// 字段名與假名/// </summary>public class Name_AliasName{public string name { get; set; }public string alias_name { get; set; }public Name_AliasName(string name, string alias_name){this.name = name;if (string.IsNullOrEmpty(this.alias_name)){this.alias_name = alias_name;}else{this.alias_name = name;}}}/// <summary>/// 圖層名與圖層/// </summary>public class Name_Layer{public string Name { get; set; }public Layer layer { get; set; }public Guid id { get; set; }public Name_Layer(string name, Layer layer){this.Name = name;this.layer = layer;this.id = Guid.NewGuid();}}public class name_obj{public string name { get; set; }public object obj { get; set; }public Guid id { get; set; }public string tp { get; set; }public name_obj() { }public name_obj(string name, object obj, string tp){this.name = name;this.obj = obj;this.tp = tp;this.id = Guid.NewGuid();}}
}

(2)下述代碼實通過靜態擴展的方式,擴展WPF 中Combox組件,新增方法?

setLyrlist<T>,通過數據綁定的形式設置Combox的Items集合,通過提供一個Map對象,以及泛型類型T

setDftLyr,通過lambda表達式的方式,配置Combox默認的選中值。

通過該擴展類, Combox.SelectedValue 即可獲取該下拉框的選中對象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
using ArcGIS.Desktop.Mapping;namespace GISCommonHelper
{public static class CartoLyrHelper{/// <summary>/// 設置圖層/// </summary>/// <typeparam name="T"></typeparam>/// <param name="cmb"></param>/// <param name="map"></param>public static void setLyrlist<T>(this ComboBox cmb,Map map) where T:Layer{var lyrlist = map.GetLayersAsFlattenedList().OfType<T>().ToList();List<Name_Layer> nlist = new List<Name_Layer>();lyrlist.ForEach(item =>{Layer l = (Layer)item;nlist.Add(new Name_Layer(l.Name, l));});cmb.ItemsSource = nlist;cmb.DisplayMemberPath = "Name";cmb.SelectedValuePath = "layer";}/// <summary>/// 設置下拉集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="cmb"></param>/// <param name="map"></param>/// <param name="clause"></param>public static void setLyrlist<T>(this ComboBox cmb,Map map,Func<Layer,bool> clause) where T : Layer{cmb.setLyrlist<T>(map);cmb.setDftLyr(clause);}/// <summary>/// 設置默認選中的圖層/// </summary>/// <param name="cmb"></param>/// <param name="clause"></param>public static void setDftLyr(this ComboBox cmb,Func<Layer,bool> clause){List<Name_Layer>? lyrlist = new List<Name_Layer>();if (cmb.ItemsSource == null){return;}else{lyrlist = cmb.ItemsSource as List<Name_Layer>;}for (int i = 0; i < lyrlist.Count; i++){var item = lyrlist[i].layer;if (clause(item)){cmb.SelectedIndex = i;}}}}}

2.界面部分

ProWindow

<controls:ProWindow x:Class="DayDreamInGISTool.AttrSpecialStrRemove.RemoveAttrSpecialStrFrm"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:extensions="clr-namespace:ArcGIS.Desktop.Extensions;assembly=ArcGIS.Desktop.Extensions"mc:Ignorable="d" ResizeMode="NoResize"Title="移除屬性中特殊字符" Height="300" Width="300"WindowStartupLocation="CenterOwner" Loaded="ProWindow_Loaded"><controls:ProWindow.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><extensions:DesignOnlyResourceDictionary Source="pack://application:,,,/ArcGIS.Desktop.Framework;component\Themes\Default.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></controls:ProWindow.Resources><Grid Name="RootGrid"><Label Content="圖層" HorizontalAlignment="Left" Margin="12,8,0,0" VerticalAlignment="Top"/><ComboBox Name="cmbLayer" HorizontalAlignment="Left" Margin="51,10,0,0" VerticalAlignment="Top" Width="229" SelectionChanged="cmbLayer_SelectionChanged"/><GroupBox Header="待移除特殊字符" HorizontalAlignment="Left" Margin="12,41,0,0" VerticalAlignment="Top" Height="101" Width="268" Name="ToBeRemovedGroup"><Grid Height="90" Margin="0,0,0.2,-0.4" VerticalAlignment="Top"><CheckBox Name="chkEnter" IsChecked="True"  Content="換行符 \r\n" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/><CheckBox Name="chkA" Content="響鈴 \a" IsChecked="True" HorizontalAlignment="Left" Margin="142,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.313,0.526"/><CheckBox Name="chkF" IsChecked="True"  Content="換頁 \f" HorizontalAlignment="Left" Margin="10,34,0,0" VerticalAlignment="Top"/><CheckBox Name="chkT" IsChecked="True"  Content="水平制表 \t" HorizontalAlignment="Left" Margin="142,34,0,0" VerticalAlignment="Top"/><CheckBox Name="chkV" IsChecked="True"  Content="垂直制表 \v" HorizontalAlignment="Left" Margin="142,58,0,0" VerticalAlignment="Top" Checked="chkV_Checked"/><CheckBox Name="chkStartEndSpace" IsChecked="True" Content="首尾空格符" HorizontalAlignment="Left" Margin="10,58,0,0" VerticalAlignment="Top"/></Grid></GroupBox><Label Content="替換為" HorizontalAlignment="Left" Margin="12,151,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.155,0.477"/><TextBox HorizontalAlignment="Left" Name="txtReplace" Height="23" Margin="64,151,0,0" TextWrapping="Wrap" Text="、" VerticalAlignment="Top" Width="216"/><Button Content="確定" IsDefault="True" Name="btnOK" HorizontalAlignment="Left" Margin="49,220,0,0" VerticalAlignment="Top" Width="83" Height="30" Click="btnOK_Click"/><Button Content="取消" IsCancel="True" Name="btnCancel" HorizontalAlignment="Left" Margin="174,220,0,0" VerticalAlignment="Top" Width="83" RenderTransformOrigin="-0.557,1.094" Height="30" Click="btnCancel_Click"/><CheckBox Content="處理TOC中所有圖層" Name="chkAll" HorizontalAlignment="Left" Margin="51,193,0,0" VerticalAlignment="Top"/></Grid>
</controls:ProWindow>

下述代碼為界面邏輯,主要實現交互獲取,通過屬性的方式

using ArcGIS.Desktop.Mapping;
using GISCommonHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace DayDreamInGISTool.AttrSpecialStrRemove
{/// <summary>/// Interaction logic for RemoveAttrSpecialStrFrm.xaml/// </summary>public partial class RemoveAttrSpecialStrFrm : ArcGIS.Desktop.Framework.Controls.ProWindow{private FeatureLayer ftlyr = null;public FeatureLayer Ftlyr { get => ftlyr; set => ftlyr = value; }public char[] SpecialCharArray { get => specialCharArray; set => specialCharArray = value; }public bool IsAll { get => isAll; set => isAll = value; }public bool IsTrim { get => isTrim; set => isTrim = value; }public List<char> Special_char { get => special_char; set => special_char = value; }public string Replace_str { get => replace_str; set => replace_str = value; }private char[] specialCharArray;private bool isAll = false;private bool isTrim;private List<char> special_char;private string replace_str;public RemoveAttrSpecialStrFrm(){InitializeComponent();special_char = new List<char>();//獲取所有圖層var map = MapView.Active.Map;this.cmbLayer.setLyrlist<FeatureLayer>(map);}private void cmbLayer_SelectionChanged(object sender, SelectionChangedEventArgs e){if (this.cmbLayer.SelectedIndex >= 0){this.ftlyr = this.cmbLayer.SelectedValue as FeatureLayer;}}private void btnOK_Click(object sender, RoutedEventArgs e){replace_str = txtReplace.Text;isAll = chkAll.IsChecked.Value;if (chkA.IsChecked.Value){special_char.Add('\a');}if (chkEnter.IsChecked.Value){special_char.Add('\r');special_char.Add('\n');}if (chkF.IsChecked.Value){special_char.Add('\f');}if (chkT.IsChecked.Value){special_char.Add('\t');}if (chkV.IsChecked.Value){special_char.Add('\v');}isTrim = chkStartEndSpace.IsChecked.Value;this.DialogResult = true;}private void btnCancel_Click(object sender, RoutedEventArgs e){this.DialogResult = false;}private void chkV_Checked(object sender, RoutedEventArgs e){}private void ProWindow_Loaded(object sender, RoutedEventArgs e){}}
}

3.邏輯代碼

using ArcGIS.Core.CIM;
using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Catalog;
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Editing;
using ArcGIS.Desktop.Extensions;
using ArcGIS.Desktop.Framework;
using ArcGIS.Desktop.Framework.Contracts;
using ArcGIS.Desktop.Framework.Dialogs;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Layouts;
using ArcGIS.Desktop.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;namespace DayDreamInGISTool.AttrSpecialStrRemove
{internal class btnRemoveAttrSpecialStr : Button{private List<char> special_char_list;private string replacestr = ";";private bool isTrim = false;int cnt = 0;RemoveAttrSpecialStrFrm rsf = null;protected override void OnClick(){rsf = new RemoveAttrSpecialStrFrm();if (rsf.ShowDialog().Value){cnt = 0;special_char_list = rsf.Special_char;replacestr = rsf.Replace_str;isTrim = rsf.IsTrim;if (rsf.IsAll){var map = MapView.Active.Map;var lyrlist= map.GetLayersAsFlattenedList().OfType<FeatureLayer>().ToList();lyrlist.ForEach(p =>{Execute_specialStr_Remove(p);});}else{Execute_specialStr_Remove(rsf.Ftlyr);}MessageBox.Show("處理完成");}}/// <summary>/// 遍歷要素,替換要素各字段中的特殊字符/// </summary>/// <param name="pftlyr"></param>/// <returns></returns>private async void Execute_specialStr_Remove(FeatureLayer pftlyr){var fields = await QueuedTask.Run(() =>{return pftlyr.GetFieldDescriptions();});await QueuedTask.Run(() =>{using(Table table= pftlyr.GetTable()){using(RowCursor rowCursor= table.Search(null, false)){while(rowCursor.MoveNext()){using(Row row= rowCursor.Current){System.Diagnostics.Debug.WriteLine("正在處理:"+row.GetObjectID());remove_feature_attr_specialStr(row,fields);}}}}});//return cnt;}/// <summary>/// 替換要素所有字段中的特殊字符/// </summary>/// <param name="pFeature"></param>private void remove_feature_attr_specialStr(Row row,List<FieldDescription> fields){for (int i = 0; i < fields.Count; i++){FieldDescription pfd = fields[i];if (pfd.Type == FieldType.String){//只處理字符類型的值string val = row[pfd.Name].ToString();if(val!= null){string val_r = remove_specialStrInString(val);if (!string.Equals(val, val_r)){row[pfd.Name]= val_r;row.Store();}}}}}/// <summary>/// 替換字符串中的特殊字符/// </summary>/// <param name="str"></param>/// <returns></returns>private string remove_specialStrInString(string str){if (isTrim){str = str.Trim();}special_char_list.ForEach(p =>{str = str.Replace(p.ToString(), replacestr);});return str;}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DFA還原白盒AES密鑰

本期內容是關于某app模擬登錄的,涉及的知識點比較多,有unidbg補環境及輔助還原算法,ida中的md5以及白盒aes,fart脫殼,frida反調試 本章所有樣本及資料均上傳到了123云盤 llb資料官方版下載丨最新版下載丨綠色版下載丨APP下載-123云盤 目錄 首先抓包 fart脫殼 加密位置定位…

0048__Unix傳奇

Unix傳奇 &#xff08;上篇&#xff09;_unix傳奇(上篇)-CSDN博客 Unix傳奇 &#xff08;下篇&#xff09;-CSDN博客 Unix現狀與未來——CSDN對我的采訪_nuix郵件系統行業地位-CSDN博客

win11安裝nodejs

一、下載安裝包 鏈接: https://pan.baidu.com/s/1_df8s1UlgNNaewWrWgI59A?pwdpsjm 提取碼: psjm 二、安裝步驟 1.雙擊安裝包 2.Next> 3.勾選之后&#xff0c;Next> 4.點擊Change&#xff0c;選擇你要安裝的路徑&#xff0c;然后Next> 5.點擊Install安裝 二、…

學生云服務器騰訊云_騰訊云學生學生_騰訊云學生云主機

2024年騰訊云學生服務器優惠活動「云校園」&#xff0c;學生服務器優惠價格&#xff1a;輕量應用服務器2核2G學生價30元3個月、58元6個月、112元一年&#xff0c;輕量應用服務器4核8G配置191.1元3個月、352.8元6個月、646.8元一年&#xff0c;CVM云服務器2核4G配置842.4元一年&…

基于擴散模型的圖像編輯:首篇綜述

AIGC 大模型最火熱的任務之一——基于 Diffusion Model 的圖像編輯(editing)領域的首篇綜述。長達 26 頁&#xff0c;涵蓋 297 篇文獻&#xff01;本文全面研究圖像編輯前沿方法&#xff0c;并根據技術路線精煉地劃分為 3 個大類、14 個子類&#xff0c;通過表格列明每個方法的…

查詢緩存-緩存更新-緩存穿透-緩存雪崩-緩存擊穿

1.查詢緩存 1.2.出現的原因 用戶高并發訪問帶來的服務器讀寫的壓力 1.3.解決方法 添加緩存 2.緩存更新 2.1.出現的原因 出現數據不一致的問題 2.2.解決方法 操作數據庫的時候 更新數據庫刪除緩存 查詢數據的時候設置過期時間 3.緩存穿透 3.1.出現的原因 在高并發訪…

LeetCode 熱題 100 | 圖論(一)

目錄 1 200. 島嶼數量 2 994. 腐爛的橘子 2.1 智障遍歷法 2.2 仿層序遍歷法 菜鳥做題&#xff0c;語言是 C 1 200. 島嶼數量 解題思路&#xff1a; 遍歷二維數組&#xff0c;尋找 “1”&#xff08;若找到則島嶼數量 1&#xff09;尋找與當前 “1” 直接或間接連接在…

Java輸入輸出流詳細解析

Java I/O&#xff08;輸入/輸出&#xff09;主要被用來處理輸入數據和輸出結果。 在Java中&#xff0c;輸入/輸出操作被當作流&#xff08;Stream&#xff09;進行處理。流是一個連續的數據流入或數據流出的通道。流操作在Java中主要可以分為兩種類型&#xff1a;字節流和字符…

基于ssm疫情期間高校防控系統+vue論文

摘 要 傳統信息的管理大部分依賴于管理人員的手工登記與管理&#xff0c;然而&#xff0c;隨著近些年信息技術的迅猛發展&#xff0c;讓許多比較老套的信息管理模式進行了更新迭代&#xff0c;學生信息因為其管理內容繁雜&#xff0c;管理數量繁多導致手工進行處理不能滿足廣大…

‘conda‘ 不是內部或外部命令,也不是可運行的程序 或批處理文件

如果你在運行 conda 命令時收到了 ‘conda’ 不是內部或外部命令&#xff0c;也不是可運行的程序或批處理文件。 的錯誤消息&#xff0c;這可能意味著 Anaconda 并沒有正確地添加到你的系統路徑中。 1.你可以嘗試手動添加 Anaconda 到系統路徑中。以下是在 Windows 系統上添加…

19.2 DeepMetricFi:基于深度度量學習改進Wi-Fi指紋定位

P. Chen and S. Zhang, "DeepMetricFi: Improving Wi-Fi Fingerprinting Localization by Deep Metric Learning," in IEEE Internet of Things Journal, vol. 11, no. 4, pp. 6961-6971, 15 Feb.15, 2024, doi: 10.1109/JIOT.2023.3315289. 摘要 Wi-Fi RSSI指紋定位…

C++內存泄漏:原因、預防、定位

內存泄漏是 C 中常見的問題之一&#xff0c;可能導致程序運行時資源消耗過大、性能下降&#xff0c;甚至程序崩潰。 內存泄漏的原因 1. 未釋放動態分配的內存 在 C 中&#xff0c;通過 new 操作符分配的內存需要手動使用 delete 操作符進行釋放。如果忘記或者由于某種原因未…

調用“每日詩詞”在你的頁面添加一句詩

概述 前幾天瀏覽網站的時候看到頁面上有句詩&#xff0c;打開調試看了下調用的是“每日詩詞”的SDK。本文基于此SDK實現你的頁面添加一句詩。 實現效果 實現 1. 引入SDK <script src"https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset"utf-…

mysql服務治理

一、性能監控指標和解決方案 1.QPS 一臺 MySQL 數據庫&#xff0c;大致處理能力的極限是&#xff0c;每秒一萬條左右的簡單 SQL&#xff0c;這里的“簡單 SQL”&#xff0c;指的是類似于主鍵查詢這種不需要遍歷很多條記錄的 SQL。 根據服務器的配置高低&#xff0c;可能低端…

【BUUCTF web】通關 2.0

&#x1f36c; 博主介紹&#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】 &#x1f389;點贊?評論?收藏 …

MAC-鍵盤command快捷鍵、設置windows快捷鍵

在 Windows PC 專用鍵盤上&#xff0c;請用 Alt 鍵代替 Option 鍵&#xff0c;用 Ctrl 鍵或 Windows 標志鍵代替 Command 鍵。 Mac 鍵盤快捷鍵 - 官方 Apple 支持 (中國) 設置windows快捷鍵 使用mac外接適用于windows的鍵盤時&#xff0c;如何設置快捷鍵&#xff1f;_mac外…

2024年2月國內如何快速注冊OnlyFans最新小白教學

前言 onlyface軟件是一個創立于2016年的訂閱式社交媒體平臺&#xff0c;創作者可以在自己的賬號發布原創的照片或視頻&#xff0c;并將其設置成付費模式&#xff0c;若用戶想查看則需要每月交費訂閱。 需要注意的是&#xff0c;網絡上可能存在非法或不道德的應用程序&#xff…

Java:性能優化細節31-45

Java&#xff1a;性能優化細節31-45 31、合理使用java.util.Vector 在使用java.util.Vector時&#xff0c;需要注意其性能特性和最佳實踐&#xff0c;以確保應用程序運行高效。Vector是一個同步的集合類&#xff0c;提供了動態數組的實現。由于它是線程安全的&#xff0c;所以…

獲取當前數據 上下移動

點擊按鈕 上下移動 當前數據 代碼 // 出國境管理 登記備案人員列表 <template><a-row><a-col span"24"><a-card :class"style[a-table-wrapper]"><!-- 出國境 登記備案人員列表 --><a-table:rowKey"records >…

淘寶開放平臺獲取商家訂單數據API接口接入流程

taobao.custom 自定義API操作 接口概述&#xff1a;通過此API可以調用淘寶開放平臺的API&#xff0c;通過技術對接&#xff0c;您可以輕松實現無賬號調用官方接口。進入測試&#xff01; 公共參數 名稱類型必須描述keyString是調用key&#xff08;必須以GET方式拼接在URL中&…