|
|
|
|
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;
|
|
|
|
|
//IDGParameter Parm = obj as IDGParameter;
|
|
|
|
|
Kingo.ThreadManager.TaskParameter taskParm = obj as Kingo.ThreadManager.TaskParameter;
|
|
|
|
|
IDGParameter Parm = taskParm.Data as IDGParameter;
|
|
|
|
|
|
|
|
|
|
//IFeatureLayer GDDBGXLayer = null;
|
|
|
|
|
//IFeatureLayer JCGDDBLayer = JCGDDBLayer;
|
|
|
|
|
//IFeatureLayer NMKLayer = null;
|
|
|
|
|
|
|
|
|
|
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";
|
|
|
|
|
|
|
|
|
|
//this.UpdateMsg("正在进行耕地等别数据提取,请稍候...");
|
|
|
|
|
//jcgddblayer = Parm.JC_GDDBLay as IFeatureLayer;
|
|
|
|
|
Console.WriteLine("Log:正在进行耕地等别数据提取,请稍候...");
|
|
|
|
|
if (JcGddbLayer != null)
|
|
|
|
|
{
|
|
|
|
|
//GeoprocessorHelper gpHelper = new GeoprocessorHelper();
|
|
|
|
|
//string gdbFolder = Directory.GetCurrentDirectory() + "\\Temp\\NMK";
|
|
|
|
|
//if (!System.IO.Directory.Exists(gdbFolder))
|
|
|
|
|
//{
|
|
|
|
|
// System.IO.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);
|
|
|
|
|
|
|
|
|
|
(GxGddbLayer.FeatureClass as ITable).DeleteSearchedRows(null);//删除耕地等别更新层所有数据
|
|
|
|
|
//空间联合赋值
|
|
|
|
|
GPParamClass gPParamClass = new GPParamClass();
|
|
|
|
|
IFeatureLayer TempNMKLayer = null;
|
|
|
|
|
if (NmTbLayer == null)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("Log:正在进行耕地等别数据提取_数据准备...");
|
|
|
|
|
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 gPParamClass = new GPParamClass();
|
|
|
|
|
gPParamClass = new GPParamClass();
|
|
|
|
|
//gPParamClass.FirstFeatureLayer = NmTbLayer;
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("Log:正在进行耕地等别数据提取_数据生成中...");
|
|
|
|
|
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");
|
|
|
|
|
DateTime dateTime = DateTime.Now.Month >= 10 ? new DateTime(DateTime.Now.Year, 12, 31) : new DateTime(DateTime.Now.Year - 1, 12, 31);
|
|
|
|
|
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] = dateTime;
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
if (buff != null)
|
|
|
|
|
Marshal.ReleaseComObject(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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|