ArcGIS 属性中换行符等特殊字符的处理

您所在的位置:网站首页 如何删除换行符替换字符 ArcGIS 属性中换行符等特殊字符的处理

ArcGIS 属性中换行符等特殊字符的处理

2024-03-20 08:02| 来源: 网络整理| 查看: 265

数据处理中,经常需要将Excel中的相关属性关联到空间数据中。而Excel中的数据格式较自由,有时候Excel表中的数据包含换行符等特殊符号,而这种包含换行符的数据关联到ArcGIS的属性表中时,在属性表界面中,该界面是不支持换行符的。

比如下述两条示例数据,显示责任单位为太平街道办事处

当打开编辑模式时,并双击进该属性时,则显示为

此时,在Attributes窗口中,显示为

而平时数据处理时,有时候只是为了查看一下数据的属性,并不会打开编辑模式,也并不一定会点击到该属性。因此,往往会将这种属性只按“太平街道办事处”来处理。

工作中,有时候需要将其他业务数据库中用户填报的信息关联到空间数据中,当用户填报的数据中包含备注等字数比较多的字段时,用户往往是将其他文档整段的内容复制过来,也会产生这种问题。

上述问题解决比较麻烦,首先,数据中这种换行符问题比较难以发现,其次,即使发现了,这种换行符由于在ArcGIS 里是不显示的,也很难删除,直接在ArcGIS的属性窗口中,往往是看似删除了,实际没有删除,为了解决这个问题,往往需要在记事本中把上述内容抄写一遍,再复制到该字段中。

为了解决这个问题,制作了一个ArcGIS插件,通过对图层中的所有的字符类型的字段进行遍历,并将常见的这种特殊类型的字符,替换成其他字符。

插件下载地址:

链接:https://pan.baidu.com/s/1yUOVQ8ZoWngyEO0aRa6dhg  提取码:ssr9 

注意:请下载v1.0.9版本,工具条最后一个按钮。工具名称:DayDreamInGIS工具

主要界面:

代码如下

界面部分:

界面部分代码:

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; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; namespace Toolbar.AttrSpecialStrRemove { /// /// RemoveAttrSpecialStrFrm.xaml 的交互逻辑 /// public partial class RemoveAttrSpecialStrFrm : Window { private IMap pMap = null; private IFeatureLayer pftlyr = null; public IFeatureLayer Pftlyr { get { return pftlyr; } set { pftlyr = value; } } private char[] specialCharArray; private bool isAll = false; public bool IsAll { get { return isAll; } set { isAll = value; } } private List special_char; public List Special_char { get { return special_char; } set { special_char = value; } } private string replace_str; public string Replace_str { get { return replace_str; } set { replace_str = value; } } public RemoveAttrSpecialStrFrm() { InitializeComponent(); special_char = new List(); pMap = ArcMap.Document.FocusMap; GISCommonHelper.CartoLyrHelper.setFeatureLyrCombox(ref cmbLayer, pMap, esriGeometryType.esriGeometryAny); } private void chkV_Checked(object sender, RoutedEventArgs e) { } 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'); } this.DialogResult = true; } private void btnCancel_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; } private void cmbLayer_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (cmbLayer.SelectedIndex > -1) { pftlyr = cmbLayer.SelectedValue as IFeatureLayer; } } } }

核心代码:

using System; using System.Collections.Generic; using System.Text; using System.IO; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using System.Windows.Forms; namespace Toolbar.AttrSpecialStrRemove { /// /// 移除换行符等特殊字符 /// public class btnRemoveAttrSpecialStr : ESRI.ArcGIS.Desktop.AddIns.Button { public btnRemoveAttrSpecialStr() { } private List special_char_list; private string replacestr=";"; int cnt = 0; protected override void OnClick() { try { RemoveAttrSpecialStrFrm ras = new RemoveAttrSpecialStrFrm(); if (ras.ShowDialog() == true) { cnt = 0; special_char_list = ras.Special_char; replacestr = ras.Replace_str; if (ras.IsAll) { List ftlyrlist=GISCommonHelper.CartoLyrHelper.getAllLayer(ArcMap.Document.FocusMap); ftlyrlist.ForEach(p => { Execute_specialStr_Remove(p); }); } else { Execute_specialStr_Remove(ras.Pftlyr); } MessageBox.Show("处理完成"); } } catch (Exception ex) { MessageBox.Show("发生未知异常:"+ex.Message); } } /// /// 遍历要素,替换要素各字段中的特殊字符 /// /// /// private int Execute_specialStr_Remove(IFeatureLayer pftlyr) { int cnt = 0; IWorkspaceEdit pwsEdit = (pftlyr.FeatureClass as IDataset).Workspace as IWorkspaceEdit; pwsEdit.StartEditing(false); pwsEdit.StartEditOperation(); IFeatureCursor pftcursor = pftlyr.FeatureClass.Update(null, true); IFeature pFeature = pftcursor.NextFeature(); while (pFeature != null) { System.Diagnostics.Debug.WriteLine(pFeature.OID); remove_feature_attr_specialStr(ref pFeature); pftcursor.UpdateFeature(pFeature); pFeature = pftcursor.NextFeature(); } pwsEdit.StopEditOperation(); pwsEdit.StopEditing(true); return cnt; } /// /// 替换要素所有字段中的特殊字符 /// /// private void remove_feature_attr_specialStr(ref IFeature pFeature) { for (int i = 0; i < pFeature.Fields.FieldCount; i++) { IField pfd = pFeature.Fields.get_Field(i); if (pfd.Type == esriFieldType.esriFieldTypeString) { //只处理字符类型的值 string val = pFeature.get_Value(i).ToString(); string val_r = remove_specialStrInString(val); if (!string.Equals(val, val_r)) { pFeature.set_Value(i, val_r); } } } } /// /// 替换字符串中的特殊字符 /// /// /// private string remove_specialStrInString(string str) { special_char_list.ForEach(p => { str=str.Replace(p.ToString(), replacestr); }); return str; } protected override void OnUpdate() { } } }

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3