SDE连接,创建数据集,数据导入以及数据导出

1.界面


2.数据库的连接

        IWorkspace workspace;
        IFeatureWorkspace featureWorkspace;
        IRasterWorkspaceEx rasterWorkspaceEx;
        IFeatureDataset featureDataset;
        IRasterDataset rasterDataset;
        IPropertySet propertySet;
        private void btnConnectDB_Click(object sender, EventArgs e)
        {
            propertySet = new PropertySetClass();
            propertySet.SetProperty("server", "Toby-PC");
            propertySet.SetProperty("instance", "5151/tcp");
            propertySet.SetProperty("database", "sde");
            propertySet.SetProperty("user", "sde");
            propertySet.SetProperty("password", "Toby521904");
            propertySet.SetProperty("version", "SDE.DEFAULT");
            IWorkspaceFactory workspaceFactory =new SdeWorkspaceFactory();
            workspace = workspaceFactory.Open(propertySet, 0);
            MessageBox.Show("连接成功");
          
        }

3.创建数据集

    private void btnCreateDataSet_Click(object sender, EventArgs e)
        {
            if (this.txtRasterDS.Text != "" || this.txtFeatureDS.Text != "")
            {
                featureWorkspace = workspace as IFeatureWorkspace;
                rasterWorkspaceEx = workspace as IRasterWorkspaceEx;
                IEnumDatasetName enumDatasetName;
                bool isExit = false;
                IDatasetName datasetName;
                string dsName = "";
                if (this.txtFeatureDS.Text != "")
                {
                    //定义空间参考
                    ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
                    ISpatialReference spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
                    spatialReference.SetDomain(-1000, -1000, 1000, 1000);
                    enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
                    datasetName = enumDatasetName.Next();
                    isExit = false;
                    dsName = "sde.SDE." + this.txtFeatureDS.Text;
                    while (datasetName != null)
                    {
                        if (datasetName.Name == dsName)
                        {
                            isExit = true;
                            MessageBox.Show("矢量数据集已经存在!");
                            this.txtFeatureDS.Focus();
                            return;
                        }
                        datasetName = enumDatasetName.Next();
                    }
                    if (isExit == false)
                    {
                        featureDataset = featureWorkspace.CreateFeatureDataset(this.txtFeatureDS.Text, spatialReference);
                    }
                    MessageBox.Show("矢量数据集创建成功");
                }
                if (this.txtRasterDS.Text != "")
                {
                    //创建影像数据集;
                    isExit = false;
                    enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset);
                    datasetName = enumDatasetName.Next();
                    dsName = "SDE." + this.txtRasterDS.Text;
                    while (datasetName != null)
                    {
                        if (datasetName.Name == dsName)
                        {
                            isExit = true;
                            MessageBox.Show("矢量数据集已经存在!");
                            break;
                        }
                        datasetName = enumDatasetName.Next();
                    }
                    if (isExit == false)
                    {
                        IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
                        rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionUncompressed;
                        rasterStorageDef.PyramidLevel = 1;
                        rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
                        rasterStorageDef.TileHeight = 128;
                        rasterStorageDef.TileWidth = 128;
                        IRasterDef rasterDef = new RasterDefClass();
                        ISpatialReference rasterDSpatialReference = new UnknownCoordinateSystemClass();
                        rasterDef.SpatialReference = rasterDSpatialReference;
                        IGeometryDef geometryDef = new GeometryDefClass();
                        IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                        geometryDefEdit.AvgNumPoints_2 = 5;
                        geometryDefEdit.GridCount_2 = 1;
                        geometryDefEdit.set_GridSize(0, 1000);
                        geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
                        ISpatialReference spatialReference2 = new UnknownCoordinateSystemClass();
                        geometryDefEdit.SpatialReference_2 = spatialReference2;
                        rasterDataset = rasterWorkspaceEx.CreateRasterDataset(this.txtRasterDS.Text, 1, rstPixelType.PT_LONG, rasterStorageDef, "DEFAULTS", rasterDef, geometryDef);
                        MessageBox.Show("栅格数据集创建成功");
                    }
                }
            }
        }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

