适合新入门小白查看,花了1周时间理解ArcGIS Engine内部工作空间、要素工作空间、要素 类 、要素等关系,还有GDB、MDB、Shapefile的读取与写入。
//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.栅格目录项。 |
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) |
看图:
链接: 接口说明。
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中存储字段名称,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());
}
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;
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;
:面对象是一个,面中外部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中存储字段名称,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());
}
:首先获取要素类的字段集合,然后遍历字段,添加到新的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
:通过字段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
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删