天天看點

ArcGIS Engine開發(1)

ArcGIS Engine開發

    • 一、要素的類型 esriFeatureType
    • 二、esriFeatureType與esriGeometryType的差別與聯系
    • 三、Arcgis Engine 接口說明(轉)
    • 四、esriFieldType 要素字段類型
    • 五、讀取FeatureClass的字段
    • 六、擷取Feature的點集
    • 七、讀取FeatureClass的字段
    • 八、複制字段名稱

适合新入門小白檢視,花了1周時間了解ArcGIS Engine内部工作空間、要素工作空間、要素類、要素等關系,還有GDB、MDB、Shapefile的讀取與寫入。

一、要素的類型 esriFeatureType

//pFeatureClass為IFeatureClass對象,擷取要素類型
esriFeatureType type = pFeatureClass.FeatureType;
public enum esriFeatureType
    {
        esriFTSimple = 1,
        esriFTSimpleJunction = 7,
        esriFTSimpleEdge = 8,
        esriFTComplexJunction = 9,
        esriFTComplexEdge = 10,
        esriFTAnnotation = 11,
        esriFTCoverageAnnotation = 12,
        esriFTDimension = 13,
        esriFTRasterCatalogItem = 14
}
           
Constant Value Description
esriFTSimple 1 Simple Feature.簡單要素。
esriFTSimpleJunction 7 Simple Junction Feature.簡單的接線功能。
esriFTSimpleEdge 8 Simple Edge Feature.簡單的邊緣特征。
esriFTComplexJunction 9 Complex Junction Feature.複雜的接線功能。
esriFTComplexEdge 10 Complex Edge Feature.複雜的邊緣特征。
esriFTAnnotation 11 Annotation Feature.注釋功能。
esriFTCoverageAnnotation 12 Coverage Annotation Feature.覆寫注釋功能。
esriFTDimension 13 Dimension Feature.維特征。
esriFTRasterCatalogItem 14 Raster Catalog Item.栅格目錄項。

二、esriFeatureType與esriGeometryType的差別與聯系

  1. esriFeatureType通常用來表示資料的存儲結構,即實體層;
  2. esriGeometryType通常用來表示資料的幾何形狀,即表現層。構成了圖形的基本類型。

esriGeometryType枚舉類型詳解

Constant Value Description
esriGeometryNull 未知類型(Unknown)
esriGeometryPoint 1 點(Point)
esriGeometryMultipoint 2 多點(Multipoint)
esriGeometryLine 13 線段(Line)
esriGeometryCircularArc 14 圓弧(CircularArc)
esriGeometryEllipticArc 16 橢圓弧(EllipticArc)
esriGeometryBezier3Curve 15 貝茲曲線(BezierCurve)
esriGeometryPath 6 路徑(Path)
esriGeometryPolyline 3 多段線(Polyline)
esriGeometryRing 11 環(Ring)
esriGeometryPolygon 4 多邊形(Polygon)
esriGeometryEnvelope 5 外包(Envelope)
esriGeometryAny 7 任何類型(Any valid geometry)
esriGeometryBag 17 任意幾何類型的集合(GeometryBag)
esriGeometryMultiPatch 9 表面幾何(MultiPatch)
esriGeometryTriangleStrip 18 三角帶(TriangleStrip)
esriGeometryTriangleFan 19 三角扇形(TriangleFan)
esriGeometryRay 20 射線(Ray)
esriGeometrySphere 21 球體(Sphere)
esriGeometryTriangles 22 三角形(Triangles)

看圖:

ArcGIS Engine開發(1)

三、Arcgis Engine 接口說明(轉)

連結: 接口說明。

四、esriFieldType 要素字段類型

namespace ESRI.ArcGIS.Geodatabase
{
    [Guid("4CA2D959-5A38-11D2-AABD-00C04FA37585")]
    public enum esriFieldType
    {
        esriFieldTypeSmallInteger = 0,
        esriFieldTypeInteger = 1,
        esriFieldTypeSingle = 2,
        esriFieldTypeDouble = 3,
        esriFieldTypeString = 4,
        esriFieldTypeDate = 5,
        esriFieldTypeOID = 6,
        esriFieldTypeGeometry = 7,
        esriFieldTypeBlob = 8,
        esriFieldTypeRaster = 9,
        esriFieldTypeGUID = 10,
        esriFieldTypeGlobalID = 11,
        esriFieldTypeXML = 12
    }
}

           

五、讀取FeatureClass的字段

FeatureClass中存儲字段名稱,Feature中存儲字段值,字段值是每個Feature的屬性。

IFields fieldsSrc = pFeatureCls.Fields;
  string mf = "";
  string mf2 = "";
  for (int ii = 0; ii < fieldsSrc.FieldCount; ii++)
  {
      mf += fieldsSrc.Field[ii].Name + "\r\n";  //第幾個參數
      mf2 += fieldsSrc.Field[ii].AliasName + "\r\n";  //第幾個參數
  }

擷取要素字段值
int cnt = pFeature.Fields.FieldCount;
  for (int ii = 0; ii < fieldsSrc.FieldCount; ii++)
  {
      textboxLogShow(pFeature.get_Value(ii).ToString());
  }

           

六、擷取Feature的點集

  1. 擷取要素的圖形
