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

1173 lines
52 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
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.Platform;
using KGIS.Framework.Platform.Helper;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using Kingo.OpenData.Filter;
using Kingo.Plugin.BatchDataLoad.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Navigation;
using UIShell.OSGi;
using KGIS.Framework.AE.Enum;
using Kingo.PluginServiceInterface;
using System.Data;
using KGIS.Framework.Utils.Utility;
using KGIS.Framework.OpenData.Enum;
using KGIS.Framework.DBOperator;
using Kingo.Framework.LayerStyleConvert.XSDClass;
using Kingo.Framework.LayerStyleConvert.Common;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesRaster;
using KUI.Windows;
using Kingo.PluginServiceInterface.Helper.VCT;
using Kingo.PluginServiceInterface.Model;
using ESRI.ArcGIS.Geometry;
using System.Runtime.InteropServices;
using System.Collections;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using Kingo.Plugin.BHTB_Extract.View;
namespace Kingo.Plugin.BatchDataLoad.View
{
/// <summary>
/// UcBatchDataLoad.xaml 的交互逻辑
/// </summary>
public partial class UcBatchDataLoad : BaseWindow
{
private IHookHelper hookHelper = null;
List<AddTreeList> addTreeLayerCfg = new List<AddTreeList>();
public string ImportDataType { get; set; }
private string SourceMDBPath { get; set; }
List<string> itemSources;
List<LayerCfg> nodes = new List<LayerCfg>();
private IDataCatalogService _DataCatalog = null;
private ISystemCfg SystemCfg = null;
private SystemConfig2 Cfg = null;
string titleName;
private string rootFilePath = "";
ILayer m_featureLayer = null;
IEnvelope CurrentEnvelope = null;
public double FramingSize = 10000;
public UcBatchDataLoad(IHookHelper hook)
{
InitializeComponent();
itemSources = new List<string>();
hookHelper = hook;
if (_DataCatalog == null)
_DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService<IDataCatalogService>();
SystemCfg = BundleRuntime.Instance.GetFirstOrDefaultService<ISystemCfg>();
Cfg = SystemCfg.Load();
if (Cfg != null && Cfg.BHTBLayerLoadCfg != null && Cfg.BHTBLayerLoadCfg.Count != 0)
{
LayerCfg rootLayer = Cfg.BHTBLayerLoadCfg.Find(a => a.PID == 0 && a.ID == 1);
itemSources.Add(rootLayer.FcPath);
}
cobDataBase.ItemsSource = itemSources;
nodes = Cfg.BHTBLayerLoadCfg;
BatchLoadDataModel.Instance.BatchLoadDatas = Cfg.BHTBLayerLoadCfg;
if (itemSources != null && itemSources.Count != 0)
cobDataBase.SelectedIndex = 0;
}
Dictionary<string, object> pathGroupLayerDic = new Dictionary<string, object>();
private void BtnOK_Click(object sender, RoutedEventArgs e)
{
try
{
if (BatchLoadDataModel.Instance == null || BatchLoadDataModel.Instance.BatchLoadDatas == null || BatchLoadDataModel.Instance.BatchLoadDatas.Count == 0) return;
EngineEditor engineEditor = new EngineEditor();
if (engineEditor.EditState == esriEngineEditState.esriEngineStateEditing)
{
MessageHelper.ShowTips("当前处于编辑状态,请关闭编辑后重试!");
return;
}
if (BatchLoadDataModel.Instance.BatchLoadDatas.FindAll(a => a.LayerType != EnumLayerType.GroupLayer).Count == 0)
{
MessageHelper.ShowTips("当前选择文件不包含图层数据!");
return;
}
this.ShowLoading("正在进行数据加载...", 0, 0);
addTreeLayerCfg.Clear();
//加载树表头
object GroupLayerInfo = null;
ILayer groupLayer = MapsManager.Instance.MapService.GetGroupLayer(titleName);
if (groupLayer != null)
{
_DataCatalog.RemoveLayer(groupLayer);
_DataCatalog.UpdateTree();
}
groupLayer = new GroupLayer() { Name = titleName };
ILayerGeneralProperties layerGeneralProperties = groupLayer as ILayerGeneralProperties;
layerGeneralProperties.LayerDescription = titleName;
GroupLayerInfo = _DataCatalog.AddLayer(groupLayer);
AddTreeList rootTreeList = new AddTreeList() { AddTreeListGroupLayerInfo = GroupLayerInfo };
addTreeLayerCfg.Add(rootTreeList);
pathGroupLayerDic.Clear();
pathGroupLayerDic.Add(BatchLoadDataModel.Instance.BatchLoadDatas.Find(a=>a.LayerName == titleName).FcPath, GroupLayerInfo);
DirectoryInfo directoryInfo = new DirectoryInfo(cobDataBase.Text);
AddChildrenTree(directoryInfo, rootTreeList);
List<LayerCfg> featureLayers = BatchLoadDataModel.Instance.BatchLoadDatas.FindAll(a => a.LayerType != EnumLayerType.GroupLayer);
foreach (LayerCfg item in featureLayers)
{
if (item.IsChecked)
{
bool parentIsCheck = GetParentIsChecked(item.PID);
if (!parentIsCheck) continue;
CreateBHTBTQ(item);
}
}
if (_DataCatalog != null)
{
_DataCatalog.UpdateTree();
}
//批量数据加载图层树顺序调整
List<LayerCfg> childlayers = (_DataCatalog.CurrentLayers as LayerCfg).Layers;
if (childlayers != null && childlayers.Count > 1)
{
LayerCfg firstlayerCfg = childlayers[0];
int lastIndx = childlayers.Count - 1;
for (int i = 0; i < lastIndx; i++)
{
childlayers[i] = childlayers[i + 1];
}
childlayers[lastIndx] = firstlayerCfg;
(_DataCatalog.CurrentLayers as LayerCfg).Layers = childlayers;
}
Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" });
Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "InitProject" });
//自动生成作业区
if (chkIsCreateZYQ.IsChecked == true)
{
GetEnvelopeBorder();
}
//刷新作业区管理列表
if (UcZYQMagr.Instance.IsLoaded)
{
UcZYQMagr.Instance.InitTreeView();
MarkLayer();
}
IUcMulitMapControlHelper ucMulitMapControlHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcMulitMapControlHelper>();
if (ucMulitMapControlHelper != null)
{
ucMulitMapControlHelper.ClearData();
ucMulitMapControlHelper.SetLayer();
ucMulitMapControlHelper.MarkLabelLayer();
}
//添加遮罩 更新地图视图
//ShowMaskHelper showMaskForBHTBHelper = new ShowMaskHelper();
//showMaskForBHTBHelper.axMapControl = MapsManager.Instance.MapService.getAxMapControl();
//showMaskForBHTBHelper.ShowBorderMask();
this.CloseLoading();
MessageHelper.ShowTips("图层加载完成。");
this.Close();
}
catch (Exception ex)
{
this.CloseLoading();
MessageHelper.ShowError("加载图层失败:" + ex.Message);
LogAPI.Debug("加载图层失败:" + ex);
return;
}
}
public void AddChildrenTree(DirectoryInfo directoryInfo, AddTreeList rootTreeList)
{
var subDirectory = directoryInfo.GetDirectories();
if (subDirectory.Length != 0)
{
for (int i = 0; i < subDirectory.Length; i++)
{
if (rootTreeList == null || rootTreeList.AddTreeListGroupLayerInfo == null) continue;
if (subDirectory[i].Name.ToLower().Contains("gdb") || subDirectory[i].Name.ToLower().Contains("mdb") || subDirectory[i].Name.ToLower().Contains("shp") || subDirectory[i].Name.ToLower().Contains("vct") || subDirectory[i].Name.ToLower().Contains("img") || subDirectory[i].Name.ToLower().Contains("jpg") || subDirectory[i].Name.ToLower().Contains("jpeg") || subDirectory[i].Name.ToLower().Contains("png") || subDirectory[i].Name.ToLower().Contains("tif")) continue;
//if (Directory.GetDirectories(subDirectory[i].FullName).Length == 0 || Directory.GetFiles(subDirectory[i].FullName).Length == 0) continue;
LayerCfg tempLayerCfg = BatchLoadDataModel.Instance.BatchLoadDatas.Find(a => a.FcPath == subDirectory[i].FullName);
if (tempLayerCfg == null) continue;
object tempGroupLayerInfo = null;
if (tempLayerCfg.IsChecked && GetParentIsChecked(tempLayerCfg.PID))
{
ILayer tempgroupLayer = new GroupLayer() { Name = subDirectory[i].Name };
ILayerGeneralProperties layerGeneralProperties = tempgroupLayer as ILayerGeneralProperties;
layerGeneralProperties.LayerDescription = subDirectory[i].Name;
tempGroupLayerInfo = _DataCatalog.AddLayer(tempgroupLayer, rootTreeList.AddTreeListGroupLayerInfo);
if (!pathGroupLayerDic.Keys.Contains(subDirectory[i].FullName))
{
pathGroupLayerDic.Add(subDirectory[i].FullName, tempGroupLayerInfo);
}
}
rootTreeList.AddTreeListLayers.Add(new AddTreeList()
{
AddTreeListGroupLayerInfo = tempGroupLayerInfo
});
addTreeLayerCfg.Add(rootTreeList.AddTreeListLayers[rootTreeList.AddTreeListLayers.Count - 1]);
AddChildrenTree(subDirectory[i], rootTreeList.AddTreeListLayers[rootTreeList.AddTreeListLayers.Count - 1]);
}
}
}
//创建变化图斑提取图层
private void CreateBHTBTQ(LayerCfg layerCfg)
{
try
{
if (layerCfg == null) return;
string filePath = layerCfg.FcPath;
if (string.IsNullOrEmpty(filePath)) return;
if (_DataCatalog == null) return;
IWorkspaceAPI wsAPI = null;
LayerCfg parent = BatchLoadDataModel.Instance.BatchLoadDatas.Find(a => a.ID == layerCfg.PID);
//object GroupLayerInfo = _DataCatalog.GetNodeByLayerName(parent.LayerName);
//if (GroupLayerInfo == null)
//{
// GroupLayerInfo = MapsManager.Instance.MapService.GetGroupLayer(parent.LayerName);
//}
object GroupLayerInfo = null;
pathGroupLayerDic.TryGetValue(parent.FcPath, out GroupLayerInfo);
if (filePath.EndsWith("MDB") || filePath.EndsWith("mdb") || filePath.EndsWith("VCT") || filePath.EndsWith("vct"))
{
wsAPI = new WorkspaceAPI(filePath, KGIS.Framework.AE.Enum.WorkspaceTypeEnum.MDBFile);
}
else if (filePath.EndsWith("GDB") || filePath.EndsWith("gdb"))
{
wsAPI = new WorkspaceAPI(filePath, KGIS.Framework.AE.Enum.WorkspaceTypeEnum.GDBFile, true);
}
else if (filePath.EndsWith("SHP") || filePath.EndsWith("shp"))
{
//wsAPI = new WorkspaceAPI(filePath, KGIS.Framework.AE.Enum.WorkspaceTypeEnum.ShapeFile);
string filePathName = System.IO.Path.GetFileNameWithoutExtension(filePath);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(filePathName);
IFeatureLayer tempLayer = new FeatureLayer() { Name = filePathName, FeatureClass = pSourceFeatureClass };
_DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
return;
}
else if (filePath.EndsWith("TIF") || filePath.EndsWith("tif") || filePath.EndsWith("TIFF") || filePath.EndsWith("tiff") || filePath.ToLower().EndsWith("img") || filePath.ToLower().EndsWith("jpg") || filePath.ToLower().EndsWith("jpeg") || filePath.ToLower().EndsWith("png"))
{
int Index = filePath.LastIndexOf("\\");
string fileName = filePath.Substring(Index + 1);
string filePathName = filePath.Substring(0, Index);
//IWorkspaceFactory workspcFac = new RasterWorkspaceFactoryClass();
//IWorkspace works = workspcFac.OpenFromFile(filePathName, 0);
//IRasterWorkspace rasterworkspc = workspcFac.OpenFromFile(filePathName, 0) as IRasterWorkspace;
//IRasterDataset rasterDatst = rasterworkspc.OpenRasterDataset(fileName);
//IRasterLayer layer = new RasterLayer();
//layer.CreateFromDataset(rasterDatst);
//IFeatureLayer tempLayer = new FeatureLayer() { Name = filePathName, FeatureClass = rasterDatst };
//_DataCatalog.AddLayer(layer, GroupLayerInfo);
IRasterLayer layer = new RasterLayerClass();
layer.CreateFromFilePath(filePath);
layer.Name = fileName;
_DataCatalog.AddLayer(layer, GroupLayerInfo);
return;
}
if (wsAPI == null) return;
List<IFeatureClass> featureClasses = wsAPI.GetAllFeatureClass(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
for (int i = 0; i < featureClasses.Count; i++)
{
string name = featureClasses[i].AliasName;
if (!layerCfg.LayerName.Contains(name)) continue;
IFeatureClassAPI s_FcAPI = wsAPI.OpenFeatureClass(name);
IFeatureLayer tempLayer = new FeatureLayer() { Name = name, FeatureClass = s_FcAPI.FeatureClass };
SetILayerSymbol(tempLayer, name);
_DataCatalog.AddLayer(tempLayer, GroupLayerInfo);
break;
}
}
catch (Exception ex)
{
//MessageHelper.ShowError("加载图层失败:" + ex.Message);
LogAPI.Debug(ex);
}
}
private void SetILayerSymbol(IFeatureLayer tempLayer, string LayerAliseName)
{
IFeatureRenderer result = null;
LayerCfg layerCfg = Cfg.BHTBLayerLoadCfg.FirstOrDefault(x => x.FcName == LayerAliseName);//默认配置默认不为NULL
if (layerCfg != null && !string.IsNullOrWhiteSpace(layerCfg.Symbol))
{
AdvancedDrawingInfo ad = AdvancedDrawingInfo.FromJson(layerCfg.Symbol);
if (ad != null)
{
if (ad.DrawingInfo.Renderer is Framework.LayerStyleConvert.XSDClass.SimpleRenderer)
{
Symbol symbol1 = (ad.DrawingInfo.Renderer as Framework.LayerStyleConvert.XSDClass.SimpleRenderer).Symbol;
ISimpleRenderer simpleRander2 = SymbolConvert.Instance().GetSimpleRenderer(symbol1, SymbolTypeEnum.Fill);
result = simpleRander2 as IFeatureRenderer;
}
else if (ad.DrawingInfo.Renderer is Framework.LayerStyleConvert.XSDClass.UniqueValueRenderer)
{
Renderer rander = ad.DrawingInfo.Renderer;
IUniqueValueRenderer uniqueValueRander = SymbolConvert.Instance().GetUniqueValueRenderer(rander, SymbolTypeEnum.Fill);
result = uniqueValueRander as IFeatureRenderer;
}
}
#region 样式
if (result != null)
(tempLayer as IGeoFeatureLayer).Renderer = result;
#endregion
#region 显示比例设置
tempLayer.MinimumScale = layerCfg.MinScale;
tempLayer.MaximumScale = layerCfg.MaxScale;
#endregion
#region 图层透明度
if (tempLayer is ILayerEffects mLayerEffects)//透明度
mLayerEffects.Transparency = (short)layerCfg.Transparency;
#endregion
#region 是否显示
tempLayer.Visible = layerCfg.Visible;//是否显示
#endregion
#region 是否可选择
tempLayer.Selectable = layerCfg.Selectable;
#endregion
#region 过滤条件
IFeatureLayerDefinition pFLDefinition = tempLayer as IFeatureLayerDefinition;
if (pFLDefinition != null)
{
pFLDefinition.DefinitionExpression = layerCfg.DefinitionExpression;
}
#endregion
}
}
private bool GetParentIsChecked(int PID)
{
LayerCfg parent = BatchLoadDataModel.Instance.BatchLoadDatas.Find(a => a.ID == PID);
if (parent == null)
{
return true;
}
else if (!parent.IsChecked)
{
return false;
}
else
{
return GetParentIsChecked(parent.PID);
}
}
private void BtnCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void SelectFile_Click(object sender, RoutedEventArgs e)
{
try
{
System.Windows.Forms.FolderBrowserDialog openFileDialog = new System.Windows.Forms.FolderBrowserDialog();
if (cobDataBase.ItemsSource != null && itemSources.Count != 0)
openFileDialog.SelectedPath = cobDataBase.ItemsSource.FindFirst().ToString();
if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string[] str = openFileDialog.SelectedPath.Split('\\');
if (str == null || str.Length == 0) return;
titleName = str[str.Length - 1];
this.cobDataBase.ItemsSource = null;
itemSources.Clear();
itemSources.Add(openFileDialog.SelectedPath);
this.cobDataBase.ItemsSource = itemSources;
this.cobDataBase.SelectedIndex = 0;
BatchLoadDataModel.Instance.BatchLoadDatas.Clear();
nodes.Clear();
rootFilePath = openFileDialog.SelectedPath;
//表头
string size = GetFileSize(GetDirectoryLength(openFileDialog.SelectedPath));
LayerCfg node = new LayerCfg()
{
IsChecked = true,
LayerName = titleName,
FcPath = openFileDialog.SelectedPath,
FileSize = size,
LayerType = EnumLayerType.GroupLayer,
AbsolutePathType = "AddLayerWay" //标记为外部路径数据
};
nodes.Add(node);
DirectoryInfo directoryInfo = new DirectoryInfo(openFileDialog.SelectedPath);
GetChildren(directoryInfo, node);
LoadFileDataPath(openFileDialog.SelectedPath);
}
}
catch (Exception ex)
{
LogAPI.Debug("选择文件失败:" + ex);
MessageHelper.Show("选择文件失败:" + ex.Message);
}
}
public void GetChildren(DirectoryInfo directoryInfo, LayerCfg node)
{
var subDirectory = directoryInfo.GetDirectories();
if (subDirectory.Length != 0)
{
for (int i = 0; i < subDirectory.Length; i++)
{
if (subDirectory[i].Name.ToLower().Contains("gdb") || subDirectory[i].Name.ToLower().Contains("mdb") || subDirectory[i].Name.ToLower().Contains("shp") || subDirectory[i].Name.ToLower().Contains("vct") || subDirectory[i].Name.ToLower().Contains("img") || subDirectory[i].Name.ToLower().Contains("jpg") || subDirectory[i].Name.ToLower().Contains("jpeg") || subDirectory[i].Name.ToLower().Contains("png") || subDirectory[i].Name.ToLower().Contains("tif")) continue;
string size1 = GetFileSize(GetDirectoryLength(subDirectory[i].FullName));
if (size1 == "0" && (Directory.GetDirectories(subDirectory[i].FullName).Length == 0 || Directory.GetFiles(subDirectory[i].FullName).Length == 0)) continue;
string str = subDirectory[i].FullName.Replace(rootFilePath, "");
str = str.Trim();
int length = str.Split('\\').Length;
if (length <= 3)
{
string size = GetFileSize(GetDirectoryLength(subDirectory[i].FullName));
node.Layers.Add(new LayerCfg(node)
{
IsChecked = true,
LayerName = subDirectory[i].Name,
FcPath = subDirectory[i].FullName,
FileSize = size,
LayerType = EnumLayerType.GroupLayer,
AbsolutePathType = "AddLayerWay" //标记为外部路径数据
});
nodes.Add(node.Layers[node.Layers.Count - 1]);
GetChildren(subDirectory[i], node.Layers[node.Layers.Count - 1]);
}
}
}
}
private void LoadFileDataPath(string projectPath)
{
try
{
if (Directory.Exists(projectPath))
{
List<string> dataPathList = new List<string>();
GetOtherDataPath(projectPath, dataPathList);
if (dataPathList.Count != 0)
{
foreach (string path in dataPathList)
{
//获取gdb内部表
ImportDataType = System.IO.Path.GetExtension(path).ToUpper().Replace('.', ' ').TrimStart();
if (string.IsNullOrWhiteSpace(ImportDataType) || (ImportDataType != "VCT" && ImportDataType != "GDB" && ImportDataType != "MDB" && ImportDataType != "SHP" && ImportDataType != "TIF" && ImportDataType != "TIFF" && ImportDataType != "IMG" && ImportDataType != "JPG" && ImportDataType != "JPEG" && ImportDataType != "PNG")) continue;
if (ImportDataType == "SHP")
{
ImportDataType = "Shape";
}
if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("VCT"))
{
string TempMDBFolderPath = System.IO.Path.GetTempPath();
string TempMDBPath = System.IO.Path.Combine(TempMDBFolderPath, string.Format("{0}.mdb", System.IO.Path.GetFileNameWithoutExtension(path)));
if (File.Exists(TempMDBPath))
{
File.Delete(TempMDBPath);
}
VCTToMDBHelper3 vcttomdb = new VCTToMDBHelper3
{
RootPath = TempMDBFolderPath
};
vcttomdb.VCTToMDB(path);
if (!File.Exists(TempMDBPath)) continue;
SourceMDBPath = TempMDBPath;
}
GetPathIDPID(path, out LayerCfg parentLayer);
SetTableMapping(path, parentLayer);
}
}
else if (dataPathList.Count == 0 && projectPath.ToLower().EndsWith("gdb"))
{
GetPathIDPID(projectPath, out LayerCfg parentLayer);
SetTableMapping(projectPath, parentLayer);
}
BatchLoadDataModel.Instance.BatchLoadDatas = nodes;
Cfg.BHTBLayerLoadCfg = BatchLoadDataModel.Instance.BatchLoadDatas;
UcTreeListViewControl.Instance.Refresh();
Cfg.Save();
}
}
catch (Exception ex)
{
LogAPI.Debug("获取数据文件失败:" + ex);
}
}
private void SetTableMapping(string path, LayerCfg parentLayer)
{
if (parentLayer == null) return;
IWorkspaceAPI t_WsAPI = null;
IWorkspaceAPI s_WsAPI = null;
IFeatureClassAPI s_FCAPI = null;
try
{
string s_MdbPath = null;
if (ImportDataType == "VCT")
{
s_MdbPath = SourceMDBPath;
}
else
{
s_MdbPath = path;
}
if ((ImportDataType == "MDB" || ImportDataType == "VCT") && !File.Exists(s_MdbPath))
{
if (!System.IO.Path.GetFileName(s_MdbPath).Equals(".mdb"))
{
return;
}
}
else if (ImportDataType == "GDB" && !Directory.Exists(s_MdbPath))
{
return;
}
if (ImportDataType == "MDB" || ImportDataType == "VCT")
{
s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
}
else if (ImportDataType == "Shape")
{
//s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.ShapeFile);
string filePathName = System.IO.Path.GetFileNameWithoutExtension(path);
//IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
//IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(Path.GetDirectoryName(s_MdbPath), 0);
//IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
//IFeatureClass pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(filePathName);
LayerCfg newLayerCfg = new LayerCfg(parentLayer)
{
IsChecked = true,
//LayerName = pSourceFeatureClass.AliasName.ToString(),
LayerName = filePathName,
FcPath = path,
FileSize = "",
LayerType = EnumLayerType.FeatureLayer,
AbsolutePathType = "AddLayerWay" //标记为外部路径数据
};
parentLayer.Layers.Add(newLayerCfg);
nodes.Add(newLayerCfg);
return;
}
else if (ImportDataType == "TIF" || ImportDataType == "TIFF" || ImportDataType == "IMG" || ImportDataType == "JPG" || ImportDataType == "JPEG" || ImportDataType == "PNG")
{
//s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.RasterFile);
string filePathName = System.IO.Path.GetFileName(path);
LayerCfg newLayerCfg = new LayerCfg(parentLayer)
{
IsChecked = true,
LayerName = filePathName.ToString(),
FcPath = path,
FileSize = "",
LayerType = EnumLayerType.RasterLayer,
AbsolutePathType = "AddLayerWay" //标记为外部路径数据
};
parentLayer.Layers.Add(newLayerCfg);
nodes.Add(newLayerCfg);
return;
}
else
{
s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
}
//源数据获取图层
if (s_WsAPI == null) return;//源数据不能为空
List<KeyAndValue> s_TbList = s_WsAPI.GetFeatureClassName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureDataset).Where(x => !x.Value.StartsWith("TDQSQ")).Select(x => new KeyAndValue() { S_Key = x.Key, S_Value = x.Value }).ToList();
Dictionary<string, string> s_TbList2 = s_WsAPI.GetFeatureClassName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass);
foreach (string item in s_TbList2.Keys)
{
if (!s_TbList.Select(x => x.S_Value).Contains(item))
s_TbList.Add(new KeyAndValue() { S_Key = item, S_Value = s_TbList2[item] });
}
for (int i = 0; i < s_TbList.Count; i++)
{
LayerCfg newLayerCfg = new LayerCfg(parentLayer)
{
IsChecked = true,
LayerName = s_TbList[i].S_Key.ToString(),
FcPath = path,
FileSize = "",
LayerType = EnumLayerType.FeatureLayer,
AbsolutePathType = "AddLayerWay" //标记为外部路径数据
};
parentLayer.Layers.Add(newLayerCfg);
nodes.Add(newLayerCfg);
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
}
finally
{
if (s_WsAPI != null)
s_WsAPI.CloseWorkspace();
if (t_WsAPI != null)
t_WsAPI.CloseWorkspace();
if (s_FCAPI != null)
{
s_FCAPI.CloseFeatureClass();
s_FCAPI = null;
}
}
}
private void cobDataBase_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cobDataBase.ItemsSource != null)
{
try
{
BatchLoadDataModel.Instance.BatchLoadDatas.Clear();
nodes.Clear();
string selectedPath = this.cobDataBase.SelectedItem.ToString();
string[] str = selectedPath.Split('\\');
if (str == null || str.Length == 0) return;
titleName = str[str.Length - 1];
rootFilePath = selectedPath;
//表头
string size = GetFileSize(GetDirectoryLength(selectedPath));
LayerCfg node = new LayerCfg()
{
IsChecked = true,
LayerName = titleName,
FcPath = selectedPath,
FileSize = size,
LayerType = EnumLayerType.GroupLayer,
AbsolutePathType = "AddLayerWay" //标记为外部路径数据
};
nodes.Add(node);
DirectoryInfo directoryInfo = new DirectoryInfo(selectedPath);
GetChildren(directoryInfo, node);
LoadFileDataPath(selectedPath);
}
catch (Exception ex)
{
LogAPI.Debug("选择基础数据库失败:" + ex);
ProgressHelper.CloseProcessBar();
MessageHelper.Show("选择基础数据库失败:" + ex.Message);
}
}
}
private void GetPathIDPID(string path, out LayerCfg parentLayer)
{
parentLayer = null;
if (string.IsNullOrEmpty(path)) return;
try
{
foreach (LayerCfg item in nodes)
{
if (item.FcPath == path)
{
parentLayer = item;
break;
}
}
if (parentLayer == null)
{
path = path.Substring(0, path.LastIndexOf('\\'));
GetPathIDPID(path, out parentLayer);
//path = path.Substring(0, path.LastIndexOf('\\'));
//foreach (LayerCfg item in nodes)
//{
// if (item.FcPath == path)
// {
// parentLayer = item;
// break;
// }
//}
}
}
catch (Exception ex)
{
LogAPI.Debug("获取数据失败:" + ex);
return;
}
}
private long GetDirectoryLength(string dirPath)
{
try
{
if (!Directory.Exists(dirPath))
return FileSize(dirPath);
long len = 0;
DirectoryInfo di = new DirectoryInfo(dirPath);
foreach (FileInfo fi in di.GetFiles())
{
len += fi.Length;
}
DirectoryInfo[] dis = di.GetDirectories();
if (dis.Length > 0)
{
for (int i = 0; i < dis.Length; i++)
{
len += GetDirectoryLength(dis[i].FullName);
}
}
return len;
}
catch (Exception ex)
{
LogAPI.Debug("获取文件大小失败:" + ex);
return 0;
}
}
private long FileSize(string filePath)
{
long temp = 0;
try
{
if (File.Exists(filePath) == false)
{
string[] str1 = Directory.GetFileSystemEntries(filePath);
foreach (string s1 in str1)
{
temp += FileSize(s1);
}
}
else
{
FileInfo fileInfo = new FileInfo(filePath);
return fileInfo.Length;
}
return temp;
}
catch (Exception e)
{
LogAPI.Debug("计算文件大小失败:" + e);
return temp;
}
}
private string GetFileSize(long filesize)
{
try
{
if (filesize <= 0) { return "0"; }
else if (filesize >= 1024 * 1024 * 1024) //文件大小大于或等于1024MB
{
return string.Format("{0:0.00} GB", (double)filesize / (1024 * 1024 * 1024));
}
else if (filesize >= 1024 * 1024) //文件大小大于或等于1024KB
{
return string.Format("{0:0.00} MB", (double)filesize / (1024 * 1024));
}
else if (filesize >= 1024) //文件大小大于等于1024bytes
{
return string.Format("{0:0.00} KB", (double)filesize / 1024);
}
else
{
return string.Format("{0:0.00} bytes", filesize);
}
}
catch (Exception ex)
{
LogAPI.Debug("计算文件大小失败:" + ex);
return null;
}
}
private void GetOtherDataPath(string dirPath, List<string> pathList)
{
try
{
string[] dirArr = Directory.GetDirectories(dirPath);
string[] fileArr = Directory.GetFiles(dirPath);
// 遍历所有文件
if (fileArr.Length > 0)
{
string fileName;
foreach (string file in fileArr)
{
fileName = System.IO.Path.GetFileName(file);
if ((fileName.ToLower().EndsWith(".vct") || fileName.ToLower().EndsWith(".mdb") || fileName.ToLower().EndsWith(".shp") || fileName.ToLower().EndsWith(".tif") || fileName.ToLower().EndsWith(".tiff") || fileName.ToLower().EndsWith(".img") || fileName.ToLower().EndsWith(".jpg") || fileName.ToLower().EndsWith(".jpeg") || fileName.ToLower().EndsWith(".png")) && !pathList.Contains(file))
{
pathList.Add(file);
}
}
}
// 遍历所有文件夹
if (dirArr.Length > 0)
{
string folderName;
string dir;
for (int i = 0; i < dirArr.Length; i++)
{
dir = dirArr[i];
//if (GetFileSize(GetDirectoryLength(dir)) == "0" && (Directory.GetDirectories(dir).Length == 0 || Directory.GetFiles(dir).Length == 0)) continue;
folderName = System.IO.Path.GetFileName(dir);
if (!pathList.Contains(dir))
{
pathList.Add(dir);
}
GetOtherDataPath(dir, pathList);
}
}
}
catch (Exception ex)
{
LogAPI.Debug("获取数据文件失败:" + ex);
}
}
private void GetEnvelopeBorder()
{
List<ILayer> MapLayerList = MapsManager.Instance.MapService.GetAllLayerInMap<ILayer>();
List<ILayer> SelectLayerList = new List<ILayer>();
foreach (ILayer item in MapLayerList)
{
if ((item as RasterLayer) != null || (item as KOTilesLayer) != null)
{
m_featureLayer = item;
if (CurrentEnvelope == null)
CurrentEnvelope = item.AreaOfInterest;
else
CurrentEnvelope.Union(item.AreaOfInterest);
SelectLayerList.Add(item);
break;
}
}
if (SelectLayerList.Count == 0)
{
foreach (ILayer item in MapLayerList)
{
if ((item as IFeatureLayer) != null)
{
if ((item as IFeatureLayer).FeatureClass.FeatureCount(null) == 0) continue;
m_featureLayer = item;
//确保最大范围
if (CurrentEnvelope == null)
CurrentEnvelope = item.AreaOfInterest;
else
{
IEnvelope env = item.AreaOfInterest;
//if (env != null)
// CurrentEnvelope.Union(env);
if (env.XMin < 0 || env.YMin < 0) continue;
if (env.XMax > CurrentEnvelope.XMax)
{
CurrentEnvelope.XMax = env.XMax;
}
if (env.YMax > CurrentEnvelope.YMax)
{
CurrentEnvelope.YMax = env.YMax;
}
if (env.XMin < CurrentEnvelope.XMin)
{
CurrentEnvelope.XMin = env.XMin;
}
if (env.YMin < CurrentEnvelope.YMin)
{
CurrentEnvelope.YMin = env.YMin;
}
}
SelectLayerList.Add(item);
}
}
}
IEnvelope envelope = CurrentEnvelope;
if (envelope == null) return;
IFeatureCursor insertCur = null;
IFeatureBuffer newFeature = null;
try
{
Rectangle wjfw = new Rectangle();
wjfw.MinX = envelope.XMin;
wjfw.MaxX = envelope.XMax;
wjfw.MaxY = envelope.YMax;
wjfw.MinY = envelope.YMin;
List<BHTBFramingDatas> bwtfList = GetBWTFH(wjfw);
if (bwtfList.Count == 0) return;
IFeatureClass featureClass = MapsManager.Instance.MapService.GetFeatureClassByName("ZYQ");
if (featureClass == null) return;
(featureClass as ITable).DeleteSearchedRows(null);
ISpatialReference spr = (featureClass as IGeoDataset).SpatialReference;
insertCur = featureClass.Insert(true);
int k = 0;
foreach (var item in bwtfList)
{
k++;
newFeature = featureClass.CreateFeatureBuffer();
newFeature.Shape = GetGeoByWJFW(item.WJFW, spr);//同时转换坐标系统
newFeature.set_Value(newFeature.Fields.FindField("ZYQBH"), item.TFH);
newFeature.set_Value(newFeature.Fields.FindField("ZYQMC"), item.TBName);
newFeature.set_Value(newFeature.Fields.FindField("ZYQZT"), 0);
newFeature.set_Value(newFeature.Fields.FindField("HH"), item.HH);
newFeature.set_Value(newFeature.Fields.FindField("LH"), item.LH);
insertCur.InsertFeature(newFeature);
if (k % 500 == 0)
{
k = 0;
insertCur.Flush();
}
}
if (k > 0)
{
insertCur.Flush();
}
}
catch (Exception ex)
{
LogAPI.Debug("图斑分幅时发生异常,异常信息如下:");
LogAPI.Debug(ex);
return;
}
finally
{
if (insertCur != null)
Marshal.ReleaseComObject(insertCur);
if (newFeature != null)
Marshal.ReleaseComObject(newFeature);
GC.Collect();
}
}
private List<BHTBFramingDatas> GetBWTFH(Rectangle wjfw)
{
if (wjfw == null) return null;
List<BHTBFramingDatas> bwtfList = new List<BHTBFramingDatas>();
IIdentify indentify = null;
IGeometry pGeometry = null;
try
{
if (m_featureLayer != null)
indentify = m_featureLayer as IIdentify;
double xlength = wjfw.MaxX - wjfw.MinX;
double ylength = wjfw.MaxY - wjfw.MinY;
int xCount = (int)Math.Ceiling(xlength / FramingSize);
int yCount = (int)Math.Ceiling(ylength / FramingSize);
int num = 0;
for (int y = 0; y < yCount; y++)
{
for (int x = 0; x < xCount; x++)
{
Rectangle rectangle = new Rectangle()
{
MinX = wjfw.MinX + x * FramingSize,
MinY = wjfw.MinY + y * FramingSize,
MaxX = wjfw.MinX + (x + 1) * FramingSize,
MaxY = wjfw.MinY + (y + 1) * FramingSize
};
if (rectangle.MaxX > wjfw.MaxX)
{
rectangle.MaxX = wjfw.MaxX;
}
if (rectangle.MaxY > wjfw.MaxY)
{
rectangle.MaxY = wjfw.MaxY;
}
if (indentify != null)
{
IEnvelope envelope = new EnvelopeClass();
envelope.XMax = rectangle.MaxX;
envelope.XMin = rectangle.MinX;
envelope.YMax = rectangle.MaxY;
envelope.YMin = rectangle.MinY;
pGeometry = envelope as IGeometry;
if (pGeometry != null)
{
IArray pIDs = indentify.Identify(pGeometry);
if (pIDs == null || pIDs.Count == 0) continue;
}
}
num++;
BHTBFramingDatas bwtf = new BHTBFramingDatas();
bwtf.TFH = "ZYQ" + num.ToString("000000");
bwtf.TBName = "作业区_" + num.ToString("000000");
bwtf.IsModify = "否";
bwtf.HH = x;
bwtf.LH = y;
bwtf.WJFW = rectangle;
bwtfList.Add(bwtf);
}
}
return bwtfList;
}
catch (Exception ex)
{
LogAPI.Debug("图斑分幅错误:" + ex);
return bwtfList;
}
}
private IGeometry GetGeoByWJFW(Rectangle reg, ISpatialReference spr)
{
ArrayList result = new ArrayList();
try
{
result.Add((byte)1);//顺序
result.AddRange(BitConverter.GetBytes(3));//类型 面
result.AddRange(BitConverter.GetBytes(1));//环数
ArrayList jmdArray = new ArrayList();
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY));
//上边
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxY));
//右边
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxY));
//下边
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY));
//首尾相连
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY));
result.AddRange(BitConverter.GetBytes(jmdArray.Count / 16));
result.AddRange(jmdArray);
byte[] wkb = (byte[])result.ToArray(typeof(byte));
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
IGeometry geom;
int countin = wkb.GetLength(0);
factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin);
if ((geom as IArea).Area < 0)
{
IPolygon pPolygon = geom as IPolygon;
pPolygon.ReverseOrientation();
}
if (geom == null) return null;
return geom;
}
catch (Exception ex)
{
LogAPI.Debug("获取分幅后的图斑形状异常:" + ex);
return null;
}
}
private void MarkLayer()
{
try
{
IFeatureLayer pFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("ZYQ");
if (pFeatureLayer == null) return;
IGeoFeatureLayer pGeoLayer = pFeatureLayer as IGeoFeatureLayer;
IRgbColor pColor = new RgbColorClass() { Red = 85, Blue = 105, Green = 255 };
stdole.IFontDisp pFont = new stdole.StdFont()
{
Name = "宋体",
//Bold = true
} as stdole.IFontDisp;
ITextSymbol pTextSymbol = new TextSymbolClass()
{
Color = pColor,
Font = pFont,
Size = 8
};
IBasicOverposterLayerProperties pBasicOverLayerPro = new BasicOverposterLayerPropertiesClass();
pBasicOverLayerPro.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon;
pBasicOverLayerPro.GenerateUnplacedLabels = true;
pBasicOverLayerPro.NumLabelsOption = esriBasicNumLabelsOption.esriOneLabelPerShape;
ILabelEngineLayerProperties pLableEngine = new LabelEngineLayerPropertiesClass()
{
Symbol = pTextSymbol,
IsExpressionSimple = true
};
IOverposterLayerProperties2 pOverLayerProper = pBasicOverLayerPro as IOverposterLayerProperties2;
pOverLayerProper.TagUnplaced = true;//设置该属性,目的是不被其他element遮挡
pLableEngine.BasicOverposterLayerProperties = pBasicOverLayerPro;
IAnnotateLayerProperties pAnnoPros = pLableEngine as IAnnotateLayerProperties;
pGeoLayer.AnnotationProperties.Add(pAnnoPros);
pGeoLayer.DisplayAnnotation = true;
AxMapControl axMapControl1 = MapsManager.Instance.MapService.getAxMapControl();
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, axMapControl1.Extent);
}
catch (Exception ex)
{
LogAPI.Debug("设置标注时发生异常,异常信息如下:" + ex);
return;
}
}
}
public class Rectangle
{
public double MaxX { get; set; }
public double MaxY { get; set; }
public double MinX { get; set; }
public double MinY { get; set; }
}
public class BHTBFramingDatas
{
/// <summary>
/// 图幅号
/// </summary>
public string TFH { get; set; }
/// <summary>
/// 图斑名称
/// </summary>
public string TBName { get; set; }
/// <summary>
/// 是否已修改
/// </summary>
public string IsModify { get; set; }
/// <summary>
/// 外接范围
/// </summary>
public Rectangle WJFW { get; set; }
/// <summary>
/// 行号
/// </summary>
public int HH { get; set; }
/// <summary>
/// 列号
/// </summary>
public int LH { get; set; }
}
}