You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
313 lines
14 KiB
313 lines
14 KiB
using DevExpress.Xpf.Editors; |
|
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.Controls; |
|
using ESRI.ArcGIS.esriSystem; |
|
using ESRI.ArcGIS.Geodatabase; |
|
using KGIS.Framework.AE; |
|
using KGIS.Framework.AE.Enum; |
|
using KGIS.Framework.AE.GPHelper; |
|
using KGIS.Framework.Maps; |
|
using KGIS.Framework.OpenData.Control; |
|
using KGIS.Framework.OpenData.Filter; |
|
using KGIS.Framework.OpenData.InterFace; |
|
using KGIS.Framework.Utils; |
|
using KGIS.Framework.Utils.ExtensionMethod; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.IO; |
|
using System.Runtime.InteropServices; |
|
using System.Windows; |
|
using KUI.Windows; |
|
using KGIS.Framework.Utils.Helper; |
|
|
|
namespace Kingo.Plugin.EngineEditor.View |
|
{ |
|
public partial class UCSetAttribute : BaseWindow |
|
{ |
|
private IHookHelper m_hookHelper;//获取地图控件和主窗体 |
|
private Dictionary<string, IFeatureLayer> keys { get; set; } |
|
private Dictionary<string, esriFieldType> keyValuePairs { get; set; } |
|
public IFeatureClass ExternalFeatureClass { get; set; } |
|
public UCSetAttribute(object Helpers) |
|
{ |
|
InitializeComponent(); |
|
try |
|
{ |
|
if (this.m_hookHelper == null) |
|
this.m_hookHelper = Helpers as IHookHelper; |
|
//获取当前工程中的全部图层 |
|
List<IFeatureLayer> featureLayers = MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>(); |
|
if (featureLayers != null && featureLayers.Count > 0) |
|
{ |
|
keys = new Dictionary<string, IFeatureLayer>(); |
|
foreach (IFeatureLayer iFeatureLayer in featureLayers) |
|
{ |
|
if (!keys.ContainsKey(iFeatureLayer.Name)) |
|
keys.Add(iFeatureLayer.Name, iFeatureLayer); |
|
} |
|
targetName.ItemsSource = keys.Keys; |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("UCSetAttribute异常:" + ex.Message); |
|
LogAPI.Debug("UCSetAttribute异常:" + ex.StackTrace); |
|
} |
|
} |
|
#region 目标图层切换事件 |
|
private void targetName_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
if (keys != null) |
|
{ |
|
IFeatureLayer featureLayer = keys[targetName.SelectedItem.ToTrim()]; |
|
if (featureLayer == null) return; |
|
IFields fields = featureLayer.FeatureClass.Fields; |
|
if (fields == null) return; |
|
keyValuePairs = new Dictionary<string, esriFieldType>(); |
|
for (int i = 0; i < fields.FieldCount; i++) |
|
{ |
|
IField field = fields.Field[i]; |
|
if (field.Name.StartsWith("SHAPE") || field.Name == "OBJECTID" || field.Name.ToUpper().Equals("BSM")) continue; |
|
if (keyValuePairs.ContainsKey(field.Name)) continue; |
|
keyValuePairs.Add(field.Name, field.Type); |
|
} |
|
targetField.ItemsSource = keyValuePairs.Keys; |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("targetName_SelectionChanged异常:" + ex.Message); |
|
LogAPI.Debug("targetName_SelectionChanged异常:" + ex.StackTrace); |
|
} |
|
} |
|
#endregion |
|
|
|
#region 目标字段切换事件 |
|
private void targetField_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
//根据选择的属性,判断数据类型 |
|
if (keyValuePairs == null) return; |
|
esriFieldType esriFieldType = keyValuePairs[targetField.SelectedItem.ToTrim()]; |
|
string strMask = string.Empty; |
|
switch (targetField.SelectedItem.ToTrim()) |
|
{ |
|
case "KCXS": |
|
strMask = @"0|0\.\d{3}"; |
|
break; |
|
} |
|
if (!string.IsNullOrEmpty(strMask)) |
|
{ |
|
AttributeValue.Mask = strMask; |
|
AttributeValue.MaskType = MaskType.RegEx; |
|
} |
|
else |
|
{ |
|
AttributeValue.MaskType = MaskType.None; |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("targetField_SelectionChanged异常:" + ex.Message); |
|
LogAPI.Debug("targetField_SelectionChanged异常:" + ex.StackTrace); |
|
} |
|
} |
|
#endregion |
|
|
|
#region 关闭窗体事件 |
|
private void BaseWindow_Closed(object sender, EventArgs e) |
|
{ |
|
try |
|
{ |
|
this.Close(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("BaseWindow_Closed异常:" + ex.Message); |
|
LogAPI.Debug("BaseWindow_Closed异常:" + ex.StackTrace); |
|
} |
|
} |
|
#endregion |
|
|
|
#region 选择外部数据 |
|
private void btnExternalData_Click(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
OpenDataDialog pDialog = new OpenDataDialog(); |
|
ISpatialDataObjectFilter pOFilter; |
|
pOFilter = new FilterDatasetsAndLayers(); |
|
pDialog.AddFilter(pOFilter, true); |
|
pDialog.Title = "选择导入的数据"; |
|
pDialog.AllowMultiSelect = false; |
|
pDialog.RestoreLocation = true; |
|
pDialog.StartLocation = pDialog.FinalLocation; |
|
System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog(); |
|
if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0) |
|
{ |
|
foreach (ISpatialDataObject distObj in pDialog.Selection) |
|
{ |
|
if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass) |
|
{ |
|
ExternalFeatureClass = (distObj.DatasetName as IName).Open() as IFeatureClass; |
|
externalDataPath.Text = distObj.FullName; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("btnExternalData_Click异常:" + ex.Message); |
|
LogAPI.Debug("btnExternalData_Click异常:" + ex.StackTrace); |
|
} |
|
} |
|
#endregion |
|
|
|
#region 确定 |
|
private void btnOK_Click(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
IFeatureCursor pCursor = null; |
|
IFeature feature = null; |
|
try |
|
{ |
|
if (string.IsNullOrEmpty(targetName.SelectedItem.ToTrim())) |
|
{ |
|
MessageBox.Show("请选择目标图层.", "提示信息", MessageBoxButton.OK); |
|
return; |
|
} |
|
if (string.IsNullOrEmpty(targetField.SelectedItem.ToTrim())) |
|
{ |
|
MessageBox.Show("请选择目标字段.", "提示信息", MessageBoxButton.OK); |
|
return; |
|
} |
|
if (string.IsNullOrEmpty(AttributeValue.Text.ToTrim())) |
|
{ |
|
MessageBoxResult result = MessageBox.Show($"【{targetField.SelectedItem.ToTrim()}】字段设置为空?", "提示信息", MessageBoxButton.YesNoCancel); |
|
if (result != MessageBoxResult.Yes) |
|
return; |
|
} |
|
if (string.IsNullOrEmpty(externalDataPath.Text.ToTrim())) |
|
{ |
|
MessageBox.Show("请选择要赋值的源图层数据.", "提示信息", MessageBoxButton.OK); |
|
return; |
|
} |
|
if (ExternalFeatureClass == null) |
|
{ |
|
MessageBox.Show($"未能打开【{externalDataPath.Text.ToTrim()}】,请检查数据是否正确.", "提示信息", MessageBoxButton.OK); |
|
return; |
|
} |
|
this.ShowLoading("正在进行批量赋值中........", 0, 0); |
|
System.Threading.Thread.Sleep(1000); |
|
IFeatureLayer UpdatefeatureLayer = keys[targetName.SelectedItem.ToTrim()]; |
|
var Externalcount = ExternalFeatureClass.FeatureCount(null); |
|
List<string> oids = new List<string>(); |
|
IField field = UpdatefeatureLayer.FeatureClass.Fields.get_Field(UpdatefeatureLayer.FeatureClass.FindField(targetField.SelectedItem.ToTrim())); |
|
if (field.Length < AttributeValue.Text.ToTrim().Length) |
|
{ |
|
this.CloseLoading(); |
|
MessageHelper.ShowError("当前值长度大于字段长度!"); |
|
return; |
|
} |
|
if (Externalcount <= 100) |
|
{ |
|
#region 用外部数据源的图形与要赋值的目标图层 数据量小的情况 |
|
pCursor = ExternalFeatureClass.Search(null, true); |
|
while ((feature = pCursor.NextFeature()) != null) |
|
{ |
|
var Identify2List = FeatureAPI.Identify2(feature.ShapeCopy, keys[targetName.SelectedItem.ToTrim()]); |
|
foreach (var item in Identify2List) |
|
{ |
|
oids.Add(item.OID.ToTrim()); |
|
} |
|
} |
|
#endregion |
|
} |
|
else |
|
{ |
|
#region 根据外部选择的数据源范围大小,数据量大小,可以使用GP工具 |
|
string gdbFileName = Guid.NewGuid().ToString().Replace("-", "") + ".gdb"; |
|
string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\External"; |
|
if (!Directory.Exists(gdbFolder)) |
|
Directory.CreateDirectory(gdbFolder); |
|
PluginServiceInterface.CommonHelper.DelectDir(gdbFolder); |
|
string path = System.IO.Path.Combine(gdbFolder, gdbFileName); |
|
IWorkspaceFactory pFtWsFct = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory(); |
|
IWorkspaceName workspaceName = pFtWsFct.Create(gdbFolder, gdbFileName, null, 0); |
|
#endregion |
|
IFeatureLayer FeatureLayer = null; |
|
GPParamClass gPParamClass = new GPParamClass |
|
{ |
|
FirstFeatureLayer = UpdatefeatureLayer, |
|
SecondFeatureLayer = new FeatureLayer() { FeatureClass = ExternalFeatureClass }, |
|
OutFeatureClassPath = path + "\\" + "External", |
|
IsGetOutPutFeature = true |
|
}; |
|
GeoprocessorHelper.IntersectAnalysis(gPParamClass, ref FeatureLayer); |
|
pCursor = FeatureLayer.Search(null, true); |
|
var fid = FeatureLayer.FeatureClass.FindField($"FID_{(UpdatefeatureLayer.FeatureClass as FeatureClass).Name}"); |
|
while ((feature = pCursor.NextFeature()) != null) |
|
{ |
|
if (fid != -1) |
|
oids.Add(feature.Value[fid].ToTrim()); |
|
} |
|
} |
|
string stroid = string.Join(",", oids); |
|
if (string.IsNullOrWhiteSpace(stroid)) |
|
{ |
|
MessageBox.Show($"赋值失败,当前图层数据间无相交关系,请核对数据是否正确", "提示信息", MessageBoxButton.OK); |
|
return; |
|
} |
|
string sql = string.Empty; |
|
try |
|
{ |
|
string strsetsql = string.IsNullOrEmpty(AttributeValue.Text.ToTrim()) || AttributeValue.Text.ToTrim().ToUpper() == "NULL" ? $"{targetField.SelectedItem.ToTrim()} =null " : $"{targetField.SelectedItem.ToTrim()} ='{AttributeValue.Text.ToTrim()}' "; |
|
sql = $"Update {(UpdatefeatureLayer.FeatureClass as FeatureClass).Name} set {strsetsql} where OBJECTID in ({stroid}) "; |
|
(keys[targetName.SelectedItem.ToTrim()].FeatureClass as FeatureClass).Workspace.ExecuteSQL(sql); |
|
} |
|
catch (Exception) |
|
{ |
|
string strsetsql = string.IsNullOrEmpty(AttributeValue.Text.ToTrim()) || AttributeValue.Text.ToTrim().ToUpper() == "NULL" ? $"{targetField.SelectedItem.ToTrim()} =null " : $"{targetField.SelectedItem.ToTrim()} ={AttributeValue.Text.ToTrim()}"; |
|
sql = $"Update {(UpdatefeatureLayer.FeatureClass as FeatureClass).Name} set {strsetsql} where OBJECTID in ({stroid}) "; |
|
(keys[targetName.SelectedItem.ToTrim()].FeatureClass as FeatureClass).Workspace.ExecuteSQL(sql); |
|
} |
|
this.CloseLoading(); |
|
MessageBox.Show($"属性赋值完成.", "提示信息", MessageBoxButton.OK); |
|
} |
|
catch (Exception ex) |
|
{ |
|
this.CloseLoading(); |
|
LogAPI.Debug("btnOK_Click异常:" + ex.Message); |
|
LogAPI.Debug("btnOK_Click异常:" + ex.StackTrace); |
|
} |
|
finally |
|
{ |
|
this.CloseLoading(); |
|
if (feature != null) |
|
Marshal.ReleaseComObject(feature); |
|
if (pCursor != null) |
|
Marshal.ReleaseComObject(pCursor); |
|
} |
|
} |
|
#endregion |
|
|
|
#region 取消 |
|
private void btnCancel1_Click(object sender, System.Windows.RoutedEventArgs e) |
|
{ |
|
try |
|
{ |
|
this.Close(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("btnCancel1_Click异常:" + ex.Message); |
|
LogAPI.Debug("btnCancel1_Click异常:" + ex.StackTrace); |
|
} |
|
} |
|
#endregion |
|
} |
|
|
|
}
|
|
|