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的差別與聯系
- esriFeatureType通常用來表示資料的存儲結構,即實體層;
- 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 接口說明(轉)
連結: 接口說明。
四、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的點集
- 擷取要素的圖形
- 點
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