《ArcGIS Engine 地理信息系统开发从入门到精通(第二版)》——6.6 Geodatabase的使用与开发...

    xiaoxiao2023-08-30  151

    本节书摘来自异步社区《ArcGIS Engine 地理信息系统开发从入门到精通(第二版)》一书中的第6章,第6.6节,作者: 邱洪钢 , 张青莲 , 熊友谊 更多章节内容可以访问云栖社区“异步社区”公众号查看。

    6.6 Geodatabase的使用与开发

    ArcGIS Engine 地理信息系统开发从入门到精通(第二版)6.6.1 空间数据库连接空间数据库企业级Geodatabase的连接主要是使用IworkspaceFactory、Iworkspace和IpropertySet等3个接口,通过IPropertySet 设置数据库的连接属性,由IworkspaceFactory创建一个IWorkspace的接口指针并返回该指针。6.6.3小节的代码演示了如何进行空间数据库的连接。

    6.6.2 创建新的数据集数据集是由一组具有相同空间参考的要素类组成,用于存放数据。创建新的数据集主要使用IWorkspace、IFeatureWorkspace、IfeatureDataset和IspatialReference等4个接口,其中,IWorkspace用于生成IFeatureWorkspace,ISpatialReference用于设置要素数据集的空间参考属性(该属性为可选属性),整个过程返回IFeatureDataset接口指针,即新生成的要素数据集。

    6.6.3 空间数据的入库下面代码使用SDE空间数据库,因此ArcEngine的Lisence应使用企业数据库类型,在Form1_Load事件中初始化lisence,不能使用lisence控件设置,否则提示没有许可lisence。

    private void Form1_Load(object sender, EventArgs e)     {       IAoInitialize pao = new AoInitializeClass();       pao.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);         }     // 工作空间     IWorkspace workspace;     //矢量数据工作空间     IFeatureWorkspace featureWorkspace;     //影像数据工作空间     IRasterWorkspaceEx rasterWorkspace;     //矢量数据集     IFeatureDataset featureDataset;     //影像数据集     IRasterDataset rasterDataset;     private void button1_Click(object sender, EventArgs e)     {       // SDE空间连接属性       IPropertySet propertySet = new PropertySetClass();       propertySet.SetProperty("server", this.textBox1.Text );       propertySet.SetProperty("instance",this.textBox2.Text );       propertySet.SetProperty ("database",this.textBox3.Text );       propertySet.SetProperty("user", this.textBox4.Text );       propertySet.SetProperty ("password",this.textBox5.Text );       propertySet.SetProperty("version", "SDE.DEFAULT");       IWorkspaceFactory workspaceFactory = new SdeWorkspaceFactory();       //打开SDE工作空间       workspace = workspaceFactory.Open(propertySet, 0);       MessageBox.Show("连接SDE空间数据库成功");     }     //创建数据集(矢量数据集和影像数据集)     private void button2_Click(object sender, EventArgs e)     {       featureWorkspace =workspace as IFeatureWorkspace ;       rasterWorkspace = workspace as IRasterWorkspaceEx;       //定义空间参考       ISpatialReferenceFactory spatialReferenceFactory = new SpatialReference       EnvironmentClass();       ISpatialReference spatialReference = spatialReferenceFactory.       CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);       spatialReference.SetDomain(-1000, -1000, 1000, 1000);       IEnumDatasetName enumDatasetName;       IDatasetName  datasetName;       string dsName = "";       enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeature       Dataset);       datasetName = enumDatasetName.Next();       bool isExist = false;       //创建矢量数据集       dsName = "SDE."+this.textBox6.Text;       while (datasetName != null)       {         if (datasetName.Name == dsName)         {           isExist = true;         }         datasetName = enumDatasetName.Next();       }       if (isExist ==false )       {         featureDataset = featureWorkspace.CreateFeatureDataset(this. textBox6.Text,         spatialReference);       }       //创建影像数据集       isExist = false;       enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRaster       Dataset );       datasetName = enumDatasetName.Next();       dsName = "SDE." + this.textBox6.Text;       while (datasetName != null)       {         if (datasetName.Name == dsName)         {           isExist = true;         }         datasetName = enumDatasetName.Next();       }       if (isExist == 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 rasterDpatialRefrence = new UnknownCoordinateSystem Class();         rasterDef.SpatialReference = rasterDpatialRefrence;         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.esriGeometry Polygon;         ISpatialReference spatialReference2 = new UnknownCoordinateSystem Class();         geometryDefedit.SpatialReference_2 = spatialReference2;         rasterDataset = rasterWorkspace.CreateRasterDataset(this.textBox7. Text, 1,         rstPixelType.PT_LONG, rasterStorageDef, "DEFAULTS", rasterDef, geometry Def);       }     }     //加载矢量数据到SDE数据库     private void button3_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;         string filepath;         string file;         int lastIndex;         lastIndex = fileName.LastIndexOf(@"\");         filepath = fileName.Substring(0, lastIndex );         file = fileName.Substring(lastIndex+1);         //读取SHP数据         IWorkspaceFactory shpwpf = new ShapefileWorkspaceFactoryClass();         IWorkspace shpwp = shpwpf.OpenFromFile(filepath, 0);         IFeatureWorkspace shpfwp = shpwp as IFeatureWorkspace;         IFeatureClass shpfc = shpfwp.OpenFeatureClass(file);         //导入SDE数据库         IFeatureClass sdeFeatureClass=null;         IFeatureClassDescription featureClassDescription = new FeatureClass         DescriptionClass();         IObjectClassDescription objectClassDescription = featureClassDescription         as IObjectClassDescription;         IFields fields = shpfc.Fields;         IFieldChecker fieldChecker = new FieldCheckerClass();         IEnumFieldError enumFieldError = null;         IFields validateFields = null;         fieldChecker.ValidateWorkspace = featureWorkspace as IWorkspace;         fieldChecker.Validate(fields, out enumFieldError, out validateFields);         featureDataset = featureWorkspace.OpenFeatureDataset(this.textBox6.Text);         try         {           sdeFeatureClass = featureWorkspace.OpenFeatureClass(shpfc.Alias Name);         }         catch (Exception ex)         {         }         //在SDE数据库中创建矢量数据集         if (sdeFeatureClass == null)         {           sdeFeatureClass = featureDataset.CreateFeatureClass(shpfc. AliasName,           validateFields,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();         }         //加载数据到Mapcontrol         IFeatureLayer sdeFeatureLayer = new FeatureLayerClass();         sdeFeatureLayer.FeatureClass = sdeFeatureClass;         this.axMapControl1.Map.AddLayer(sdeFeatureLayer as ILayer);         this.axMapControl1.Extent = this.axMapControl1.FullExtent;         this.axMapControl1.Refresh();       }     }     //加载影像数据到SDE数据库     private void button4_Click(object sender, EventArgs e)     {            this.openFileDialog1.Filter = "TIFF file (*.tif)|*.tif";       this.openFileDialog1.Title = "打开影像数据";       this.openFileDialog1.Multiselect = false;       string fileName = "";       if (this.openFileDialog1.ShowDialog() == DialogResult.OK)       {         fileName = this.openFileDialog1.FileName;         string filepath;         string file;         int lastIndex;         lastIndex = fileName.LastIndexOf(@"\");         filepath = fileName.Substring(0, lastIndex);         file = fileName.Substring(lastIndex + 1);         //导入SDE数据库         rasterWorkspace = workspace as IRasterWorkspaceEx;         IWorkspaceFactory tifwpf = new RasterWorkspaceFactoryClass();         IWorkspace tifwp = tifwpf.OpenFromFile(filepath, 0);         IRasterWorkspace tifrwp = tifwp as IRasterWorkspace;         IRasterDataset rasterDataset = tifrwp.OpenRasterDataset(file);            IRasterDataset sdeRasterDataset = null;                lastIndex = file.LastIndexOf(@".");         file = file.Substring(0, lastIndex);         try         {           sdeRasterDataset = rasterWorkspace.OpenRasterDataset(file);         }         catch (Exception Ex)         {         }         if (sdeRasterDataset == null)         {           IGeoDataset geoDataset =rasterDataset as IGeoDataset ;           IRasterSdeServerOperation rasterSdeServeroperation ;           IBasicRasterSdeConnection sdeCon = new BasicRasterSdeLoader();           IPropertySet propertySet = new PropertySetClass();           propertySet = workspace.ConnectionProperties;           //建立与SDE数据库的连接           sdeCon.ServerName = propertySet.GetProperty("server").ToString();           sdeCon.Instance = propertySet.GetProperty("instance").ToString();           sdeCon.UserName = propertySet.GetProperty("user").ToString();           sdeCon.Password = "sde";           sdeCon.Database = propertySet.GetProperty("database").ToString();           sdeCon.SdeRasterName = file;           sdeCon.InputRasterName = fileName;           rasterSdeServeroperation = sdeCon as IRasterSdeServerOperation;           //保存影像数据到SDE数据库中           rasterSdeServeroperation.Create ();           rasterSdeServeroperation.Update ();           rasterSdeServeroperation.ComputeStatistics ();           IRasterLayer rasterLayer=new RasterLayerClass ();           sdeRasterDataset = rasterWorkspace.OpenRasterDataset(file);           rasterLayer.CreateFromDataset(sdeRasterDataset);           this.axMapControl1.Map.AddLayer(rasterLayer as ILayer);           this.axMapControl1.Extent = this.axMapControl1.FullExtent;           this.axMapControl1.Refresh();         }       }     }   } } 相关资源:ArcGIS Engine地理信息系统开发从入门到精通(第2版) 书 源码
    最新回复(0)