深入理解数据集(转自 http://www.gisall.com/html/63/151663-4895.html)

Geodatabase中,要素类可以直接存储在数据库中,也可以存储在数据集中。数据集(Dataset)是一个代表了Workspace中所谓数据集合的抽象类,它是一个集合,但是在理解数据集对象的时候,要用广义的概念来看待,不要从我们在数据库里存储的那个物理结构去理解,否则会走入误区,因为在设计数据库的时候,我们可以在数据集里面存储相关的要素类。那么我们在编程的时候就可以这么想,要获取数据库中的某一个要素类,要先获取数据集,然后获取要素类,其实通过工作空间IFeatureWorkspace.OpenFeatureClass就可以,可以把数据库比作文件夹,数据集比作子文件夹,但是在数据库中的表,要素类,是没有重复的,不像Windows上的文件夹,子文件夹里面可以有名称重复的文件,刚才说到用广义的意义,应该知道所有放在工作空间的对象都是一种数据集对象,也就是说Table,FeatureClass等都是数据集,也就是说数据集中的数据可以是一个字段,一行记录,一张表等。Workspace其实也是一种数据集,它也继承了IDataset这个接口。在数据库中一切对象都可以看做是数据集,不管是要素类,还是表,或者栅格数据,那么怎么区分我们得到的到底是表,还是要素类?IDataset有一个很重要的属性IDataset.Type,通过这个属性我们就可以判断,IDataset.Type的这个属性是一个枚举类型的常量,如下图

 

获取数据库中的要素类

AE中,要得到某一个类,首要要获取工作空间,然后进入工作空间再得到相应的东西,我们定义一个函数用来获取个人数据库的路径

public  string  WsPath()

{

            string WsFileName="";

            OpenFileDialog penFile = new OpenFileDialog();

            OpenFile.Filter = "个人数据库(MDB)|*.mdb";

            DialogResult DialogR = OpenFile.ShowDialog();

            if (DialogR == DialogResult.Cancel)

            {            

            }

            else

            {

                WsFileName = OpenFile.FileName;

            }

            return WsFileName;         

        }

要获取要素类,首先要进入

private void button2_Click(object sender, EventArgs e)

        {

                 string WsName = WsPath();

 

            if (WsName != "")

            {

 

                IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass();

 

                IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0);

 

                IEnumDataset pEDataset = pWs.get_Datasets(esriDatasetType.esriDTAny);

 

                IDataset pDataset = pEDataset.Next();

 

                while (pDataset != null)

                {

                    if (pDataset.Type ==esriDatasetType.esriDTFeatureClass)

                    {

                        FeatureClassBox.Items.Add(pDataset.Name);

                    }

                       //如果是数据集

                    else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)

                    {

                        IEnumDataset pESubDataset = pDataset.Subsets;

 

                        IDataset pSubDataset = pESubDataset.Next();

 

                        while (pSubDataset != null)

                        {

                            FeatureClassBox.Items.Add(pSubDataset.Name);

 

                            pSubDataset = pESubDataset.Next();

                        }

                    }

                  

 

                    pDataset = pEDataset.Next();

               }

 

            }

 

            FeatureClassBox.Text = FeatureClassBox.Items[0].ToString();

}

 

 

posted @ 2012-07-27 16:32  lockener  阅读(845)  评论(0编辑  收藏  举报