4.矢量数据直接导入sde

    private void importFToSDE_Click(object sender, EventArgs e)
        {
            try
            {
                IDataset pDataSet = workspace as IDataset;
                this.openFileDialog1.Filter = "shp file(*.shp)|*.shp";
                this.openFileDialog1.Title = "打开矢量数据";
                this.openFileDialog1.Multiselect = false;
                string fileName = "";
                if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    fileName = this.openFileDialog1.FileName;
                    FileInfo fileInfo = new FileInfo(fileName);
                    string filePath = fileInfo.DirectoryName;
                    string file = fileInfo.Name;
                    FeatureClassToFeatureClass(pDataSet, filePath, file, "dddd", true);
                }
                MessageBox.Show("导入成功");
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString());
            } 
        }

     
        public void FeatureClassToFeatureClass(IDataset pDataSet, string strFeatFileDir, string strFeatFileName, string strOutName, bool isWorkspace)
        {
            try
            {
                IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
                IFeatureWorkspace pFeatureWK = (IFeatureWorkspace)pWSF.OpenFromFile(strFeatFileDir, 0);
                IFeatureClass pInFeatureClass = pFeatureWK.OpenFeatureClass(strFeatFileName);
                if (pInFeatureClass == null || pDataSet == null)
                {
                    MessageBox.Show("创建失败");
                    return;
                }
                IFeatureClassName pInFeatureclassName;
                IDataset pIndataset = (IDataset)pInFeatureClass;
                pInFeatureclassName = (IFeatureClassName)pIndataset.FullName;
                //如果名称已存在
                IWorkspace2 pWS2 = null;
                if (isWorkspace)
                    pWS2 = pDataSet as IWorkspace2;
                else
                    pWS2 = pDataSet.Workspace as IWorkspace2;
                if (pWS2.get_NameExists(esriDatasetType.esriDTFeatureClass, strOutName))
                {
                    DialogResult result;
                    result = System.Windows.Forms.MessageBox.Show(null, "矢量文件名  " + strOutName + "  在数据库中已存在!" + "/r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    //覆盖原矢量要素
                    if (result == DialogResult.Yes)
                    {
                        IFeatureWorkspace pFWS = (IFeatureWorkspace)pWS2;
                        IDataset pDataset = pFWS.OpenFeatureClass(strOutName) as IDataset;
                        pDataset.Delete();
                        pDataset = null;
                    }
                }
                IFields pInFields, pOutFields;
                IFieldChecker pFieldChecker = new FieldCheckerClass();
                IEnumFieldError pError;
                pInFields = pInFeatureClass.Fields;
                pFieldChecker.Validate(pInFields, out pError, out pOutFields);
                IField geoField = null;
                for (int i = 0; i < pOutFields.FieldCount; i++)
                {
                    IField pField = pOutFields.get_Field(i);
                    if (pField.Type == esriFieldType.esriFieldTypeOID)
                    {
                        IFieldEdit pFieldEdit = (IFieldEdit)pField;
                        pFieldEdit.Name_2 = pField.AliasName;
                    }
                    if (pField.Type == esriFieldType.esriFieldTypeGeometry)
                    {
                        geoField = pField;
                        break;
                    }
                }
                IGeometryDef geometryDef = geoField.GeometryDef;
                IFeatureDataConverter one2another = new FeatureDataConverterClass();
                IFeatureClassName pOutFeatureClassName = new FeatureClassNameClass();
                IDatasetName pOutDatasetName = (IDatasetName)pOutFeatureClassName;
                if (isWorkspace)
                    pOutDatasetName.WorkspaceName = (IWorkspaceName)pDataSet.FullName;
                else
                    pOutDatasetName.WorkspaceName = (IWorkspaceName)((IDataset)pDataSet.Workspace).FullName;
                pOutDatasetName.Name = strOutName;
                if (isWorkspace)
                {
                    one2another.ConvertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0);
                }
                else
                {
                    IFeatureDataset pFeatDS = (IFeatureDataset)pDataSet;
                    IFeatureDatasetName pOutFeatDSName = pFeatDS.FullName as IFeatureDatasetName;
                    one2another.ConvertFeatureClass(pInFeatureclassName, null, pOutFeatDSName, pOutFeatureClassName, geometryDef, pOutFields, "", 1000, 0);
                    pOutFeatDSName = null;
                    pFeatDS = null;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }

5.矢量数据导入sde数据集

       
    private void importF_Click(object sender, EventArgs e)
        {
            featureWorkspace = workspace as IFeatureWorkspace;
            this.openFileDialog1.Filter = "shp file(*.shp)|*.shp";
            this.openFileDialog1.Title = "打开矢量数据";
            this.openFileDialog1.Multiselect = false;
            string fileName = "";
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                fileName = this.openFileDialog1.FileName;
                FileInfo fileInfo = new FileInfo(fileName);
                string filePath = fileInfo.DirectoryName;
                string file = fileInfo.Name;
                IWorkspaceFactory shpwpf = new ShapefileWorkspaceFactory();
                IWorkspace shpwp = shpwpf.OpenFromFile(filePath, 0);
                IFeatureWorkspace shpfwp = shpwp as IFeatureWorkspace;
                IFeatureClass shpfc = shpfwp.OpenFeatureClass(file);
                //导入SDE数据库
                IFeatureClass sdeFeatureClass = null;
                IFeatureClassDescription featureClassDescription = new FeatureClassDescriptionClass();
                IObjectClassDescription objectClassDescription = featureClassDescription as IObjectClassDescription;
                IFields fields = shpfc.Fields;
                IFieldChecker fieldChecker = new FieldCheckerClass();
                IEnumFieldError enumFieldError = null;
                IFields vFields = null;
                fieldChecker.ValidateWorkspace = featureWorkspace as IWorkspace;
                fieldChecker.Validate(fields,out enumFieldError,out vFields);
                featureDataset = featureWorkspace.OpenFeatureDataset(this.txtFeatureDS.Text);
                try
                {
                    sdeFeatureClass = featureWorkspace.OpenFeatureClass(shpfc.AliasName);
                }
                catch
                {
                   
                }
                if (sdeFeatureClass == null)
                {
                    sdeFeatureClass = featureDataset.CreateFeatureClass(shpfc.AliasName, vFields,
                        objectClassDescription.InstanceCLSID, objectClassDescription.ClassExtensionCLSID,
                        shpfc.FeatureType, shpfc.ShapeFieldName, "");
                    IFeatureCursor featureCursor = shpfc.Search(null, true);
                    IFeature feature = featureCursor.NextFeature();
                    IFeatureCursor sdeFeatureCursor = sdeFeatureClass.Insert(true);
                    IFeatureBuffer sdeFeatureBuffer;
                    while (feature != null)
                    {
                        sdeFeatureBuffer = sdeFeatureClass.CreateFeatureBuffer();
                        IField shpField = new FieldClass();
                        IFields shpFields = feature.Fields;
                        for (int i = 0; i < shpFields.FieldCount; i++)
                        {
                            shpField = shpFields.get_Field(i);
                            int index = sdeFeatureBuffer.Fields.FindField(shpField.Name);
                            if (index != -1)
                            {
                                sdeFeatureBuffer.set_Value(index, feature.get_Value(i));
                            }
                        }
                        sdeFeatureCursor.InsertFeature(sdeFeatureBuffer);
                        sdeFeatureCursor.Flush();
                        feature = featureCursor.NextFeature();
                    }
                }
            }
            MessageBox.Show("导入成功");
        }

6.导入栅格数据

 
    private void importR_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.Filter = "Imag file (*.img)|*.img";
            this.openFileDialog1.Title = "打开影像数据";
            this.openFileDialog1.Multiselect = false;
            string fileName = "";
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                fileName = this.openFileDialog1.FileName;
                string filepath;
                string file;
                string file1;
                int lastIndex;
                lastIndex = fileName.LastIndexOf(@"");
                filepath = fileName.Substring(0, lastIndex);
                file = fileName.Substring(lastIndex + 1);
                //导入SDE数据库
                rasterWorkspaceEx = workspace as IRasterWorkspaceEx;
                IWorkspaceFactory tifwpf = new RasterWorkspaceFactoryClass();
                IWorkspace tifwp = tifwpf.OpenFromFile(filepath, 0);
                IRasterWorkspace tifrwp = tifwp as IRasterWorkspace;
                IRasterDataset rasterDataset = tifrwp.OpenRasterDataset(file);
                lastIndex = file.LastIndexOf(@".");
                file1 = file.Substring(0, lastIndex);
                imortRasterData(filepath, file, file1);
                MessageBox.Show("导入成功");
            }
        }


    private void imortRasterData(string strRasterFileDir, string strRasterFileName, string strOutName)
        {
            try
            {
                //判断是否有重名现象
                IWorkspace2 pWS2 = workspace as IWorkspace2;
                //如果名称已存在
                if (pWS2.get_NameExists(esriDatasetType.esriDTRasterDataset, strOutName))
                {
                    DialogResult result;
                    result = MessageBox.Show(this, "栅格文件名  " + strOutName + "  在数据库中已存在!" + "\r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    //覆盖原矢量要素
                    if (result == DialogResult.Yes)
                    {
                        IRasterWorkspaceEx pRWs = workspace as IRasterWorkspaceEx;
                        IDataset pDataset = pRWs.OpenRasterDataset(strOutName) as IDataset;
                        pDataset.Delete();
                        pDataset = null;
                    }
                    else if (result == DialogResult.No)
                    {
                        return;
                    }
                }
                IWorkspaceFactory pRasterWsFac = new RasterWorkspaceFactoryClass();
                IWorkspace pWs = pRasterWsFac.OpenFromFile(strRasterFileDir, 0);
                IRasterDataset pRasterDs = null;
                IRasterWorkspace pRasterWs;
                if (!(pWs is IRasterWorkspace))
                {
                    return;
                }
                pRasterWs = pWs as IRasterWorkspace;
                pRasterDs = pRasterWs.OpenRasterDataset(strRasterFileName);
                ISaveAs2 saveAs2 = (ISaveAs2)pRasterDs;
                IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
                IRasterStorageDef2 rasterStorageDef2 = (IRasterStorageDef2)rasterStorageDef;
                rasterStorageDef2.CompressionType =esriRasterCompressionType.esriRasterCompressionUncompressed;
                rasterStorageDef2.CompressionQuality = 100;
                rasterStorageDef2.Tiled = true;
                rasterStorageDef2.TileHeight = 128;
                rasterStorageDef2.TileWidth = 128;
                saveAs2.SaveAsRasterDataset(strOutName, workspace, "gdb", rasterStorageDef2);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
        }
 

7.从SDE中读取数据

    private void ReadFromSDE_Click(object sender, EventArgs e)
        {
            this.cbbDataSet.Items.Clear();
            this.FeatureLayer.Items.Clear();
            this.RasterLayer.Items.Clear();
            IEnumDatasetName enumDatasetName;
            IDatasetName datasetName;
            //获取矢量数据集
            enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
            datasetName = enumDatasetName.Next();
            while (datasetName != null)
            {
                this.cbbDataSet.Items.Add(datasetName.Name);
                datasetName = enumDatasetName.Next();
            }
            //获取图层名
            enumDatasetName=workspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass);
            datasetName = enumDatasetName.Next();
            while (datasetName != null)
            {
                this.FeatureLayer.Items.Add(datasetName.Name);
                datasetName = enumDatasetName.Next();
            }
            //获取栅格图层名
            enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset);
            datasetName = enumDatasetName.Next();
            while (datasetName != null)
            {
                this.RasterLayer.Items.Add(datasetName.Name);
                datasetName = enumDatasetName.Next();
            }
            MessageBox.Show("读取成功");
        }

