年度变更建库软件5.0版本
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.

2187 lines
82 KiB

4 months ago
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using DevExpress.Xpf.Editors.Settings;
using DevExpress.Xpf.Grid;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
using KGIS.Framework.AE.GPHelper;
using KGIS.Framework.AE.ExtensionMethod;
using KGIS.Framework.Maps;
using KGIS.Framework.OpenData.Control;
using KGIS.Framework.OpenData.Filter;
using KGIS.Framework.OpenData.InterFace;
using KGIS.Framework.Platform;
using KGIS.Framework.Platform.Helper;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.ExtensionMethod;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Views;
using Kingo.PluginServiceInterface;
using KGIS.Plugin.BoundaryReadjust;
using ESRI.ArcGIS.ADF;
using Kingo.Plugin.BoundaryReadjust.EntityModel;
namespace Kingo.Plugin.BoundaryReadjust.View
{
/// <summary>
/// 国界,零米线调整的交互逻辑
/// </summary>
public partial class UCGJAndLMXAdjust : UserControl, IDockPanel2
{
private IFeatureLayer XZDLTB_Layer = null;
private IFeatureLayer XJXZQJX_Layer = null;
private IFeatureLayer JCDLTB_Layer = null;
private IFeatureLayer JCXZQ_Layer = null;
private IFeatureClass XJKZJX_FC = null;
public UCGJAndLMXAdjust()
{
InitializeComponent();
IsShowInMap = true;
DockAreas = DockStyle.DockBottom;
DockHeight = 380;
DefaultArea = DockStyle.DockBottom;
ShowCloseButton = true;
ShowAutoHideButton = false;
Title = "国界、零米线调整";
DevExpress.Xpf.Core.ThemeManager.SetTheme(this, DevExpress.Xpf.Core.Theme.Office2013LightGray);
txtBGHKZMJ.Text = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).DCMJ.ToTrim();
txtBGHHDKZMJ.Text = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).DCMJHD.ToTrim();
XJKZJX_FC = MapsManager.Instance.MapService.GetFeatureClassByName("XJKZJX");
XJXZQJX_Layer = GeoDBAPI.CreateFeatureLayerInmemeory("XJKZJX", "县级控制界线", (XJKZJX_FC as IGeoDataset).SpatialReference, XJKZJX_FC.ShapeType, XJKZJX_FC.Fields);
JXTZBGHelper.InsertDataToMemeoryLayer(XJKZJX_FC, XJXZQJX_Layer.FeatureClass, null);
LoadData();
}
#region 自定义/继承字段
private DataTable IntoData { get; set; }
private IFeatureClass targetFc { get; set; }
private List<DataModel> Data { get; set; }
public bool IsShowInMap { get; set; }
public Guid ID { get; set; }
public DockStyle DockAreas { get; set; }
public System.Drawing.Size FloatSize { get; set; }
public int DockWidth { get; set; }
public int DockHeight { get; set; }
public DockStyle DefaultArea { get; set; }
public bool ShowCloseButton { get; set; }
public bool ShowAutoHideButton { get; set; }
public string Title { get; set; }
System.Drawing.Size IDockPanel.FloatSize { get; set; }
public event EventHandler CloseViewHandler;
/// <summary>
/// 坐落单位字典
/// </summary>
private List<DataDicTionary> ZLDMdataDic = null;
#endregion
/// <summary>
/// 新增的地类图斑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelectXZDLTB_Click(object sender, RoutedEventArgs e)
{
string xzdltbPaths = "";
IFeatureClass dltbFc = GetFeatureClass("请选择新增的地类图斑数据", ref xzdltbPaths);
if (dltbFc != null)
{
this.btnSelectedDLTBPath.EditValue = xzdltbPaths;
XZDLTB_Layer = GeoDBAPI.CreateFeatureLayerInmemeory("XZDLTB", "新增地类图斑数据", (dltbFc as IGeoDataset).SpatialReference, dltbFc.ShapeType, dltbFc.Fields);
(XZDLTB_Layer.FeatureClass as ITable).DeleteSearchedRows(null);
JXTZBGHelper.InsertDataToMemeoryLayer(dltbFc, XZDLTB_Layer.FeatureClass, null);
}
}
/// <summary>
/// 列表勾选数目
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckBox_Click_1(object sender, RoutedEventArgs e)
{
try
{
if (dgInto.SelectedItem != null)
{
DataRowView dr = dgInto.SelectedItem as DataRowView;
if ((sender as CheckBox).IsChecked == true)
{
dr["IsValid"] = true;
}
else
{
dr["IsValid"] = false;
}
}
int length = 0;
foreach (DataRow item in (dgInto.ItemsSource as DataTable).Rows)
{
if (item[0].ToString() == "True")
{
length++;
}
}
lblCount.Content = "总条数:" + IntoData.Rows.Count + "/" + length;
int checknum = 0;
DataRow[] drs = (dgInto.ItemsSource as DataTable).Select("XZQTZLX='3'");
for (int i = 0; i < drs.Length; i++)
{
if (drs[i][0].ToString() == "True")
{
checknum++;
}
}
if (this.ckbCheckAll.IsChecked == true && drs.Length != checknum)
{
this.ckbCheckAll.IsChecked = false;
}
else if (this.ckbCheckAll.IsChecked == false && drs.Length == checknum)
{
this.ckbCheckAll.IsChecked = true;
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
}
/// <summary>
/// 得到要素类集合
/// </summary>
/// <param name="title"></param>
/// <param name="paths">路径集合</param>
public IFeatureClass GetFeatureClass(string title, ref string paths)
{
IFeatureClass result = null;
try
{
// 获取源数据
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter;
pOFilter = new FilterFeatureDatasetsAndFeatureClasses();
pDialog.AddFilter(pOFilter, true);
if (!string.IsNullOrWhiteSpace(title))
pDialog.Title = title;
else
pDialog.Title = "选择数据";
pDialog.AllowMultiSelect = false;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
if (pDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count > 0)
{
List<ISpatialDataObject> distObj = pDialog.Selection;
foreach (var obj in distObj)
{
if (obj.DatasetType == esriDatasetType.esriDTFeatureClass)
{
IFeatureClass featureclass = (obj.DatasetName as IName).Open() as IFeatureClass;
result = featureclass;
paths += obj.FullName;
}
}
}
return result;
}
catch (Exception ex)
{
LogAPI.Debug("选择数据失败:" + ex.Message.ToString());
return result;
}
}
private void DgInto_CustomColumnGroup(object sender, CustomColumnSortEventArgs e)
{
}
private void DgInto_AutoGeneratedColumns(object sender, RoutedEventArgs e)
{
GridControl grid = sender as GridControl;
foreach (GridColumn column in grid.Columns)
{
if (IntoData.Columns.Contains(column.FieldName))
{
string caption = IntoData.Columns[column.FieldName].Caption;
if (caption != null)
{
column.EditSettings = new TextEditSettings() { HorizontalContentAlignment = EditSettingsHorizontalAlignment.Left };
column.Header = caption;
}
}
}
}
private double BGQLDKZMJ = 0;
private double BGHLDKZMJ = 0;
private double BGQHDKZMJ = 0;
private double BGHHDKZMJ = 0;
/// <summary>
/// 确定按钮-提取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExtractData_Click(object sender, RoutedEventArgs e)
{
IFeatureClass jcdltbFC = null;//基础地类图斑
try
{
//变更前后的陆地和海岛的控制总面积
BGQLDKZMJ = txtBGQKZMJ.Text.ToDouble(2);
BGQHDKZMJ = txtBGQHDKZMJ.Text.ToDouble(2);
BGHLDKZMJ = txtBGHKZMJ.Text.ToDouble(2);
BGHHDKZMJ = txtBGHHDKZMJ.Text.ToDouble(2);
//初始加载的县级控制界限
if (XJXZQJX_Layer == null || XJXZQJX_Layer.FeatureClass.FeatureCount(null) == 0)
{
MessageHelper.ShowTips("未获取到县级控制界线图层/选择的调整后县级控制界线数据为空!");
return;
}
jcdltbFC = MapsManager.Instance.MapService.GetFeatureClassByName("DLTB");//基础地类图斑
if (jcdltbFC == null || jcdltbFC.FeatureCount(null) == 0)
{
MessageHelper.ShowTips("未获取到基础地类图斑/基础地类图斑数据为空.");
return;
}
//在内存上创建一个基础地类图斑用于后续操作
JCDLTB_Layer = GeoDBAPI.CreateFeatureLayerInmemeory("JC_DLTB", "基础地类图斑", (jcdltbFC as IGeoDataset).SpatialReference, jcdltbFC.ShapeType, jcdltbFC.Fields);
(JCDLTB_Layer.FeatureClass as ITable).DeleteSearchedRows(null);
JXTZBGHelper.InsertDataToMemeoryLayer(jcdltbFC, JCDLTB_Layer.FeatureClass, null);
//基础行政区与上同理
IFeatureClass xzqFc = MapsManager.Instance.MapService.GetFeatureClassByName("XZQ");
JCXZQ_Layer = GeoDBAPI.CreateFeatureLayerInmemeory("JCXZQ", "基础行政区", (xzqFc as IGeoDataset).SpatialReference, xzqFc.ShapeType, xzqFc.Fields);
(JCXZQ_Layer.FeatureClass as ITable).DeleteSearchedRows(null);
JXTZBGHelper.InsertDataToMemeoryLayer(xzqFc, JCXZQ_Layer.FeatureClass, null);
btnImportXZDLTB_Click();
Marshal.ReleaseComObject(JCDLTB_Layer.FeatureClass);
Marshal.ReleaseComObject(JCXZQ_Layer.FeatureClass);
Marshal.ReleaseComObject(JCDLTB_Layer);
Marshal.ReleaseComObject(JCXZQ_Layer);
JCDLTB_Layer = null;
JCXZQ_Layer = null;
ProgressHelper.CloseProcessBar();
}
catch (Exception ex)
{
ProgressHelper.CloseProcessBar();
LogAPI.Debug("行政区提取灭失图斑数据失败,异常信息如下:");
LogAPI.Debug(ex);
MessageHelper.ShowError("行政区提取灭失图斑数据失败:" + ex.Message.ToString());
}
finally
{
if (jcdltbFC != null)
Marshal.ReleaseComObject(jcdltbFC);
}
}
/// <summary>
/// 导入新增地类图斑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnImportXZDLTB_Click()
{
try
{
//存放结果在APP运行目录下
string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\GJLMXTZ";
if (!Directory.Exists(gdbFolder))
Directory.CreateDirectory(gdbFolder);
try
{
DelectDir(gdbFolder);//能删除就删除 删除报错不处理
}
catch
{ }
string gdbFileName = Guid.NewGuid().ToString() + ".gdb";
string path = System.IO.Path.Combine(gdbFolder, gdbFileName);
IWorkspaceFactory pFtWsFct = new FileGDBWorkspaceFactory();
IWorkspaceName workspaceName = pFtWsFct.Create(gdbFolder, gdbFileName, null, 0);
GPParamClass gPParamClass = new GPParamClass();
IWorkspaceAPI psTempWorkspaceAPI = new WorkspaceAPI(path, WorkspaceTypeEnum.GDBFile, true);
//将合并后的基础行政区与调整后控制界线进行联合
IFeatureLayer tempUnionxzqLayer = null;
gPParamClass = new GPParamClass
{
FirstFeatureLayer = XJXZQJX_Layer,
SecondFeatureLayer = JCXZQ_Layer,
OutFeatureClassPath = path + "\\" + "TempXZQUnion",
IsGetOutPutFeature = true
};
GeoprocessorHelper.UnionAnalysis(gPParamClass, ref tempUnionxzqLayer);//获取灭失和新增的图斑
Data = new List<DataModel>();
IQueryFilter queryfilter = new QueryFilterClass();
queryfilter.WhereClause = string.Format("FID_XJKZJX=-1");//获取灭失图形
IFeatureCursor msCursor = tempUnionxzqLayer.FeatureClass.Search(queryfilter, true);
IFeature msxzqFearure = null;
while ((msxzqFearure = msCursor.NextFeature()) != null)
{
ExtractMSData(msxzqFearure.ShapeCopy);//暂存在DATA中
Marshal.ReleaseComObject(msxzqFearure);
}
//陆地-海岛灭失数据-陆地-海岛新增图斑
double LDMSMJ = Data.Where(w => w.IsOut && w.MSSM == "00").Sum(s => s.BGMJ);
double HDMSMJ = Data.Where(w => w.IsOut && w.MSSM == "01").Sum(s => s.BGMJ);
double LDXZMJ = Math.Round(BGHLDKZMJ - (BGQLDKZMJ - LDMSMJ).ToDouble(2), 2);
double HDXZMJ = Math.Round(BGHHDKZMJ - (BGQHDKZMJ - HDMSMJ).ToDouble(2), 2);
if (tempUnionxzqLayer.FeatureClass.FeatureCount(queryfilter) != 0) MSDataInsertXZQTQTB();
queryfilter.WhereClause = string.Format("FID_JCXZQ=-1");//获取新增图形
IFeatureCursor xzCursor = tempUnionxzqLayer.FeatureClass.Search(queryfilter, true);
IFeature xzxzqFearure = null;
while ((xzxzqFearure = xzCursor.NextFeature()) != null)
{
ExtractXZData(xzxzqFearure.ShapeCopy);//添加新增数据到Data
Marshal.ReleaseComObject(xzxzqFearure);
}
//新增陆地/海岛面积
double PCQ_LDXZMJ = Data.Where(w => w.IsAdd && w.MSSM == "00").Sum(s => s.BGMJ);
double PCQ_HDXZMJ = Data.Where(w => w.IsAdd && w.MSSM == "01").Sum(s => s.BGMJ);
#region 新增地类图斑面积平差
while ((PCQ_LDXZMJ - LDXZMJ).ToDecimal(2) != 0)
{
double mjc = Math.Round(LDXZMJ - PCQ_LDXZMJ, 2);
Data = Data.OrderByDescending(o => o.BGMJ).ToList();
foreach (var item in Data)
{
if (!item.IsAdd) continue;
if (mjc < 0)
{
item.BGMJ = Math.Round(item.BGMJ - 0.01, 2);
mjc = Math.Round(mjc + 0.01, 2);
}
else
{
item.BGMJ = Math.Round(item.BGMJ + 0.01, 2);
mjc = Math.Round(mjc - 0.01, 2);
}
if (mjc == 0)
break;
}
PCQ_LDXZMJ = Data.Where(w => w.IsAdd && w.MSSM == "00").Sum(s => s.BGMJ);
}
while ((PCQ_HDXZMJ - HDXZMJ).ToDecimal(2) != 0)
{
double mjc = Math.Round(HDXZMJ - PCQ_HDXZMJ, 2);
Data = Data.OrderByDescending(o => o.BGMJ).ToList();
foreach (var item in Data)
{
if (!item.IsAdd) continue;
if (mjc < 0)
{
item.BGMJ = Math.Round(item.BGMJ - 0.01, 2);
mjc = Math.Round(mjc + 0.01, 2);
}
else
{
item.BGMJ = Math.Round(item.BGMJ + 0.01, 2);
mjc = Math.Round(mjc - 0.01, 2);
}
if (mjc == 0)
break;
}
PCQ_HDXZMJ = Data.Where(w => w.IsAdd && w.MSSM == "01").Sum(s => s.BGMJ);
}
#endregion
if (tempUnionxzqLayer.FeatureClass.FeatureCount(queryfilter) != 0)
{
XZDataInsertXZQTQTB();
}
LoadData();
ProgressHelper.CloseProcessBar();
MessageHelper.Show("国界零米线调整完成!!");
}
catch (Exception ex)
{
ProgressHelper.CloseProcessBar();
LogAPI.Debug("国界零米线调整失败,异常信息如下:");
LogAPI.Debug(ex);
MessageHelper.ShowError("国界零米线调整失败:" + ex.Message.ToString());
}
}
/// <summary>
/// 删除文件夹以及子文件夹与子文件-
/// </summary>
/// <param name="srcPath"></param>
private void DelectDir(string srcPath)
{
try
{
DirectoryInfo dir = new DirectoryInfo(srcPath);
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录
foreach (FileSystemInfo i in fileinfo)
{
if (i is DirectoryInfo) //判断是否文件夹
{
DirectoryInfo subdir = new DirectoryInfo(i.FullName);
subdir.Delete(true); //删除子目录和文件
}
else
{
File.Delete(i.FullName); //删除指定文件
}
}
}
catch (Exception)
{
throw;
}
}
#region 提取灭失图斑
private void ExtractMSData(IGeometry msGeo)
{
IGeometry tempGeo = msGeo;
ITopologicalOperator topo = msGeo as ITopologicalOperator;
tempGeo = topo.Buffer(-.01);
List<IFeature> features = FeatureAPI.Identify(tempGeo, JCDLTB_Layer);
IGeometry tempGeo_B = topo.Buffer(0.01);
IRelationalOperator rele = tempGeo_B as IRelationalOperator;
int zldmindex = JCDLTB_Layer.FeatureClass.FindField("ZLDWDM");
int zlmcindex = JCDLTB_Layer.FeatureClass.FindField("ZLDWMC");
int tbmjindex = JCDLTB_Layer.FeatureClass.FindField("TBMJ");
int mssmindex = JCDLTB_Layer.FeatureClass.FindField("MSSM");
int completeCount = 0;
double completeSumMJ = 0;
int splitCount = 0;
double splitSumMJ = 0;
foreach (var f in features)
{
DataModel modelItem = new DataModel();
modelItem.TC = "DLTB";
if (rele.Contains(f.ShapeCopy))//灭失图斑是否包含当前压盖到的基础地类图斑;
{
Data.Add(modelItem);
modelItem.IsCompleteOut = true;
modelItem.DLTBOid = f.OID;
modelItem.IsOut = true;
if (zldmindex != -1)
{
modelItem.CJDCQInfo = f.Value[zlmcindex].ToTrim() + "-" + f.Value[zldmindex].ToTrim().Substring(0, 12);
modelItem.XZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 9);
modelItem.XJXZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 6);
}
modelItem.BGMJ = f.Value[tbmjindex].ToDouble();
modelItem.MSSM = f.Value[mssmindex].ToTrim();
modelItem.Geo = f.ShapeCopy;
completeCount++;
completeSumMJ += modelItem.BGMJ;
continue;
}
else
{
double kzmj = f.Value[tbmjindex].ToDouble();
splitCount++;
IGeometry geo = FeatureAPI.InterSect(f.ShapeCopy, msGeo);//取地类图斑与,灭失图斑相交的部分
List<IGeometry> geoList = FeatureAPI.DissolveGeometryByRing(geo);
List<DataModel> dataList = new List<DataModel>();
foreach (var item in geoList)
{
DataModel model = new DataModel();
dataList.Add(model);
model.TC = "DLTB";
model.Geo = item;
model.BGMJ = (item as IPolygon).GetEllipseArea();
model.IsOut = true;
model.DLTBOid = f.OID;
model.CJDCQInfo = f.Value[zlmcindex].ToTrim() + "-" + f.Value[zldmindex].ToTrim().Substring(0, 12);
model.XZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 9);
model.XJXZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 6);
model.MSSM = f.Value[mssmindex].ToTrim();
}
IGeometry geo_out = FeatureAPI.Difference(f.ShapeCopy, msGeo);//地类图斑擦除灭失图斑
geoList = FeatureAPI.DissolveGeometryByRing(geo_out);
foreach (var item in geoList)
{
DataModel model = new DataModel();
dataList.Add(model);
model.TC = "DLTB";
model.Geo = item;
model.BGMJ = (item as IPolygon).GetEllipseArea();
model.DLTBOid = f.OID;
model.CJDCQInfo = f.Value[zlmcindex].ToTrim() + "-" + f.Value[zldmindex].ToTrim().Substring(0, 12);
model.XZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 9);
model.XJXZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 6);
model.MSSM = f.Value[mssmindex].ToTrim();
}
JXTZBGHelper.AreaAdjustment<DataModel>(dataList, "BGMJ", kzmj);
splitSumMJ += dataList.Where(w => w.IsOut).Sum(s => s.BGMJ);
Data.AddRange(dataList);
}
}
}
private void ExtractXZData(IGeometry msGeo)
{
IGeometry tempGeo = msGeo;
ITopologicalOperator topo = msGeo as ITopologicalOperator;
tempGeo = topo.Buffer(-.01);
//压盖的是新增地类图斑
List<IFeature> features = FeatureAPI.Identify(tempGeo, XZDLTB_Layer);
IGeometry tempGeo_B = topo.Buffer(0.01);
IRelationalOperator rele = tempGeo_B as IRelationalOperator;
int zldmindex = XZDLTB_Layer.FeatureClass.FindField("ZLDWDM");
int zlmcindex = XZDLTB_Layer.FeatureClass.FindField("ZLDWMC");
int tbmjindex = XZDLTB_Layer.FeatureClass.FindField("TBMJ");
int mssmindex = XZDLTB_Layer.FeatureClass.FindField("MSSM");
int completeCount = 0;
double completeSumMJ = 0;
int splitCount = 0;
double splitSumMJ = 0;
//Data.Clear();
foreach (var f in features)
{
DataModel modelItem = new DataModel();
modelItem.TC = "DLTB";
if (rele.Contains(f.ShapeCopy))//rele灭失图斑
{
Data.Add(modelItem);
modelItem.IsCompleteOut = true;
modelItem.DLTBOid = f.OID;
modelItem.IsAdd = true;
if (zldmindex != -1)
{
string zldm = f.Value[zldmindex].ToTrim();
modelItem.CJDCQInfo = f.Value[zlmcindex].ToTrim() + "-" + (zldm.Length > 12 ? zldm.Substring(0, 12) : zldm);
modelItem.XZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 9);
modelItem.XJXZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 6);
}
modelItem.BGMJ = (f.ShapeCopy as IPolygon).GetEllipseArea();
if (mssmindex != -1)
modelItem.MSSM = f.Value[mssmindex].ToTrim();
modelItem.Geo = f.ShapeCopy;
completeCount++;
completeSumMJ += modelItem.BGMJ;
continue;
}
else
{
double kzmj = f.Value[tbmjindex].ToDouble();
splitCount++;
IGeometry geo = FeatureAPI.InterSect(f.ShapeCopy, msGeo);
List<IGeometry> geoList = FeatureAPI.DissolveGeometryByRing(geo);
List<DataModel> dataList = new List<DataModel>();
foreach (var item in geoList)
{
DataModel model = new DataModel();
dataList.Add(model);
model.TC = "DLTB";
model.Geo = item;
model.BGMJ = (item as IPolygon).GetEllipseArea();
model.IsAdd = true;
model.DLTBOid = f.OID;
model.CJDCQInfo = f.Value[zlmcindex].ToTrim() + "-" + f.Value[zldmindex].ToTrim().Substring(0, 12);
model.XZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 9);
model.XJXZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 6);
if (mssmindex != -1)
modelItem.MSSM = f.Value[mssmindex].ToTrim();
}
IGeometry geo_out = FeatureAPI.Difference(f.ShapeCopy, msGeo);
geoList = FeatureAPI.DissolveGeometryByRing(geo_out);
foreach (var item in geoList)
{
DataModel model = new DataModel();
dataList.Add(model);
model.TC = "DLTB";
model.Geo = item;
model.IsOut = false;
model.BGMJ = (item as IPolygon).GetEllipseArea();
model.DLTBOid = f.OID;
model.CJDCQInfo = f.Value[zlmcindex].ToTrim() + "-" + f.Value[zldmindex].ToTrim().Substring(0, 12);
model.XZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 9);
model.XJXZQInfo = f.Value[zldmindex].ToTrim().Substring(0, 6);
if (mssmindex != -1)
modelItem.MSSM = f.Value[mssmindex].ToTrim();
}
JXTZBGHelper.AreaAdjustment<DataModel>(dataList, "BGMJ", kzmj);
splitSumMJ += dataList.Where(w => w.IsOut).Sum(s => s.BGMJ);
foreach (var item in dataList)
{
if (item.IsOut)
Data.Add(item);
}
//Data.AddRange(dataList);
}
}
}
/// <summary>
/// 灭失数据导入变更层
/// </summary>
private void MSDataInsertXZQTQTB()
{
IFeatureClass jcFc = JCDLTB_Layer.FeatureClass;
IFeatureClass tzFc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG");
IFeatureCursor tzCursor = tzFc.Insert(true);
try
{
(tzFc as ITable).DeleteSearchedRows(new QueryFilterClass() { WhereClause = "XZQTZLX='4'" });
foreach (var item in Data)
{
try
{
if (item.IsOut)
{
IFeature jc_f = jcFc.GetFeature(item.DLTBOid);
IFeatureBuffer gxBuff = CreateXzqGxFeature(jc_f, item.Geo, tzFc, false, "");
int index = gxBuff.Fields.FindField("XZQTZLX");
if (index != -1)
gxBuff.Value[index] = "4";
int bgmjIndex = gxBuff.Fields.FindField("TBMJ");
if (bgmjIndex != -1)
gxBuff.Value[bgmjIndex] = item.BGMJ;
tzCursor.InsertFeature(gxBuff);
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
}
tzCursor.Flush();
}
catch (Exception ex)
{
ProgressHelper.CloseProcessBar();
MessageHelper.ShowError(ex.Message);
LogAPI.Debug(ex);
}
finally
{
if (tzCursor != null)
Marshal.ReleaseComObject(tzCursor);
}
}
private void XZDataInsertXZQTQTB()
{
IFeatureClass jcFc = XZDLTB_Layer.FeatureClass;
IFeatureClass tzFc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG");
IFeatureCursor tzCursor = tzFc.Insert(true);
try
{
(tzFc as ITable).DeleteSearchedRows(new QueryFilterClass() { WhereClause = "XZQTZLX='3'" });
foreach (var item in Data)
{
try
{
if (item.IsAdd)
{
IFeature jc_f = jcFc.GetFeature(item.DLTBOid);
IFeatureBuffer gxBuff = CreateXzqGxFeature(jc_f, item.Geo, tzFc, false, "");
int index = gxBuff.Fields.FindField("XZQTZLX");
if (index != -1)
gxBuff.Value[index] = "3";
int bgmjIndex = gxBuff.Fields.FindField("TBMJ");
if (bgmjIndex != -1)
gxBuff.Value[bgmjIndex] = item.BGMJ;
tzCursor.InsertFeature(gxBuff);
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
}
}
tzCursor.Flush();
IFeatureClass _XZQTZQJCTB = MapsManager.Instance.MapService.GetFeatureClassByName("XZQTZQJCTB");
IQueryFilter filter = new QueryFilterClass();
filter.WhereClause = "XZQTZLX = '3'";
(_XZQTZQJCTB as ITable).DeleteSearchedRows(null);
JXTZBGHelper.InsertDataToMemeoryLayer(tzFc, _XZQTZQJCTB, filter);
}
catch (Exception ex)
{
ProgressHelper.CloseProcessBar();
MessageHelper.ShowError(ex.Message);
LogAPI.Debug(ex);
}
finally
{
if (tzCursor != null)
Marshal.ReleaseComObject(tzCursor);
}
}
private IFeatureBuffer CreateXzqGxFeature(IFeature jc_F, IGeometry Geo, IFeatureClass gxFc, bool IsTXBG, string strXZQDM)
{
IFeatureBuffer buff = gxFc.CreateFeatureBuffer();
buff.Shape = Geo;
for (int i = 0; i < buff.Fields.FieldCount; i++)
{
IField field = buff.Fields.Field[i];
if (field.Name.ToUpper().Contains("SHAPE") || !field.Editable) continue;
int _Index = -1;// jc_F.Fields.FindField("XZQDM");
if (IsTXBG && field.Name == "BSM")
{
continue;
}
if (field.Name == "DCMJ")
{
_Index = jc_F.Fields.FindField(field.Name);
double bgqdcmj = jc_F.Value[_Index].ToDouble(2);
if (strXZQDM.Length == 9)
buff.Value[i] = (bgqdcmj - Data.Where(w => w.XZQInfo.Contains(strXZQDM) && w.IsOut).Sum(s => s.BGMJ)).ToDouble(2);
else if (strXZQDM.Length >= 12)
buff.Value[i] = (bgqdcmj - Data.Where(w => w.CJDCQInfo.Contains(strXZQDM.Substring(0, 12)) && w.IsOut).Sum(s => s.BGMJ)).ToDouble(2);
continue;
}
_Index = jc_F.Fields.FindField(field.Name);
if (_Index != -1)
{
buff.Value[i] = jc_F.Value[_Index];
}
}
return buff;
}
#endregion
/// <summary>
/// 定位按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void KFontIconButton_Click(object sender, RoutedEventArgs e)
{
try
{
DataRowView obj = (sender as KUI.KFontIconButton).Tag as DataRowView;
string layerName = "DLTBBG";
MapsManager.Instance.MapService.SelectFeature(layerName, obj["OBJECTID"].ToTrim(), true);
}
catch (Exception ex)
{
MessageHelper.Show("定位失败!" + ex.Message);
}
}
/// <summary>
/// 全选行政区调整类型为3的数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ckbCheckAll_Click(object sender, RoutedEventArgs e)
{
try
{
DataRow[] drs = (dgInto.ItemsSource as DataTable).Select("XZQTZLX='3'");
if (this.ckbCheckAll.IsChecked == true)
{
if (drs != null && drs.Length != 0)
{
for (int i = 0; i < drs.Length; i++)
{
DataRow row = drs[i];
row["IsValid"] = true;
}
}
}
else
{
if (drs != null && drs.Length != 0)
{
for (int i = 0; i < drs.Length; i++)
{
DataRow row = drs[i];
row["IsValid"] = false;
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug("新增地类图斑坐落统赋:" + ex);
MessageHelper.ShowError("新增地类图斑坐落统赋:" + ex.Message);
}
}
/// <summary>
/// 新增图斑坐落统赋
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SetZLDW_Click(object sender, RoutedEventArgs e)
{
try
{
if (cobZLDW.SelectedItemValue != null)
{
DataRow[] drs = (dgInto.ItemsSource as DataTable).Select("IsValid=True");
if (drs.Length == 0)
{
MessageHelper.Show("未选中需要坐落统赋的新增图斑!!");
return;
}
string where = string.Format("XZQTZLX='3'");
SetAttribute("ZLDWDM", (cobZLDW.SelectedItem as DataDicTionary).CODE, where);
SetAttribute("ZLDWMC", (cobZLDW.SelectedItem as DataDicTionary).NAME, where);
LoadData();
}
else
{
MessageHelper.ShowTips("请选择坐落单位!");
}
}
catch (Exception ex)
{
LogAPI.Debug("新增地类图斑坐落统赋:" + ex);
MessageHelper.ShowError("新增地类图斑坐落统赋:" + ex);
}
}
/// <summary>
/// 设置属性
/// </summary>
/// <param name="pFieldName">字段名称</param>
/// <param name="pValue">赋予值</param>
/// <param name="pWhere">赋值条件</param>
/// <param name="pJCFieldName">基础库字段名称</param>
private void SetAttribute(string pFieldName, string pValue, string pWhere = "", string pJCFieldName = "")
{
DataRow[] drs = (dgInto.ItemsSource as DataTable).Select("IsValid=True");
IQueryFilter filter = null;
if (!string.IsNullOrWhiteSpace(pWhere))
filter = new QueryFilterClass() { WhereClause = pWhere };
IFeatureCursor cursor = targetFc.Update(filter, true);
try
{
IFeature f = null;
int index = targetFc.Fields.FindField(pFieldName);
if (index == -1)
return;
while ((f = cursor.NextFeature()) != null)
{
drs = (dgInto.ItemsSource as DataTable).Select("OBJECTID=" + f.Value[targetFc.FindField("OBJECTID")]);
if (drs != null && drs.Length > 0 && drs[0]["IsValid"].ToString() != "True")
continue;
if (string.IsNullOrWhiteSpace(pValue) && !string.IsNullOrWhiteSpace(pJCFieldName))
{
int sIndex = targetFc.FindField(pJCFieldName);
if (sIndex != -1)
f.Value[index] = f.Value[sIndex];
}
else
{
f.Value[index] = pValue;
}
cursor.UpdateFeature(f);
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
}
/// <summary>
/// 新增图斑权属统赋
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SetQSDW_Click(object sender, RoutedEventArgs e)
{
try
{
DataRow[] drs = (dgInto.ItemsSource as DataTable).Select("IsValid=True");
if (drs.Length == 0)
{
MessageHelper.Show("未选中需要权属统赋的新增图斑!!");
return;
}
string where = string.Format("XZQTZLX='3'");
object o = cobQSDWLX.EditValue;
switch (o.ToTrim())
{
case "随坐落变化":
SetAttribute("QSDWDM", "", where, "ZLDWDM");
SetAttribute("QSDWMC", "", where, "ZLDWMC");
SetAttribute("FRDBS", "0", where);
break;
case "随坐落变化(飞入地除外)":
where = string.Format("XZQTZLX='3' and FRDBS = '0'");
SetAttribute("QSDWDM", "", where, "ZLDWDM");
SetAttribute("QSDWMC", "", where, "ZLDWMC");
break;
case "继承原有权属":
SetAttribute("QSDWDM", "", where, "QSDWDM");
SetAttribute("QSDWMC", "", where, "QSDWMC");
break;
default:
break;
}
LoadData();
}
catch (Exception ex)
{
LogAPI.Debug("新增地类图斑权属统赋失败:" + ex);
MessageHelper.ShowError("新增地类图斑权属统赋失败:" + ex);
}
}
/// <summary>
/// 加载视图数据
/// </summary>
private void LoadData()
{
IFeatureCursor cursor = null;
IFeature xzqtqtbFeature = null;
try
{
targetFc = MapsManager.Instance.MapService.GetFeatureClassByName("DLTBBG");
if (targetFc == null)
{
return;
}
IntoData = new DataTable();
ConstructColumn(targetFc.Fields);
IQueryFilter queryfilter = new QueryFilterClass();
queryfilter.WhereClause = string.Format("XZQTZLX='3' or XZQTZLX='4'");
cursor = targetFc.Search(queryfilter, true);
while ((xzqtqtbFeature = cursor.NextFeature()) != null)
{
DataRow dr = IntoData.NewRow();
bool IsInto = true;
dr[0] = false;
for (int i = 0; i < IntoData.Columns.Count; i++)
{
if (i == 0)
{
dr[i] = false;
continue;
}
object obj = xzqtqtbFeature.get_Value((int)IntoData.Columns[i].ExtendedProperties["index"]);
if (obj == null)
{
continue;
}
else
{
if ((obj.ToString()).Contains("1899/12/30 0:00:00"))
{
obj = System.DBNull.Value;
}
}
if (obj is string)
{
obj = obj.ToString().Trim();
}
dr[i] = obj;
}
if (IsInto)
IntoData.Rows.Add(dr);
Marshal.ReleaseComObject(xzqtqtbFeature);
}
dgInto.ItemsSource = null;
dgInto.ItemsSource = IntoData;
dgInto.ClearGrouping();
dgInto.GroupBy("XZQTZLX", true);
lblCount.Content = "总条数:" + IntoData.Rows.Count + "/0";
if (this.ckbCheckAll.IsChecked == true)
{
this.ckbCheckAll.IsChecked = false;
}
//绑定权属字典
if (ZLDMdataDic == null)
{
ZLDMdataDic = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.QSDM);
if (ZLDMdataDic == null)
{
MessageHelper.Show("权属字典未生成!");
}
else
{
ZLDMdataDic = ZLDMdataDic.Where(x => x.CODE.Length == 19).ToList();
}
}
cobZLDW.ItemsSource = ZLDMdataDic;
cobZLDW.DisplayMember = "NAME";
cobZLDW.ValueMember = "CODE";
}
catch (Exception ex)
{
LogAPI.Debug("加载行政区提取图斑层数据失败,异常信息如下:");
LogAPI.Debug(ex);
MessageHelper.ShowError("加载行政区提取图斑层数据失败:" + ex.Message);
}
finally
{
if (cursor != null)
{
Marshal.ReleaseComObject(cursor);
}
}
}
/// <summary>
/// 构造列获取记录条数
/// </summary>
/// <param name="fields"></param>
private void ConstructColumn(IFields fields)
{
if (fields != null)
{
IntoData = new DataTable();
DataColumn col1 = new DataColumn();
col1.ColumnName = "IsValid";
col1.Caption = "选中";
col1.DataType = typeof(bool);
IntoData.Columns.Add(col1);
for (int i = 0; i < fields.FieldCount; i++)
{
IField field = fields.get_Field(i);
if (field.Name.ToUpper().StartsWith("SHAPE"))
continue;
DataColumn col = new DataColumn();
col.ExtendedProperties.Add("index", i);
col.ColumnName = field.Name;
col.Caption = field.AliasName;
switch (field.Type)
{
case esriFieldType.esriFieldTypeSmallInteger:
col.DataType = typeof(short);
break;
case esriFieldType.esriFieldTypeInteger:
col.DataType = typeof(int);
break;
case esriFieldType.esriFieldTypeSingle:
break;
case esriFieldType.esriFieldTypeDouble:
col.DataType = typeof(double);
break;
case esriFieldType.esriFieldTypeString:
col.DataType = typeof(string);
break;
case esriFieldType.esriFieldTypeDate:
col.DataType = typeof(DateTime);
break;
case esriFieldType.esriFieldTypeOID:
col.DataType = typeof(Int32);
break;
case esriFieldType.esriFieldTypeGeometry:
break;
case esriFieldType.esriFieldTypeBlob:
break;
case esriFieldType.esriFieldTypeRaster:
break;
case esriFieldType.esriFieldTypeGUID:
break;
case esriFieldType.esriFieldTypeGlobalID:
break;
case esriFieldType.esriFieldTypeXML:
break;
default:
break;
}
col.ReadOnly = !field.Editable;//编辑状态启用默认是否可以编辑
IntoData.Columns.Add(col);
Marshal.ReleaseComObject(field);
}
}
}
public void ClosePanel()
{
Platform.Instance.CloseView(this);
}
public void ClosePanelInvoke()
{
CloseViewHandler?.Invoke(null, null);
}
public void ShowPanel()
{
Platform.Instance.OpenView(this, false);
MapsManager.Instance.MapService.ProjectClosed += (s, e) =>
{
this.ClosePanel();
};
}
}
public class XZQGXAttribute2
{
public string TempBSMPrefix { get; set; }
public string BSM
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("BSM"))
{
return FieldsValue["BSM"].ToTrim();
}
return "";
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("BSM"))
{
FieldsValue["BSM"] = value;
}
else
{
FieldsValue.Add("BSM", value);
}
}
}
public string BGTBOID { get; set; }
public bool IsUpdate { get; set; }
public int UpdateOID { get; set; }
private List<XZQGXGCAttribute2> _GCDataList;
public List<XZQGXGCAttribute2> GCDataList
{
get
{
if (_GCDataList == null)
_GCDataList = new List<XZQGXGCAttribute2>();
return _GCDataList;
}
set
{
_GCDataList = value;
}
}
private IGeometry _Shape;
public IGeometry Shape
{
get
{
if (_GCDataList != null)
{
_Shape = UnionGXGC();
}
return _Shape;
}
set { _Shape = value; }
}
public IGeometry Shape2
{
get;
set;
}
public Dictionary<string, int> FieldsIndex { get; set; }
public Dictionary<string, object> FieldsValue { get; set; }
public XZQGXAttribute2(Dictionary<string, int> pFieldsIndex, XZQGXGCAttribute2 pGXGCData)
{
this.FieldsIndex = pFieldsIndex;
if (pGXGCData == null)
return;
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in FieldsIndex.Keys)
{
string bghAttr = "BGH" + item;
if (!pGXGCData.FieldsValue.Keys.Contains(bghAttr))
{
bghAttr = "BGHTB" + item;
}
if (!pGXGCData.FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue.Add(item, null);
continue;
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pGXGCData.FieldsValue[bghAttr];
}
else
{
FieldsValue.Add(item, pGXGCData.FieldsValue[bghAttr]);
}
}
TempBSMPrefix = pGXGCData.TempBSMPrefix;
BGTBOID = pGXGCData.BGTBOID;
Shape = pGXGCData.Shape;
}
public XZQGXAttribute2(Dictionary<string, int> pFieldsIndex)
{
FieldsIndex = pFieldsIndex;
}
public void SetAttribure(IFeature pFeature, Dictionary<string, int> pFieldsIndex = null)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
Shape = pFeature.ShapeCopy;
Dictionary<string, int> fields = FieldsIndex;
if (pFieldsIndex != null)
fields = pFieldsIndex;
foreach (var item in fields.Keys)
{
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[FieldsIndex[item]].ToTrim();
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[FieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[FieldsIndex[item]]);
}
}
}
public void SetAttribureNew(IFeature pFeature, Dictionary<string, int> pFieldsIndex = null)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
Shape = pFeature.ShapeCopy;
Dictionary<string, int> fields = FieldsIndex;
if (pFieldsIndex != null)
{
FieldsIndex = pFieldsIndex;
fields = pFieldsIndex;
}
foreach (var item in fields.Keys)
{
if (item == "OBJECTID" || item == "FID")
{
continue;
}
if (pFieldsIndex != null)
{
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[pFieldsIndex[item]].ToTrim();
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[pFieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[pFieldsIndex[item]]);
}
}
else
{
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[FieldsIndex[item]].ToTrim();
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[FieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[FieldsIndex[item]]);
}
}
}
}
public bool IsEqual(XZQGXAttribute2 pData)
{
bool result = true;
if (FieldsValue == null || pData.FieldsValue == null)
{
result = false;
return result;
}
foreach (var item in FieldsIndex.Keys)
{
if ("SHAPE,BGTBOID,GXSJ,BSM,YSDM".Contains(item) || item.Contains("MJ"))
continue;
if (!pData.FieldsValue.Keys.Contains(item)) continue;
if (!Equals(FieldsValue[item], pData.FieldsValue[item]))
{
result = false;
break;
}
}
return result;
}
private bool Equals(object obj1, object obj2)
{
if (obj1 == null || obj1 is DBNull)
{
obj1 = "";
}
if (obj2 == null || obj2 is DBNull)
{
obj2 = "";
}
if (obj2.ToString() == "0")
obj2 = "";
if (obj1.ToString() == "0")
obj1 = "";
if (obj1.ToTrim() == obj2.ToTrim())
{
return true;
}
return false;
}
private IGeometry UnionGXGC()
{
IGeometry result = null;
List<int> updateOIDs = new List<int>();
foreach (var item in _GCDataList)
{
if (item.Shape == null || item.Shape.IsEmpty)
{
continue;
}
if (item.IsUpdate)
{
if (updateOIDs.Contains(item.UpdateOID))
{
continue;
}
updateOIDs.Add(item.UpdateOID);
}
if (result == null)
{
result = item.Shape;
}
else
{
ITopologicalOperator topo = result as ITopologicalOperator;
topo.Simplify();
ITopologicalOperator topo2 = item.Shape as ITopologicalOperator;
topo2.Simplify();
IGeometry result2 = topo.Union(item.Shape);
result = result2;
}
}
return result;
}
}
public class XZQGXGCAttribute2
{
public string TempBSMPrefix { get; set; }
public string BGTBOID
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("BGTBOID"))
{
return FieldsValue["BGTBOID"].ToTrim();
}
return "";
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("BGTBOID"))
{
FieldsValue["BGTBOID"] = value;
}
else
{
FieldsValue.Add("BGTBOID", value);
}
}
}
public bool IsUpdate { get; set; }
public int UpdateOID { get; set; }
public string BGHBSM
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("BGHBSM"))
{
return FieldsValue["BGHBSM"].ToTrim();
}
return "";
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("BGHBSM"))
{
FieldsValue["BGHBSM"] = value;
}
else
{
FieldsValue.Add("BGHBSM", value);
}
}
}
/// <summary>
/// 变更行为
/// </summary>
public string BGXW { get; set; }
/// <summary>
/// 变更面积
/// </summary>
public double BGMJ
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("TBBGMJ"))
{
return FieldsValue["TBBGMJ"].ToDouble();
}
return 0;
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("TBBGMJ"))
{
FieldsValue["TBBGMJ"] = value;
}
else
{
FieldsValue.Add("TBBGMJ", value);
}
}
}
public Dictionary<string, int> FieldsIndex { get; set; }
public Dictionary<string, object> FieldsValue { get; set; }
public XZQGXGCAttribute2()
{
}
public XZQGXGCAttribute2(IFields pFields)
{
if (FieldsIndex == null)
FieldsIndex = new Dictionary<string, int>();
using (ComReleaser releaser = new ComReleaser())
{
for (int i = 0; i < pFields.FieldCount; i++)
{
IField field = pFields.Field[i];
releaser.ManageLifetime(field);
if (!field.Editable || field.Name.ToUpper().Contains("SHAPE")) continue;
FieldsIndex.Add(field.Name.ToUpper(), i);
}
}
}
public XZQGXGCAttribute2(Dictionary<string, int> pFieldsIndex)
{
this.FieldsIndex = pFieldsIndex;
}
public IGeometry Shape { get; set; }
public void SetBGQAttribure(IFeature pFeature, Dictionary<string, int> pFieldsIndex)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pFieldsIndex.Keys)
{
string bghAttr = "BGQ" + item;
if (!FieldsIndex.Keys.Contains(bghAttr))
{
bghAttr = "BGQTB" + item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pFeature.Value[pFieldsIndex[item]];
}
else
{
FieldsValue.Add(bghAttr, pFeature.Value[pFieldsIndex[item]]);
}
}
}
public void SetBGQAttribure(XZQGXGCAttribute2 pGXGCData)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGXGCData.FieldsValue.Keys)
{
if (item.Contains("BGH"))
continue;
string bghAttr = item;
if (!FieldsValue.Keys.Contains(bghAttr))
{
bghAttr = item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pGXGCData.FieldsValue[item];
}
else
{
FieldsValue.Add(bghAttr, pGXGCData.FieldsValue[item]);
}
}
}
public void SetBGHAttribure(XZQGXGCAttribute2 pGXGCData)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGXGCData.FieldsValue.Keys)
{
if (item.Contains("BGQ"))
continue;
string bghAttr = item;
if (!FieldsValue.Keys.Contains(bghAttr))
{
bghAttr = item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pGXGCData.FieldsValue[item];
}
else
{
FieldsValue.Add(bghAttr, pGXGCData.FieldsValue[item]);
}
}
}
public void SetBGHAttribure(XZQGXAttribute2 pGXData)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGXData.FieldsValue.Keys)
{
string bghAttr = "BGH" + item;
if (!FieldsIndex.Keys.Contains(bghAttr))
{
bghAttr = "BGHTB" + item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pGXData.FieldsValue[item];
}
else
{
FieldsValue.Add(bghAttr, pGXData.FieldsValue[item]);
}
}
}
public void SetBGHAttribure(IFeature pFeature, Dictionary<string, int> pFieldsIndex)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pFieldsIndex.Keys)
{
string bghAttr = "BGH" + item;
if (!FieldsIndex.Keys.Contains(bghAttr))
{
bghAttr = "BGHTB" + item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pFeature.Value[pFieldsIndex[item]];
}
else
{
FieldsValue.Add(bghAttr, pFeature.Value[pFieldsIndex[item]]);
}
}
}
public void SetAttribure(IFeature pFeature, Dictionary<string, int> pGxgcFieldsIndex)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGxgcFieldsIndex.Keys)
{
if (FieldsIndex.Keys.Contains(item))
{
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[pGxgcFieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[pGxgcFieldsIndex[item]]);
}
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[pGxgcFieldsIndex[item]].ToTrim();
}
if (item == "BGXW")
{
BGXW = pFeature.Value[pGxgcFieldsIndex[item]].ToTrim();
}
}
}
}
}
public class CJDCQGXAttribute
{
public string BSM
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("BSM"))
{
return FieldsValue["BSM"].ToTrim();
}
return "";
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("BSM"))
{
FieldsValue["BSM"] = value;
}
else
{
FieldsValue.Add("BSM", value);
}
}
}
public string BGTBOID { get; set; }
public bool IsUpdate { get; set; }
public int UpdateOID { get; set; }
private List<CJDCQGXGCAttribute> _GCDataList;
public List<CJDCQGXGCAttribute> GCDataList
{
get
{
if (_GCDataList == null)
_GCDataList = new List<CJDCQGXGCAttribute>();
return _GCDataList;
}
set
{
_GCDataList = value;
}
}
private IGeometry _Shape;
public IGeometry Shape
{
get
{
if (_GCDataList != null)
{
_Shape = UnionGXGC();
}
return _Shape;
}
set { _Shape = value; }
}
public IGeometry Shape2
{
get;
set;
}
public Dictionary<string, int> FieldsIndex { get; set; }
public Dictionary<string, object> FieldsValue { get; set; }
public CJDCQGXAttribute(Dictionary<string, int> pFieldsIndex, CJDCQGXGCAttribute pGXGCData)
{
this.FieldsIndex = pFieldsIndex;
if (pGXGCData == null)
return;
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in FieldsIndex.Keys)
{
string bghAttr = "BGH" + item;
if (!pGXGCData.FieldsValue.Keys.Contains(bghAttr))
{
bghAttr = "BGHTB" + item;
}
if (!pGXGCData.FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue.Add(item, null);
continue;
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pGXGCData.FieldsValue[bghAttr];
}
else
{
FieldsValue.Add(item, pGXGCData.FieldsValue[bghAttr]);
}
}
BGTBOID = pGXGCData.BGTBOID;
Shape = pGXGCData.Shape;
}
public CJDCQGXAttribute(Dictionary<string, int> pFieldsIndex)
{
FieldsIndex = pFieldsIndex;
}
public void SetAttribure(IFeature pFeature, Dictionary<string, int> pFieldsIndex = null)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
Shape = pFeature.ShapeCopy;
Dictionary<string, int> fields = FieldsIndex;
if (pFieldsIndex != null)
fields = pFieldsIndex;
foreach (var item in fields.Keys)
{
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[FieldsIndex[item]].ToTrim();
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[FieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[FieldsIndex[item]]);
}
}
}
public void SetAttribureNew(IFeature pFeature, Dictionary<string, int> pFieldsIndex = null)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
Shape = pFeature.ShapeCopy;
Dictionary<string, int> fields = FieldsIndex;
if (pFieldsIndex != null)
{
FieldsIndex = pFieldsIndex;
fields = pFieldsIndex;
}
foreach (var item in fields.Keys)
{
if (item == "OBJECTID" || item == "FID")
{
continue;
}
if (pFieldsIndex != null)
{
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[pFieldsIndex[item]].ToTrim();
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[pFieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[pFieldsIndex[item]]);
}
}
else
{
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[FieldsIndex[item]].ToTrim();
}
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[FieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[FieldsIndex[item]]);
}
}
}
}
public bool IsEqual(CJDCQGXAttribute pData)
{
bool result = true;
if (FieldsValue == null || pData.FieldsValue == null)
{
result = false;
return result;
}
foreach (var item in FieldsIndex.Keys)
{
if ("SHAPE,BGTBOID,GXSJ,BSM,YSDM".Contains(item) || item.Contains("MJ"))
continue;
if (!pData.FieldsValue.Keys.Contains(item)) continue;
if (!Equals(FieldsValue[item], pData.FieldsValue[item]))
{
result = false;
break;
}
}
return result;
}
private bool Equals(object obj1, object obj2)
{
if (obj1 == null || obj1 is DBNull)
{
obj1 = "";
}
if (obj2 == null || obj2 is DBNull)
{
obj2 = "";
}
if (obj2.ToString() == "0")
obj2 = "";
if (obj1.ToString() == "0")
obj1 = "";
if (obj1.ToTrim() == obj2.ToTrim())
{
return true;
}
return false;
}
private IGeometry UnionGXGC()
{
IGeometry result = null;
List<int> updateOIDs = new List<int>();
foreach (var item in _GCDataList)
{
if (item.Shape == null || item.Shape.IsEmpty)
{
continue;
}
if (item.IsUpdate)
{
if (updateOIDs.Contains(item.UpdateOID))
{
continue;
}
updateOIDs.Add(item.UpdateOID);
}
if (result == null)
{
result = item.Shape;
}
else
{
ITopologicalOperator topo = result as ITopologicalOperator;
topo.Simplify();
ITopologicalOperator topo2 = item.Shape as ITopologicalOperator;
topo2.Simplify();
IGeometry result2 = topo.Union(item.Shape);
result = result2;
}
}
return result;
}
}
public class CJDCQGXGCAttribute
{
public string BGTBOID
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("BGTBOID"))
{
return FieldsValue["BGTBOID"].ToTrim();
}
return "";
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("BGTBOID"))
{
FieldsValue["BGTBOID"] = value;
}
else
{
FieldsValue.Add("BGTBOID", value);
}
}
}
public bool IsUpdate { get; set; }
public int UpdateOID { get; set; }
public string BGHBSM
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("BGHBSM"))
{
return FieldsValue["BGHBSM"].ToTrim();
}
return "";
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("BGHBSM"))
{
FieldsValue["BGHBSM"] = value;
}
else
{
FieldsValue.Add("BGHBSM", value);
}
}
}
/// <summary>
/// 变更行为
/// </summary>
public string BGXW { get; set; }
/// <summary>
/// 变更面积
/// </summary>
public double BGMJ
{
get
{
if (FieldsValue != null && FieldsValue.Keys.Contains("TBBGMJ"))
{
return FieldsValue["TBBGMJ"].ToDouble();
}
return 0;
}
set
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsValue.Keys.Contains("TBBGMJ"))
{
FieldsValue["TBBGMJ"] = value;
}
else
{
FieldsValue.Add("TBBGMJ", value);
}
}
}
public Dictionary<string, int> FieldsIndex { get; set; }
public Dictionary<string, object> FieldsValue { get; set; }
public CJDCQGXGCAttribute(Dictionary<string, int> pFieldsIndex)
{
this.FieldsIndex = pFieldsIndex;
}
public IGeometry Shape { get; set; }
public void SetBGQAttribure(IFeature pFeature, Dictionary<string, int> pFieldsIndex)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pFieldsIndex.Keys)
{
string bghAttr = "BGQ" + item;
if (!FieldsIndex.Keys.Contains(bghAttr))
{
bghAttr = "BGQTB" + item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pFeature.Value[pFieldsIndex[item]];
}
else
{
FieldsValue.Add(bghAttr, pFeature.Value[pFieldsIndex[item]]);
}
}
}
public void SetBGQAttribure(CJDCQGXGCAttribute pGXGCData)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGXGCData.FieldsValue.Keys)
{
if (item.Contains("BGH"))
continue;
string bghAttr = item;
if (!FieldsValue.Keys.Contains(bghAttr))
{
bghAttr = item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pGXGCData.FieldsValue[item];
}
else
{
FieldsValue.Add(bghAttr, pGXGCData.FieldsValue[item]);
}
}
}
public void SetBGHAttribure(CJDCQGXGCAttribute pGXGCData)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGXGCData.FieldsValue.Keys)
{
if (item.Contains("BGQ"))
continue;
string bghAttr = item;
if (!FieldsValue.Keys.Contains(bghAttr))
{
bghAttr = item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pGXGCData.FieldsValue[item];
}
else
{
FieldsValue.Add(bghAttr, pGXGCData.FieldsValue[item]);
}
}
}
public void SetBGHAttribure(CJDCQGXAttribute pGXData)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGXData.FieldsValue.Keys)
{
string bghAttr = "BGH" + item;
if (!FieldsIndex.Keys.Contains(bghAttr))
{
bghAttr = "BGHTB" + item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pGXData.FieldsValue[item];
}
else
{
FieldsValue.Add(bghAttr, pGXData.FieldsValue[item]);
}
}
}
public void SetBGHAttribure(IFeature pFeature, Dictionary<string, int> pFieldsIndex)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pFieldsIndex.Keys)
{
string bghAttr = "BGH" + item;
if (!FieldsIndex.Keys.Contains(bghAttr))
{
bghAttr = "BGHTB" + item;
}
if (!FieldsIndex.Keys.Contains(bghAttr))
continue;
if (FieldsValue.Keys.Contains(bghAttr))
{
FieldsValue[bghAttr] = pFeature.Value[pFieldsIndex[item]];
}
else
{
FieldsValue.Add(bghAttr, pFeature.Value[pFieldsIndex[item]]);
}
}
}
public void SetAttribure(IFeature pFeature, Dictionary<string, int> pGxgcFieldsIndex)
{
if (FieldsValue == null)
FieldsValue = new Dictionary<string, object>();
if (FieldsIndex == null)
return;
foreach (var item in pGxgcFieldsIndex.Keys)
{
if (FieldsIndex.Keys.Contains(item))
{
if (FieldsValue.Keys.Contains(item))
{
FieldsValue[item] = pFeature.Value[pGxgcFieldsIndex[item]];
}
else
{
FieldsValue.Add(item, pFeature.Value[pGxgcFieldsIndex[item]]);
}
if (item == "BGTBOID")
{
BGTBOID = pFeature.Value[pGxgcFieldsIndex[item]].ToTrim();
}
if (item == "BGXW")
{
BGXW = pFeature.Value[pGxgcFieldsIndex[item]].ToTrim();
}
}
}
}
public void CalculationArea()
{
BGMJ = (Shape as IPolygon).GetEllipseArea();
}
private bool Equals(object obj1, object obj2)
{
if (obj1 == null || obj1 is DBNull)
{
obj1 = "";
}
if (obj2 == null || obj2 is DBNull)
{
obj2 = "";
}
if (obj2.ToString() == "0")
obj2 = "";
if (obj1.ToString() == "0")
obj1 = "";
if (obj1.ToTrim() == obj2.ToTrim())
{
return true;
}
return false;
}
}
}