IPoint ptSrc = pGeo as IPoint;
IPointCollection pc = pGeo as IPointCollection;
           
  • 線:
pointCollection = new PolylineClass();
IPolyline polyline = pGeo as IPolyline;
pointCollection = polyline as IPointCollection;
           
  • 面:

    Method 1:這種方法隻适用于隻有一個整面的面,即隻有1個面,面内沒有被挖去的部分,面外也沒有其他的填充面,也就是說隻有一個外部Ring。

IGeometry pGeo = pFeatureClass.ShapeCopy;
  pointCollection = pGeo as IPointCollection;
  //坐标轉換
  for (int j2 = 0; j2 < pointCollection.PointCount; j2++)
  {
      ptSrc = new PointClass();
      pointCollection.QueryPoint(j2, ptSrc);
      /*
      Work!
      */
      pointCollection.UpdatePoint(j2, ptCal);
  }
  pGeo = ClsArcGIS.GetPolygonGeometry(pointCollection);
  pFeature.Shape = pGeo;

           

Method 2:面對象是一個有序Ring對象的集合,面中外部Ring方向是順時針,内部Ring方向是逆時針,不存在面積為0的Ring.是以擷取面對象坐标,就要擷取面的内部和外部所有Ring對象即可。

//周遊找出面的内外部Ring:
  Dictionary<IRing, List<IRing>> dicRings = new Dictionary<IRing, List<IRing>>();
  IGeometry pShape = null;
  esriGeometryType pGeoType = pGeo.GeometryType;

  try
  {
      IPolygon4 polygon = pGeo as IPolygon4;
      //外環個數
      int exRingCount = polygon.ExteriorRingCount;
      IGeometryBag exteriorRings = polygon.ExteriorRingBag;

      //For each exterior rings find the interior rings associated with it 
      IEnumGeometry exteriorRingsEnum = exteriorRings as IEnumGeometry;
      exteriorRingsEnum.Reset();
      IRing currentExteriorRing = exteriorRingsEnum.Next() as IRing;
      
      while (currentExteriorRing != null)
      {
          if (!dicRings.ContainsKey(currentExteriorRing))
          {
    dicRings[currentExteriorRing] = new List<IRing>();
          }
          
          IGeometryBag interiorRings = polygon.get_InteriorRingBag(currentExteriorRing);
          IEnumGeometry interiorRingsEnum = interiorRings as IEnumGeometry;
          interiorRingsEnum.Reset();
          IRing currentInteriorRing = interiorRingsEnum.Next() as IRing;
          while (currentInteriorRing != null)
          {
    dicRings[currentExteriorRing].Add(currentInteriorRing);
    currentInteriorRing = interiorRingsEnum.Next() as IRing;
          }
          currentExteriorRing = exteriorRingsEnum.Next() as IRing;
      }

           

七、讀取FeatureClass的字段

FeatureClass中存儲字段名稱,Feature中存儲字段值,字段值是每個Feature的屬性。

IFields fieldsSrc = pFeatureCls.Fields;
  string mf = "";
  string mf2 = "";
  for (int ii = 0; ii < fieldsSrc.FieldCount; ii++)
  {
      mf += fieldsSrc.Field[ii].Name + "\r\n";  //第幾個參數
      mf2 += fieldsSrc.Field[ii].AliasName + "\r\n";  //第幾個參數
  }

//擷取要素字段值
int cnt = pFeature.Fields.FieldCount;
  for (int ii = 0; ii < fieldsSrc.FieldCount; ii++)
  {
      textboxLogShow(pFeature.get_Value(ii).ToString());
  }

           

八、複制字段名稱

Method 1:首先擷取要素類的IFields字段集合,然後周遊字段,添加到新的IFields中。

#region 擷取屬性字段 Method 1
 IGeometryDefEdit geomDefEdit = null;
 IFields pFields = pFeatCls.Fields;
 IFields pNewFields = new FieldsClass();
 IFieldsEdit pNewFieldsEdit = pNewFields as IFieldsEdit;

 //保證源要素類與新要素類的字段結構一緻,但空間範圍不一樣,即自己手動設計Geometry字段
 for (int i = 0; i < pFields.FieldCount; i++)
 {
     pField = pFields.get_Field(i);
     if (pField.Type != esriFieldType.esriFieldTypeGeometry)
     {
         pNewFieldsEdit.AddField(pField);
     }
     else
     {
         pGeoField = pField;
         geomDefEdit = pGeoField.GeometryDef as IGeometryDefEdit;
         geomDefEdit.SpatialReference_2 = pSpatialReference;
         pNewFieldsEdit.AddField(pGeoField);
     }
 }
 #endregion
           

Method 2:通過字段檢查對象IFieldChecker ,獲得原有要素類的所有字段。

#region 擷取屬性字段 Method 2
 //屬性資訊
 // 建立字段檢查對象
 IWorkspace pTWorkspace = pWorkspace as IWorkspace;
 IFieldChecker pFieldChecker = new FieldCheckerClass();
 IEnumFieldError pEnumFieldError = null;
 IFields fieldsTar;
 pFieldChecker.ValidateWorkspace = pTWorkspace;
 pFieldChecker.Validate(pFeatCls.Fields, out pEnumFieldError, out fieldsTar);
 #endregion