8.遍历数据集中的文件

    private void cbbDataSet_TextChanged(object sender, EventArgs e)
        {
            this.FeatureLayer.Items.Clear();
            IDataset dataset;
            IEnumDataset enumDataset;
            enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
            dataset = enumDataset.Next();
            IDataset pDataset = null;
            while (dataset != null)
            {
                if (dataset.Name == this.cbbDataSet.Text)
                {
                    pDataset = dataset as IDataset;
                    break;
                }
                dataset = enumDataset.Next();
            }
            IFeatureDataset featDs = pDataset as IFeatureDataset;
            IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
            for (int i = 0; i < fcContainer.ClassCount; i++)
            {
                this.FeatureLayer.Items.Add(fcContainer.get_Class(i).AliasName);
            }
        }

9.数据的加载

    private void btnOk_Click(object sender, EventArgs e)
        {
            //直接从sde中读取数据.
            if (this.FeatureLayer.Text != "" && this.cbbDataSet.Text == "")
            {
                IEnumDataset enumDataset;
                IDataset dataset;
                IFeatureLayer pFeatureLayer=new FeatureLayerClass();
                //获取图层名
                enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass);
                dataset = enumDataset.Next();
                while (dataset != null)
                {
                    if (dataset.Name.ToLower() == this.FeatureLayer.Text.ToLower())
                    {
                        pFeatureLayer.FeatureClass = dataset as IFeatureClass;
                        break;
                    }
                    dataset = enumDataset.Next();
                }
                this.axMapControl1.AddLayer(pFeatureLayer as ILayer);
                this.axMapControl1.Extent = this.axMapControl1.FullExtent;
            }
            // 从sde数据集中读取数据
            if (this.FeatureLayer.Text != "" && this.cbbDataSet.Text != "")
            {
                IDataset dataset;
                IEnumDataset enumDataset;
                enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
                dataset = enumDataset.Next();
                IDataset pDataset = null;
                while (dataset != null)
                {
                    if (dataset.Name == this.cbbDataSet.Text)
                    {
                        pDataset = dataset as IDataset;
                        break;
                    }
                    dataset = enumDataset.Next();
                }
                IFeatureDataset featDs = pDataset as IFeatureDataset;
                IFeatureLayer pFeatureLayer = new FeatureLayerClass();
                IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
                for (int i = 0; i < fcContainer.ClassCount; i++)
                {
                    if (fcContainer.get_Class(i).AliasName.ToLower() == this.FeatureLayer.Text.ToLower())
                    {
                        pFeatureLayer.FeatureClass = fcContainer.get_Class(i) as IFeatureClass;
                        break;
                    }
                    //this.FeatureLayer.Items.Add(fcContainer.get_Class(i).AliasName);
                }
                this.axMapControl1.AddLayer(pFeatureLayer as ILayer);
                this.axMapControl1.Extent = this.axMapControl1.FullExtent;
            }
            //加载栅格数据
            if (this.RasterLayer.Text != "")
            {
                IDataset dataset;
                IEnumDataset enumDataset;
                enumDataset = workspace.get_Datasets(esriDatasetType.esriDTRasterDataset);
                dataset = enumDataset.Next();
                IDataset pDataset = null;
                while (dataset != null)
                {
                    if (dataset.Name.ToLower() == this.RasterLayer.Text.ToLower())
                    {
                        pDataset = dataset as IDataset;
                        break;
                    }
                    dataset = enumDataset.Next();
                }
                IRasterDataset pRasterDataset = dataset as IRasterDataset;
                IRasterLayer pRasLyr=new RasterLayerClass();
                pRasLyr.CreateFromDataset(pRasterDataset);
                this.axMapControl1.AddLayer(pRasLyr as ILayer);
                this.axMapControl1.Extent = this.axMapControl1.FullExtent;
            }
            MessageBox.Show("加载成功");
        }


  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值