ArcGIS Engine开发(1)

适合新入门小白查看,花了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
}
ConstantValueDescription
esriFTSimple1Simple Feature.简单要素。
esriFTSimpleJunction7Simple Junction Feature.简单的接线功能。
esriFTSimpleEdge8Simple Edge Feature.简单的边缘特征。
esriFTComplexJunction9Complex Junction Feature.复杂的接线功能。
esriFTComplexEdge10Complex Edge Feature.复杂的边缘特征。
esriFTAnnotation11Annotation Feature.注释功能。
esriFTCoverageAnnotation12Coverage Annotation Feature.覆盖注释功能。
esriFTDimension13Dimension Feature.维特征。
esriFTRasterCatalogItem14Raster Catalog Item.栅格目录项。

二、esriFeatureType与esriGeometryType的区别与联系

  1. esriFeatureType通常用来表示数据的存储结构,即物理层;
  2. esriGeometryType通常用来表示数据的几何形状,即表现层。构成了图形的基本类型。

esriGeometryType枚举类型详解

ConstantValueDescription
esriGeometryNull0未知类型(Unknown)
esriGeometryPoint1点(Point)
esriGeometryMultipoint2多点(Multipoint)
esriGeometryLine13线段(Line)
esriGeometryCircularArc14圆弧(CircularArc)
esriGeometryEllipticArc16椭圆弧(EllipticArc)
esriGeometryBezier3Curve15贝兹曲线(BezierCurve)
esriGeometryPath6路径(Path)
esriGeometryPolyline3多段线(Polyline)
esriGeometryRing11环(Ring)
esriGeometryPolygon4多边形(Polygon)
esriGeometryEnvelope5外包(Envelope)
esriGeometryAny7任何类型(Any valid geometry)
esriGeometryBag17任意几何类型的集合(GeometryBag)
esriGeometryMultiPatch9表面几何(MultiPatch)
esriGeometryTriangleStrip18三角带(TriangleStrip)
esriGeometryTriangleFan19三角扇形(TriangleFan)
esriGeometryRay20射线(Ray)
esriGeometrySphere21球体(Sphere)
esriGeometryTriangles22三角形(Triangles)

看图:
在这里插入图片描述

三、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. 获取要素的图形
   IGeometry pGeo = pFeature.ShapeCopy;
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值