首页 > 代码库 > ArcEngine加载SDE中的栅格数据的问题

ArcEngine加载SDE中的栅格数据的问题

在加载矢量数据时直接转到IFeatureWorkspace接口即可,但是在加载栅格数据时要转到IRasterWorkspaceEx接口。效果图如下,双击即可添加到Globe中。


代码如下:

   public partial class SDEDataViewer : DevComponents.DotNetBar.Office2007Form
    {
        #region 私有变量
        private IWorkspace sdeWorkSpace; //sde工作控件
        private IGlobeControl globecontrol;
      
        private string selectedVectorName;//待添加矢量
        private string selectedRasterName;
        #endregion

        #region 构造函数
        public SDEDataViewer(IGlobeControl m_globecontrol , IWorkspace workspace)
        {
            this.sdeWorkSpace = workspace;
            this.globecontrol = m_globecontrol;
            InitializeComponent();
        }
        #endregion

        #region load

        private void SDEDataViewer_Load(object sender , EventArgs e)
        {
            IAoInitialize initAO = new AoInitializeClass();
            initAO.Initialize((esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB));
            loadData();
        }
        //获取所有数据
        private void loadData()
        {
            listView_vector.GridLines = true;//表格是否显示网格线
            listView_vector.FullRowSelect = true;//是否选中整行
            listView_vector.View = View.Details;//设置显示方式
            listView_vector.Scrollable = true;//是否自动显示滚动条
            listView_vector.MultiSelect = false;//是否可以选择多行

            listView_raster.GridLines = true;
            listView_raster.FullRowSelect = true;
            listView_raster.View = View.Details;
            listView_raster.Scrollable = true;
            listView_raster.MultiSelect = false;


            //添加表头(列)
            listView_vector.Columns.Add("要素名称" , 150 , HorizontalAlignment.Center);
            listView_vector.Columns.Add("要素类型" , 100 , HorizontalAlignment.Center);
            listView_raster.Columns.Add("数据名称" , 150 , HorizontalAlignment.Center);
            listView_raster.Columns.Add("数据类型" , 100 , HorizontalAlignment.Center);

          
            try
            {
                IEnumDataset enumDataset = sdeWorkSpace.get_Datasets(esriDatasetType.esriDTAny);
                IDataset dataset = null;
                while ((dataset = enumDataset.Next()) != null)
                {
                    if (dataset.Type == esriDatasetType.esriDTFeatureClass)
                    {
                        ListViewItem item = new ListViewItem();
                        item.SubItems.Clear();
                        item.SubItems[0].Text = dataset.Name;
                        string strFeatureType = GetFeatureType(dataset.Name);
                        item.SubItems.Add(strFeatureType);
                        listView_vector.Items.Add(item);
                    }
                    else if (dataset.Type == esriDatasetType.esriDTRasterDataset)
                    {
                        ListViewItem item = new ListViewItem();
                        item.SubItems.Clear();
                        item.SubItems[0].Text = dataset.Name;
                        item.SubItems.Add("栅格数据集");
                        listView_raster.Items.Add(item);

                    }
                    
                }

            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //获取要素类型
        private string GetFeatureType(string pDataSetName)
        {
            string featureType = "";
            IFeatureWorkspace pFeatureWS = sdeWorkSpace as IFeatureWorkspace;
            IFeatureClass featureClass = pFeatureWS.OpenFeatureClass(pDataSetName);

            switch (featureClass.ShapeType)
            {

                case esriGeometryType.esriGeometryPoint:
                    featureType = "点要素";
                    break;
                case esriGeometryType.esriGeometryPolyline:
                    featureType = "线要素";
                    break;
                case esriGeometryType.esriGeometryPolygon:
                    featureType = "面要素";
                    break;
                default:
                    break;
            }
            // System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureWS);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(featureClass);
            return featureType;
        }

        #endregion

        #region 添加数据
      
        //添加矢量
        private void listView_vector_MouseDoubleClick(object sender , MouseEventArgs e)
        {
            
            IFeatureClass featureClass = (sdeWorkSpace as IFeatureWorkspace).OpenFeatureClass(selectedVectorName);
            IFeatureLayer featureLayer = new FeatureLayerClass()
            {
                FeatureClass = featureClass ,
                Name = featureClass.AliasName
            };
            VectorHelper_FeatureOpt VectorAdderHelper = new VectorHelper_FeatureOpt(globecontrol , featureLayer);
            VectorAdderHelper.ShowDialog();
            this.Close();

            //System.Runtime.InteropServices.Marshal.ReleaseComObject(featureClass);
            //System.Runtime.InteropServices.Marshal.ReleaseComObject(featureLayer);
            
        }

        //添加栅格
        private void listView_raster_MouseDoubleClick(object sender , MouseEventArgs e)
        {

            IRasterWorkspaceEx rasterWSEx = sdeWorkSpace as IRasterWorkspaceEx;
            IRasterDataset rasterDataset = rasterWSEx.OpenRasterDataset(selectedRasterName);
            IRasterLayer rasterLayer = new RasterLayerClass();
            rasterLayer.CreateFromDataset(rasterDataset);

            RasterHelper_LayerType rasterAdderHelper = new RasterHelper_LayerType(globecontrol , rasterLayer);
            rasterAdderHelper.ShowDialog();
            this.Close();



            //System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterLayer);
           
        }

        //obtain selected vector
        private void listView_vector_SelectedIndexChanged(object sender , EventArgs e)
        {
            ListViewItem item = new ListViewItem();
            item = listView_vector.SelectedItems[0];
            string featureClassName_temp = item.SubItems[0].ToString();
            int lastIndex_left = featureClassName_temp.LastIndexOf("{");
            int lastIndex_right = featureClassName_temp.LastIndexOf("}");
            selectedVectorName = featureClassName_temp.Substring(lastIndex_left + 1 , lastIndex_right - lastIndex_left - 1);

        }
        //obtain selected raster
        private void listView_raster_SelectedIndexChanged(object sender , EventArgs e)
        {
            ListViewItem item = new ListViewItem();
            item = listView_raster.SelectedItems[0];
            string rasterName_temp = item.SubItems[0].ToString();
            int lastIndex_left = rasterName_temp.LastIndexOf("{");
            int lastIndex_right = rasterName_temp.LastIndexOf("}");
            selectedRasterName = rasterName_temp.Substring(lastIndex_left + 1 , lastIndex_right - lastIndex_left - 1);

        }
        #endregion

    }
欢迎留言交流。