使用C#配合ArcGIS Engine进行地理信息系统开发

2019-12-26 18:06:18王冬梅

在Form2中,我们先将可能获得的属性表数据类型进行预定义:


public static string ParseFieldType(esriFieldType fieldType)//将EsriType 转换为String 
   { 
     switch (fieldType) 
     { 
       case esriFieldType.esriFieldTypeBlob: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeDate: 
         return "System.DateTime"; 
       case esriFieldType.esriFieldTypeDouble: 
         return "System.Double"; 
       case esriFieldType.esriFieldTypeGeometry: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeGlobalID: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeGUID: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeInteger: 
         return "System.Int32"; 
       case esriFieldType.esriFieldTypeOID: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeRaster: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeSingle: 
         return "System.Single"; 
       case esriFieldType.esriFieldTypeSmallInteger: 
         return "System.Int32"; 
       case esriFieldType.esriFieldTypeString: 
         return "System.String"; 
       default: 
         return "System.String"; 
     } 
   } 

然后就是获取shpaefile的属性表了,这里我们主要使用 IField、IFeatureCursor、IFeature 这三个接口来达成目标:
接口说明如下:

  • IField 接口:用于获取要素表。
  • IFeature 接口:用来接收查询出来的要素。
  • IFeatureCursor 接口:通过Search进行查询,可以将结果保存在这里,从而利用NextFeature方法,遍历所有要素。

    代码如下:

    
    public void Opentable() 
        { 
          IFields pFields; 
          pFields = pFeaturelayer.FeatureClass.Fields; 
          dataGridView1.ColumnCount = pFields.FieldCount; 
          for (int i = 0; i < pFields.FieldCount; i++) 
          { 
            string fldName = pFields.get_Field(i).Name; 
            dataGridView1.Columns[i].Name = fldName; 
            dataGridView1.Columns[i].ValueType = System.Type.GetType(ParseFieldType(pFields.get_Field(i).Type)); 
          } 
          IFeatureCursor pFeatureCursor; 
          pFeatureCursor = pFeaturelayer.FeatureClass.Search(null, false); 
          IFeature pFeature; 
          pFeature = pFeatureCursor.NextFeature(); 
          while (pFeature != null) 
          { 
            string[] fldValue = new string[pFields.FieldCount]; 
            for (int i = 0; i < pFields.FieldCount; i++) 
            { 
              string fldName; 
              fldName = pFields.get_Field(i).Name; 
              if (fldName == pFeaturelayer.FeatureClass.ShapeFieldName) 
              { 
                fldValue[i] = Convert.ToString(pFeature.Shape.GeometryType); 
              } 
              else 
                fldValue[i] = Convert.ToString(pFeature.get_Value(i)); 
            } 
            dataGridView1.Rows.Add(fldValue); 
            pFeature = pFeatureCursor.NextFeature(); 
          } 
        }