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.
		
		
		
		
		
			
		
			
				
					
					
						
							284 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							284 lines
						
					
					
						
							11 KiB
						
					
					
				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; | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 设置数据源 | 
						|
        /// </summary> | 
						|
        /// <param name="sender"></param> | 
						|
        /// <param name="e"></param> | 
						|
        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) | 
						|
            { | 
						|
            } | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |