ArcGIS Engine开发
适合新入门小白查看,花了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的区别与联系
- esriFeatureType通常用来表示数据的存储结构,即物理层;
- esriGeometryType通常用来表示数据的几何形状,即表现层。构成了图形的基本类型。
esriGeometryType枚举类型详解
Constant | Value | Description |
---|---|---|
esriGeometryNull | 0 | 未知类型(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 接口说明(转)
链接: 接口说明。
四、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的点集
- 获取要素的图形
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