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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

异步社区 2017-05-02 17:25:00 浏览1423
展开阅读全文

本节书摘来自异步社区《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();
        }
      }
    }
  }
}

网友评论

登录后评论
0/500
评论
异步社区
+ 关注