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

250 lines
9.3 KiB

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.AE;
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 Kingo.PluginServiceInterface;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace KGIS.Plugin.BoundaryReadjust
{
public class JXTZBGHelper
{
/// <summary>
/// 面积调整(平差)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="shpList"></param>
/// <param name="pGeoPropertyName"></param>
/// <param name="pKZMJ">地类图斑面积</param>
public static void AreaAdjustment<T>(List<T> shpList, string pGeoPropertyName, double pKZMJ)
{
Type type = shpList[0].GetType();
System.Reflection.PropertyInfo pertyInfo = type.GetProperty(pGeoPropertyName);
if (shpList.Count == 1)
{
pertyInfo.SetValue(shpList[0], pKZMJ);
return;
}
double sumMJ = 0;
foreach (var item in shpList)
{
sumMJ += pertyInfo.GetValue(item).ToDouble();
}
shpList = shpList.OrderByDescending(o => pertyInfo.GetValue(o)).ToList();
double mjc = Math.Round(sumMJ - pKZMJ, 2);//打散后的图斑面积与压盖地类图斑面积是否一致
//平差
while (Math.Round(mjc, 2) != 0)
{
int tpsm = (int)(Math.Abs(Math.Round(mjc, 2)) / 0.01);
int e = tpsm / shpList.Count;
int f = tpsm % shpList.Count;
if (f != 0)
{
double tpmj = (e + 1) * 0.01;
for (int i = 0; i < f; i++)
{
if (mjc < 0)
pertyInfo.SetValue(shpList[i], pertyInfo.GetValue(shpList[i]).ToDouble() + tpmj);
else
pertyInfo.SetValue(shpList[i], pertyInfo.GetValue(shpList[i]).ToDouble() - tpmj);
}
}
if (e != 0)
{
double tpmj = e * 0.01;
for (int i = f; i < shpList.Count; i++)
{
if (mjc < 0)
pertyInfo.SetValue(shpList[i], pertyInfo.GetValue(shpList[i]).ToDouble() + tpmj);
else
pertyInfo.SetValue(shpList[i], pertyInfo.GetValue(shpList[i]).ToDouble() - tpmj);
}
}
sumMJ = 0;
foreach (var item in shpList)
{
sumMJ += pertyInfo.GetValue(item).ToDouble();
}
mjc = Math.Round(sumMJ, 2) - pKZMJ;
}
}
/// <summary>
/// 插入数据到☞要素类
/// </summary>
/// <param name="pSource"></param>
/// <param name="pTarget"></param>
/// <param name="pFilter"></param>
public static void InsertDataToMemeoryLayer(IFeatureClass pSource, IFeatureClass pTarget, IQueryFilter pFilter = null)
{
try
{
if (pSource == null || pTarget == null) return;
int idx = pSource.FindField("XZQTZLX");
if (idx != -1 && pFilter != null)
{
IField field = pSource.Fields.Field[idx];
if (field.Type == esriFieldType.esriFieldTypeString)
{
pFilter.WhereClause = "XZQTZLX = '3'";
}
}
IFeatureClassAPI fcAPI = new FeatureClassAPI(pSource);
if (pTarget != null)
fcAPI.FcToFc(pTarget, pFilter, false);
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
}
#region 获取最新标识码
public static string GetNewBSM(List<IFeatureClass> fcList)
{
string result = string.Empty;
int xh = 0;
string leftStr = string.Empty;
foreach (var item in fcList)
{
string MaxBSM = GetMaxBSM(item);
if (MaxBSM.Length != 18)
continue;
int xh2 = Convert.ToInt32(MaxBSM.Substring(10));
leftStr = MaxBSM.Substring(0, 10);
if (xh < xh2)
xh = xh2;
}
xh++;
if (string.IsNullOrWhiteSpace(leftStr))
leftStr = (MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).CODE + "1210";
result = leftStr + xh.ToString().PadLeft(8, '0');
return result;
}
private static string GetMaxBSM(IFeatureClass fc)
{
System.Windows.Forms.Application.DoEvents();
string BSM = string.Empty;
int BSMIndex = fc.FindField("BSM");
if (BSMIndex == -1) return BSM;
ITable table = (ITable)fc;
// 创建一个ITableSort接口对象
ITableSort tableSort = new TableSortClass();
tableSort.Table = table;
tableSort.Fields = "BSM";
tableSort.set_Ascending("BSM", false);
tableSort.Sort(null);
ICursor cursor = tableSort.Rows;
IRow row = cursor.NextRow();
if (row != null)
{
int maxBSM = 0;
int currBSM = 0;
string BSMStr = row.Value[BSMIndex].ToString();
if (BSMStr.Length != 18) return BSM;
string subBSMStr = BSMStr.Substring(9);
try
{
currBSM = Convert.ToInt32(subBSMStr);
}
catch (Exception)
{
return BSM;
}
if (currBSM > maxBSM) maxBSM = currBSM;
if (BSMStr.Length != 18) return BSM;
string maxStr = maxBSM.ToString();
int zeroNum = 9 - maxStr.Length;
for (int i = 0; i < zeroNum; i++)
{
maxStr = 0 + maxStr;
}
BSM = BSMStr.Substring(0, 9) + maxStr;
}
return BSM;
}
#endregion
/// <summary>
/// 删除文件夹以及子文件夹与子文件-
/// </summary>
/// <param name="srcPath"></param>
public static 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;
}
}
/// <summary>
/// 得到要素类集合
/// </summary>
/// <param name="title"></param>
/// <param name="paths">路径集合</param>
public static 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;
}
}
}
}