using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.OpenData.Control;
using KGIS.Framework.OpenData.Filter;
using KGIS.Framework.OpenData.InterFace;
using KGIS.Framework.Utils.Helper;
using Kingo.PluginServiceInterface.Helper.VCT;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
namespace Kingo.PluginServiceInterface.Helper
{
///
/// 选择矢量数据帮助类
///
public class OpenDataDialogHelper
{
///
/// 选择矢量数据(GDB_MDB_SHP)
///
/// 选择数据的标题
/// 选择数据的路径集合
public static void OpenDataDialog(string Title, ref string FinalLocation, ref List Selection)
{
try
{
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterShapefiles();
pDialog.AddFilter(pOFilter, true);
pOFilter = new FilterGeoDatabase();
//pOFilter = new FilterGeoDatabaseFile();//GDB格式
//pOFilter = new FilterGeoDatabasePersonal();//MDB格式
pDialog.AddFilter(pOFilter, true);
pDialog.AllowMultiSelect = true;
pDialog.Title = Title;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
string ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
if ("GDB,MDB".Contains(ImportDataType) && pDialog.Selection.Count > 1)
throw new Exception("GDB,MDB格式不支持多选!");
if (string.IsNullOrWhiteSpace(ImportDataType) || !"GDB,MDB,SHP".Contains(ImportDataType))
throw new Exception("选择的数据路径有误,请根据过滤条件,重新选择数据库!!");
FinalLocation = pDialog.FinalLocation;
Selection = pDialog.Selection;
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("选择矢量数据异常", ex);
throw ex;
}
}
///
/// 选择矢量数据(GDB_MDB_SHP)
///
/// 标题
/// 数据绝对路径
/// 矢量数据要素类
public static void OpenDataDialog(string Title, ref string FinalLocation, ref List Selection, ref List otherDataPathList, ref List pSourceFCList)
{
IWorkspaceFactory pWorkspaceFactory = null;
IWorkspace pWorkspace = null;
IFeatureWorkspace pFeatureWorkspace = null;
try
{
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterShapefiles();
pDialog.AddFilter(pOFilter, true);
pOFilter = new FilterGeoDatabase();
pDialog.AddFilter(pOFilter, true);
pDialog.AllowMultiSelect = true;
pDialog.Title = Title;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
string ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
if ("GDB,MDB".Contains(ImportDataType) && pDialog.Selection.Count > 1)
throw new Exception("GDB,MDB格式不支持多选!");
if (string.IsNullOrWhiteSpace(ImportDataType) || !"GDB,MDB,SHP".Contains(ImportDataType))
throw new Exception("选择的数据路径有误,请根据过滤条件,重新选择数据库!!");
FinalLocation = pDialog.FinalLocation;
Selection = pDialog.Selection;
string fileName = string.Empty;
if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("SHP"))
{
pSourceFCList = new List();
for (int i = 0; i < pDialog.Selection.Count; i++)
{
pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
pWorkspace = pWorkspaceFactory.OpenFromFile(Path.GetDirectoryName(pDialog.Selection[i].FullName), 0);
pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pSourceFeatureClass = pFeatureWorkspace.OpenFeatureClass(pDialog.Selection[i].Name);
pSourceFCList.Add(pSourceFeatureClass);
fileName += pDialog.Selection[i].Name + ";";
}
otherDataPathList.Add(fileName);
}
else if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("VCT"))
{
string TempMDBFolderPath = Path.GetTempPath();
string TempMDBPath = Path.Combine(TempMDBFolderPath, string.Format("{0}.mdb", Path.GetFileNameWithoutExtension(pDialog.FinalLocation)));
if (File.Exists(TempMDBPath))
{
File.Delete(TempMDBPath);
}
VCTToMDBHelper3 vcttomdb = new VCTToMDBHelper3
{
RootPath = TempMDBFolderPath
};
vcttomdb.VCTToMDB(pDialog.FinalLocation);
if (!File.Exists(TempMDBPath))
{
MessageHelper.ShowError("VCT文件解析失败");
return;
}
otherDataPathList.Add(pDialog.FinalLocation);
}
else
otherDataPathList.Add(pDialog.FinalLocation);
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("选择矢量数据异常", ex);
throw ex;
}
finally
{
if (pWorkspaceFactory != null)
Marshal.ReleaseComObject(pWorkspaceFactory);
if (pFeatureWorkspace != null)
Marshal.ReleaseComObject(pFeatureWorkspace);
if (pWorkspace != null)
Marshal.ReleaseComObject(pWorkspace);
}
}
///
/// 选择矢量数据(SHP)
///
/// 选择数据的标题
/// 选择数据的路径集合
public static void OpenDataDialogForSHP(ref string FinalLocation, ref List Selection)
{
try
{
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterShapefiles();
pDialog.AddFilter(pOFilter, true);
pDialog.AllowMultiSelect = true;
pDialog.Title = "选择SHP矢量数据";
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
string ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
if (string.IsNullOrWhiteSpace(ImportDataType) || !"SHP".Contains(ImportDataType))
throw new Exception("选择的数据路径有误,请根据过滤条件,重新选择数据库!!");
FinalLocation = pDialog.FinalLocation;
Selection = pDialog.Selection;
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("选择矢量数据异常", ex);
throw ex;
}
}
///
/// 选择矢量数据(GDB_MDB)
///
/// 标题
/// 数据绝对路径
/// 矢量数据要素类
public static void OpenDataDialog(string Title, ref string FinalLocation)
{
try
{
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterGeoDatabase();
pDialog.AddFilter(pOFilter, true);
pDialog.AllowMultiSelect = false;
pDialog.Title = Title;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
string ImportDataType = Path.GetExtension(pDialog.FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
if (string.IsNullOrWhiteSpace(ImportDataType) || !"GDB,MDB".Contains(ImportDataType))
throw new Exception("选择的数据路径有误,请根据过滤条件,重新选择数据库!!");
FinalLocation = pDialog.FinalLocation;
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("选择矢量数据异常", ex);
throw ex;
}
}
///
/// 选择矢量数据(FeatureClass)
///
/// 标题
/// 要素类全名称路径
/// 要素类
public static void OpenDataDialog(string Title, ref string FullName, ref IFeatureClass SelFeatureClass)
{
try
{
OpenDataDialog pDialog = new OpenDataDialog();
ISpatialDataObjectFilter pOFilter = new FilterShapefiles();
pDialog.AddFilter(pOFilter, true);
pOFilter = new FilterFeatureDatasetsAndFeatureClasses();
pDialog.AddFilter(pOFilter, true);
pDialog.Title = Title;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
pDialog.AllowMultiSelect = false;
System.Windows.Forms.DialogResult dialogResult = pDialog.ShowDialog();
if (dialogResult == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
foreach (ISpatialDataObject distObj in pDialog.Selection)
{
if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass)
{
if ((distObj.DatasetName as ESRI.ArcGIS.esriSystem.IName).Open() is IFeatureClass pFeatureClass)
{
SelFeatureClass = pFeatureClass;
FullName = distObj.FullName;
break;
}
}
}
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("选择图层出现异常", ex);
MessageHelper.ShowError("选择图层出现异常:" + ex.Message);
}
}
}
}