using DevExpress.XtraEditors;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.OpenData.Filter;
using KGIS.Framework.OpenData.InterFace;
using KGIS.Framework.Utils.Helper;
using KGIS.Plugin.LayerProperty.Interface;
using KGIS.Plugin.LayerProperty.Model;
using System;
using System.Text;
namespace KGIS.Plugin.LayerProperty.View.UC_Controls
{
public partial class UCDataSourceProperty : XtraUserControl, IUCPropertyPageEx, IPropertyPage
{
private ILayer m_Layer;
private string SRName;
private int SRType;
private ISpatialReference m_SpatialReference;
private IRasterProperty m_RasterProperty;
private IRasterDataset m_RasterDataset;
private IFeatureClass SelectFC;
private IRasterDataset selectRasterDs;
private bool isDirty;
public IUCPropertyPageEx ucFieldsPropertyPage;
public UCDataSourceProperty()
{
InitializeComponent();
}
public int Priority { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public string Title { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public bool IsPageDirty
{
get
{
return this.isDirty;
}
set
{
this.isDirty = value;
}
}
public event System.EventHandler EditorChanged;
public int Activate()
{
throw new NotImplementedException();
}
public void Cancel()
{
throw new NotImplementedException();
}
public bool CanWrite2Prop()
{
return true;
}
public void Deactivate()
{
throw new NotImplementedException();
}
public void SetDefaultValue(object value)
{
}
public void InitUC(object layerProperty)
{
try
{
if (layerProperty is ILayer)
{
this.m_Layer = (layerProperty as ILayer);
}
IGeoDataset geoDataset = this.m_Layer as IGeoDataset;
if (geoDataset is IFeatureLayer)
{
this.groupControl1.Visible = false;
SetMemCoordinateSysText((this.m_Layer as IFeatureLayer).FeatureClass);
//this.GetGeoDatasetInfo(this.m_Layer as IGeoDataset);
}
else
{
if (this.m_Layer is IRasterLayer)
{
this.groupControl1.Visible = true;
this.InitForm(((this.m_Layer as IRasterLayer).Raster as IRaster2).RasterDataset);
}
else
{
this.groupControl1.Visible = false;
//this.GetGeoDatasetInfo(geoDataset);
}
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
}
public void Write2Prop()
{
if (SelectFC != null)
{
(this.m_Layer as IFeatureLayer).FeatureClass = SelectFC;
}
if (selectRasterDs != null && this.m_Layer is IRasterLayer)
{
(m_Layer as IRasterLayer).CreateFromDataset(selectRasterDs);
}
}
private StringBuilder GetDataSourceInfoByFC(IFeatureClass featureClass)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("数据类型:".PadRight(15) + (featureClass as FeatureClass).Category);
if ((featureClass as FeatureClass).Workspace != null)
{
if ((featureClass as FeatureClass).Workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriRemoteDatabaseWorkspace)
{
stringBuilder.AppendLine("服务器:".PadRight(16) + (featureClass as FeatureClass).Workspace.ConnectionProperties.GetProperty("Server".ToString()));
stringBuilder.AppendLine("用户名:".PadRight(16) + (featureClass as FeatureClass).Workspace.ConnectionProperties.GetProperty("User".ToString()));
stringBuilder.AppendLine("实例名:".PadRight(16) + (featureClass as FeatureClass).Workspace.ConnectionProperties.GetProperty("Instance".ToString()));
stringBuilder.AppendLine("版本:".PadRight(17) + (featureClass as FeatureClass).Workspace.ConnectionProperties.GetProperty("Version".ToString()));
}
else
{
stringBuilder.AppendLine("数据位置:".PadRight(15) + (featureClass as FeatureClass).Workspace.PathName);
}
}
if (featureClass.FeatureDataset != null)
{
stringBuilder.AppendLine("要素集:".PadRight(16) + featureClass.FeatureDataset.Name);
}
stringBuilder.AppendLine("数据要素类:".PadRight(14) + (featureClass as FeatureClass).Name);
stringBuilder.AppendLine("要素类型:".PadRight(15) + featureClass.FeatureType.ToString().Substring(6));
stringBuilder.AppendLine("几何类型:".PadRight(15) + featureClass.ShapeType.ToString().Substring(12));
stringBuilder.AppendLine("");
return stringBuilder;
}
private void SetMemCoordinateSysText(IFeatureClass featureClass)
{
try
{
m_SpatialReference = (featureClass as IGeoDataset).SpatialReference;
IEnvelope extent = (featureClass as IGeoDataset).Extent;
//double xmin = 0;
//double xmax = 0;
//double ymin = 0;
//double ymax = 0;
//m_SpatialReference.GetDomain(out xmin, out xmax, out ymin, out ymax);
//extent.XMin = xmin;
//extent.XMax = xmax;
//extent.YMin = ymin;
//extent.YMax = ymax;
this.ucExtentSet1.SetEnvelope(extent, true);
}
catch
{
}
StringBuilder dataSourceInfo = GetDataSourceInfoByFC(featureClass);
StringBuilder coordinateSystemInfo = Utils.Util.GetCoordinateSystemInfo(m_SpatialReference);
dataSourceInfo.Append(coordinateSystemInfo);
this.memCoordinateSys.Text = dataSourceInfo.ToString();
}
private void InvokeEditValueChanged(object sender, System.EventArgs e)
{
if (this.EditorChanged != null)
{
this.EditorChanged(sender, e);
}
this.isDirty = true;
}
///
/// 设置数据源
///
///
///
private void BtnSetDataSource_Click(object sender, System.EventArgs e)
{
try
{
object obj = GetGisFileSource();
if (obj == null)
return;
if (obj is IFeatureClass)
{
SelectFC = obj as IFeatureClass;
if (SelectFC != null && (SelectFC as IGeoDataset) != null)
{
if (!KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare2((SelectFC as IGeoDataset).SpatialReference, null))
{
MessageHelper.ShowTips("选择要素类与当前工程坐标参考不一致!");
return;
}
SetMemCoordinateSysText(SelectFC);
InvokeEditValueChanged(sender, e);
if (ucFieldsPropertyPage != null && ucFieldsPropertyPage is UCFieldsPropertyPage)
{
(ucFieldsPropertyPage as UCFieldsPropertyPage).InitFields(SelectFC.Fields);
}
}
}
else if (obj is IRasterDataset)
{
//修改人:李进营 修改时间:2018-09-19 增加栅格图层设置数据源无效问题
selectRasterDs = (obj as IRasterDataset);
this.InitForm(selectRasterDs);
InvokeEditValueChanged(sender, e);
}
}
catch (Exception ex)
{
//RdbUtil.AddException(ex);
}
}
private object GetGisFileSource()
{
try
{
KGIS.Framework.OpenData.Control.OpenDataDialog pDialog = new KGIS.Framework.OpenData.Control.OpenDataDialog();
ISpatialDataObjectFilter pOFilter;
pOFilter = new FilterDatasetsAndLayers();
pDialog.AddFilter(pOFilter, true);
pDialog.Title = "选择矢量图层数据";
pDialog.AllowMultiSelect = false;
pDialog.RestoreLocation = true;
pDialog.StartLocation = pDialog.FinalLocation;
if (pDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK && pDialog.Selection.Count != 0)
{
foreach (ISpatialDataObject distObj in pDialog.Selection)
{
//修改人:李进营 修改时间:2018-09-19 修复栅格数据选区无效问题
if (distObj.DatasetType == esriDatasetType.esriDTFeatureClass || distObj.DatasetType == esriDatasetType.esriDTRasterDataset)
{
return (distObj.DatasetName as ESRI.ArcGIS.esriSystem.IName).Open();
}
}
}
return null;
}
catch (Exception)
{
return null;
}
}
private void InitForm(IRasterDataset pRasterDataset)
{
try
{
if (pRasterDataset != null)
{
this.m_RasterDataset = pRasterDataset;
IDataset dataset = (IDataset)this.m_RasterDataset;
ESRI.ArcGIS.Geodatabase.IWorkspace workspace = dataset.Workspace;
if (workspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
{
this.m_RasterProperty = new RemoteRasterPropetry(this.m_RasterDataset);
}
else
{
this.m_RasterProperty = new LocalRasterPropetry(this.m_RasterDataset);
}
this.propertyRaster.SelectedObject = this.m_RasterProperty;
this.propertyRaster.RetrieveFields();
}
}
catch (Exception)
{
}
}
}
}