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.

247 lines
11 KiB

1 month ago
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
using KGIS.Framework.AE.GPHelper;
using KGIS.Framework.ThreadManager;
using KGIS.Framework.Utils;
using Kingo.PluginServiceInterface;
using Kingo.PluginServiceInterface.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
namespace IDGForNDBG
{
public class GDDB_IDGHelper : BaseIDG
{
public string IDataChangeName { get => "XZQ_IDGHelper"; }
private string TempGDBPath = string.Empty;
private string TempDBPath = string.Empty;
//IDGParameter IDGParm = null;
public void Execute(IDGParameter pParm)
{
ThreadManager.Instance.QueueUserWorkItem(new System.Threading.WaitCallback(ExeGDDB), pParm, new System.Threading.WaitCallback(ComplateCallBack));
}
public void ComplateCallBack(object obj)
{
Console.WriteLine($"Log:耕地等别数据提取完成。耗时:{GetTime(StartTime)}");
}
DateTime StartTime = DateTime.Now;
public void ExeGDDB(object obj)
{
StartTime = DateTime.Now;
Kingo.ThreadManager.TaskParameter taskParm = obj as Kingo.ThreadManager.TaskParameter;
IDGParameter Parm = taskParm.Data as IDGParameter;
IFeatureLayer featureLayer = null;
IFeatureCursor sourCursor = null;
IFeatureCursor gddbCursor = null;
try
{
OpenDB(Parm);
string TempDir = CreateTempDB("GDDB");
TempGDBPath = System.IO.Path.Combine(TempDir, "TempGDB.gdb");
TempDBPath = TempDir + @"\Temp" + ".sqlite";
Console.WriteLine("Log:正在进行耕地等别数据提取,请稍候...");
if (JcGddbLayer != null)
{
(GxGddbLayer.FeatureClass as ITable).DeleteSearchedRows(null);//删除耕地等别更新层所有数据
//空间联合赋值
GPParamClass gPParamClass = new GPParamClass();
IFeatureLayer TempNMKLayer = null;
if (NmTbLayer == null)
{
gPParamClass = new GPParamClass();
gPParamClass.FirstFeatureLayer = JcTbLayer;
gPParamClass.SecondFeatureLayer = GxTbLayer;
gPParamClass.OutFeatureClassPath = Parm.PrjInfo.NMDatabase + "\\" + "DLTB_NMK";//要添加的要素类图层
gPParamClass.IsGetOutPutFeature = true;
gPParamClass.GPType = EnumGPType.Erase;
GPHelper.Instance.ExeGPForProces(gPParamClass, ref TempNMKLayer);//擦除/相减分析
}
else
TempNMKLayer = NmTbLayer;
gPParamClass = new GPParamClass();
gPParamClass.FirstFeatureLayer = TempNMKLayer;
gPParamClass.SecondFeatureLayer = JcGddbLayer;
gPParamClass.OutFeatureClassPath = TempGDBPath + "\\" + "DLTB_GDDB";
gPParamClass.Match_option = "ARE_IDENTICAL_TO";
gPParamClass.IsGetOutPutFeature = true;
gPParamClass.GPType = EnumGPType.SpatialJoin;
gPParamClass.Join_type = "KEEP_ALL";
gPParamClass.JOIN_ONE_TO_ONE = true;
GPHelper.Instance.ExeGPForProces(gPParamClass, ref featureLayer);
if (featureLayer != null)
{
sourCursor = featureLayer.FeatureClass.Search(new QueryFilterClass() { WhereClause = " DLBM LIKE '01%'" }, true);
IFeature f = null;
gddbCursor = GxGddbLayer.FeatureClass.Insert(true);
int gddbIdx = featureLayer.FeatureClass.FindField("GDDB");
int kcmjIdx = featureLayer.FeatureClass.FindField("KCMJ");
int tbmjIdx = featureLayer.FeatureClass.FindField("TBMJ");
while ((f = sourCursor.NextFeature()) != null)
{
IFeatureBuffer buff = GxGddbLayer.FeatureClass.CreateFeatureBuffer();
buff.Shape = f.ShapeCopy;
int sIndex = -1;
for (int i = 0; i < buff.Fields.FieldCount; i++)
{
IField field = buff.Fields.Field[i];
if (field.Name.Contains(featureLayer.FeatureClass.ShapeFieldName) || !field.Editable) continue;
sIndex = f.Fields.FindField(field.Name);
if (field.Name.ToUpper() == "GXSJ")
{
buff.Value[i] = new DateTime(DateTime.Now.Year - 1, 12, 31);
}
if (sIndex == -1) continue;
else if (field.Name.ToUpper() == "KCDLMJ")
{
buff.Value[i] = f.Value[kcmjIdx];
}
else if (field.Name.ToUpper() == "TBDLMJ")
{
buff.Value[i] = f.Value[tbmjIdx];
}
else if (field.Name.ToUpper() == "LYD")
{
buff.Value[i] = f.Value[gddbIdx];
}
else
{
string value = f.Value[sIndex].ToTrim();
if (string.IsNullOrWhiteSpace(value))
buff.Value[i] = DBNull.Value;
else
buff.Value[i] = f.Value[sIndex];
}
}
gddbCursor.InsertFeature(buff);
}
gddbCursor.Flush();
}
Console.WriteLine($"Log:耕地等别数据提取完成。耗时:{GetTime(StartTime)}");
}
else
{
Console.WriteLine($"Log:耕地等别数据获取失败。");
}
}
catch (Exception ex)
{
LogAPI.Debug("耕地等别数据提取错误:" + ex.Message.ToString());
LogAPI.Debug(ex);
Console.WriteLine("Err:耕地等别数据提取错误:" + ex.Message.ToString());
//throw ex;
}
finally
{
if (sourCursor != null)
Marshal.ReleaseComObject(sourCursor);
if (gddbCursor != null)
Marshal.ReleaseComObject(gddbCursor);
}
}
public void OpenDB(IDGParameter parm)
{
try
{
LayerCfg layerInfo = null;
if (parm.PrjInfo != null && !string.IsNullOrWhiteSpace(parm.PrjInfo.TempData))
{
byte[] contentArray = Convert.FromBase64String(parm.PrjInfo.TempData);
string LayerCfg = System.Text.Encoding.Default.GetString(contentArray);
layerInfo = KGIS.Framework.Utils.SerializeAPI.DeserializeToObject<LayerCfg>(LayerCfg);
}
if (layerInfo == null)
{
throw new Exception("Err:获取图层信息失败!");
}
//FileInfo fileInfo = new FileInfo(parm.PrjInfo.BGDatabase);
string PathBgDB = parm.PrjInfo.BGDatabase;// Path.Combine(, "BGDB" + ".gdb");
string PathZLDB = parm.PrjInfo.ZLDatabase;
string PathNMDB = parm.PrjInfo.NMDatabase;// System.IO.Path.Combine(fileInfo.DirectoryName, "NMDB" + ".gdb");
BgWsAPI = new WorkspaceAPI(PathBgDB, WorkspaceTypeEnum.GDBFile);
if (BgWsAPI.CurrentWorkspace == null)
{
Console.WriteLine("打开变更数据库失败!");
return;
}
ZlWsAPI = new WorkspaceAPI(PathZLDB, WorkspaceTypeEnum.GDBFile);
if (ZlWsAPI.CurrentWorkspace == null)
{
Console.WriteLine("打开增量数据库失败!");
return;
}
NmWsAPI = new WorkspaceAPI(PathNMDB, WorkspaceTypeEnum.GDBFile);
LayerCfg JCLayerInfo = layerInfo.Layers.FirstOrDefault(f => f.LayerName == "年初数据");
if (JCLayerInfo == null)
{
throw new Exception("Err:获取年初数据库失败!");
}
List<LayerCfg> NcList = JCLayerInfo.GetAllItem();
//if (parm.ExeDLTB)
//{
LayerCfg _JcTBLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "地类图斑");
_jcTbLayer = OpenLayer(_JcTBLayerInfo);
if (_jcTbLayer == null)
{
throw new Exception("Err:获取年初地类图斑数据失败!");
}
//}
LayerCfg _JcGddbLayerInfo = NcList.FirstOrDefault(f => f.LayerName == "耕地等别");
_jcGddbLayer = OpenLayer(_JcGddbLayerInfo);
if (_JcGddbLayerInfo == null)
throw new Exception("Err:获取年初耕地等别数据失败!");
if (_nmTbLayer == null)
_nmTbLayer = OpenLayer(NmWsAPI, "DLTB_NMK");
_gxGddbLayer = OpenLayer(ZlWsAPI, "GDDBGX");
_gxTbLayer = OpenLayer(ZlWsAPI, "DLTBGX");
}
catch (Exception ex)
{
throw ex;
}
}
#region DelectDir
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 ex)
{
LogAPI.Debug(ex + ":删除错误不处理");
}
}
#endregion
}
}