ArcEngine接口大全
- 格式:doc
- 大小:69.00 KB
- 文档页数:7
ArcEngine接口大全(三)《转自ESRI中国社区》9. 关于IArea接口(esriGeometry)IArea接口的第一个属性Area(只读,返回一个double类型的数值,为此Area的面积)IArea接口的第二个属性Centroid(只读,返回一个IPoint类型的变量,为此Area的重心)IArea接口的第三个属性LablePoint(只读,返回一个IPoint类型的变量,为此Area的标签的位置,一般都在此Area的内部)IArea接口的第四个方法QueryCentroid (Center )(方法,Center参数为一个IPoint类型的变量,通过调用此方法将重心点赋值给参数Center)IArea接口的第五个方法QueryLablePoint (LablePoint )(方法,LablePoint参数为设置IPoint 类型的变量,通过调用此方法将标签点赋值给参数LablePoint)10. 关于IEnvelope接口(esriGeometry)应用:(中心放大)IEnvelope接口的第一个方法CenterAt(pPoint)(方法,将这个矩形的边框移动到参数pPoint 的位置,但是其他属性不变,如它的Width和Height)IEnvelope接口的长宽属性Height和Width属性(读写,可以通过该属性获取或设置该边框的长和宽)IEnvelope接口的4个顶点属性UpperLeft、UpperRight、LowerLeft和LowerRight(读写,返回IPoint类型的四个顶点,比直接获得最值坐标更加方便严谨)IEnvelope接口的最值坐标属性XMax、XMin、YMax和YMin(读写,可以通过该属性获取或设置该边框的四个顶点的坐标)IEnvelope接口的第五个方法Union (inEnvelope )(方法,将参数输入的几何边框和调用该方法的几何边框求并集,并将结果赋值给第一个边框,即调用此方法的object)IEnvelope接口的第六个方法intersect (inEnvelope )(方法,返回与输入参数相交的区域的几何边框,并将结果赋值给第一个边框,即调用此方法的object)IEnvelope接口的第七个方法PutCoords (XMin, YMin,XMax,YMax)(方法,将新建的一个边框的4个极坐标设置为输入的参数)IEnvelope接口的第八个方法QueryCoords (XMin, YMin,XMax,YMax)(方法,将已有的一个边框的4个极坐标输出到参数当中以备后用)IEnvelope接口的第九个方法Expand (dx, dy, asRatio)(方法,按照输入的dx与dy参数来放大或者缩小当前的边框,用与对ArcMap窗体的中心放大或缩小,或者点击屏幕获得点击点的坐标,并将中心点设置成点击点,并进行一定比例的放大或者缩小)IEnvelope接口的第十个方法Offset (X, Y)(方法,将已有的一个边框的按照输入参数的大小来进行水平竖直的移动)11. 关于IFeature接口(esriGeoDatabase)IFeature接口的第一个属性Class(只读)IFeature接口的第二个方法Delete(方法,删除该行。
1.IField接口(esriGeoDatabase)IField接口的第一个属性AliasName(只读,获得字段的别名)IField接口的第二个方法CheckValue(Value)(方法,对于指定的属性字段,基于字段类型判断参数值是否有效,有效,则返回True,否则返回False)例子代码:1.Set pField = pFields.Field(6) ’第六个字段2.bChkField = pField.CheckValue(45.86)3.If bChkField = True Th en……IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称)例子代码:1.Dim pFields As IFields2.Dim pField As IField3.Dim pGeoDef As IGeometryDef4.Dim pDomain As IDomain5.Dim i As Long6.Set pFields = pFeatClass.Fields7.For i = 0 To pFields.FieldCount - 18. Set pField = pFields.Field(i)9. If pField.Type = esriFieldTypeGeometry Then10. Set pGeoDef = pField.GeometryDef11. Else12. Debug.Print pField.AliasName13. Debug.Print pField.DefaultValue14. Set pDomain = pField.Domain15. Debug.Print pField.Editable16. Debug.Print pField.IsNullable17. Debug.Print pField.Length18. Debug.Print 19. Debug.Print pField.Precision20. Debug.Print pField.Required21. Debug.Print pField.Scale22. Debug.Print pField.Type23. Debug.Print pField.VarType24. End If25.Next2. IFieldEdit接口(esriGeoDatabase)所有该接口的属性均为可读可写,经常用与对新建字段的设置,因为字段一旦被设置,其基本属性就不能被更改,所以就需要该接口类型的变量去转换,方法为:IFeatureClass pFC_SCP_PT;IFieldEdit editPT = new FieldClass();pFC_SCP_PT.AddField((IField)editPT);如果在vb中去编写代码,则赋值和获取均为同一属性,而在C#中,为了区分设置和获取,属性均有两个,类似于Name和Name_2,这样就可以区分了,普遍用设置的带有_2的那个属性。
ArcEngine接口大全(七)《转自ESRI中国社区》51.RulerSettings对象标尺对象是为了辅助图形元素的放置而出现在PageLayout对象上方和左方的辅助尺如图所示,通过IPageLayout的RulerSettings属性可以获得PageLayout上的RulerSettings对象.RulerSettings对象主要实现了IRulerSettings接口它只有一个SmallestDivision属性用于设置RulerSettings对象的最小刻度值属性52Element对象在Map对象和PageLayout对象显示的数据除了地理数据之外,另一种即为元素数据Element是一个非常庞大复杂的对象集合如下图所示,它主要分为两大部分:图形元素(GraphicElement)和框架元素(Frame Element)。
图形元素(GraphicElement)包LineElement, MarkerElement, TextElement, GroupElement, FillshapElement,PictureElement,MultiPatchElement等。
它们都是作为图形的形式而存在,在地图视图或者PageLayout视图上时可见的。
框架元素(Frame Element)包括MapFrameElement, MapSurroundElement等它们是作为不可见的容器而存在的。
Map对象或者PageLayout对象可以通过IGraphicsContainer接口来管理这些元素,使用IGraphicsContainer接口可以添加,删除和更新位于Map或PageLayout上的元素。
使用GroupElement对象还可以将多个元素编组为单个实体来给用户使用。
IElement是所有图形元素(GraphicElement)和框架元素(Frame Element)都实现的接口,通过IElement接口可以确定Element对象的Geometry属性,同时IElment接口也提供了用于查找和绘制元素的方法。
ArcGIS接口详细说明 (1)GeometryGeometry 库处理存储在特征类(feature classes)或其它图形要素(graphical elements)中的特征的 geometry 或 shape。
大多数用户交互的基本几何对象有 Point 、MultiPoint 、Polyline 和 Polygon 。
除了这些顶层的实体,还有作为 Polylines 和 Polygons 构建模块的几何体(geometries)。
这些是组成几何体的基元(primitives)。
它们是 Segments、Paths 和 Rings。
Polylines 和 Polygons 由形成一条 Path 的依次相连的 Segments 组成。
一个 Segment 包含两个不同的点,起点和终点,和一个定义从起点到终点的曲线的要素类型。
这种 segments 有 CircularArc、 Line、 EllipticArc 和 BezierCurve。
所有的几何对象都可以有与它们顶点相关的 Z、和 IDs。
MISegmentCollection接口被Path,Ring,Polyline和Polygon四个类所实现,它们被称作是Segment集合对象,使用这个接口可以处理组成Segment集合对象中的每一个子Segment对象。
使用ISegmentCollection接口可以为一个Segment集合对象添加,插入,删除Segment子对象。
ISegmentCollection接口SetCircle和SetRectangle方法提供了一种简单不需要添加Segment的情况下构建一个完成的Path,Ring,Polyline和Polygon的方法。
Geometry集合接口通过前边对于具体的Geometry对象的介绍可知,除了Point对象之外,其他几何对象都是通过其他几何对象集合构建而成。
如MultiPoint对象是点的集合,Path 对象是Segment对象的集合,Polyline对象是Path对象的集合,Polygon对象是Ring对象的集合,Multipatch对象是Triangle Strip和Trangle Fan, Trangle,Ring对象的集合。
下面根据依赖关系的顺序对一些常用类库进行讨论。
模型图中在每个类库框的右上角显示了其序列号。
例如,作为ArcGIS体系结构基础的System类库,其编号为1,而编号为7的GeoDatabase类库依赖于模型图中其前面的6个类库--System、SystemUI、Geometry、Display、Server和Output。
System类库System类库是ArcGIS体系结构中最底层的类库。
System类库包含给构成ArcGIS的其他类库提供服务的组件。
System类库中定义了大量开发者可以实现的接口。
AoInitializer对象就是在System类库中定义的,所有的开发者必须使用这个对象来初始化ArcGIS Engine和解除ArcGIS Engine的初始化。
开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展ArcGIS系统。
SystemUI类库SystemUI类库包含用户界面组件接口定义,这些用户界面组件可以在ArcGIS Engine中进行扩展。
包含ICommand、ITool和IToolControl接口。
开发者用这些接口来扩展UI组件,ArcGIS Engine开发人员自己的组件将使用这些UI组件,且一般是在高层次的类库中实现。
这个类库中包含的对象是一些使用工具对象,开发人员可以通过使用这些对象简化用户界面的开发。
开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展ArcGIS系统。
Geometry类库Geometry类库处理存储在要素类中的要素几何图形或形状或其他图形元素。
大多数用户会遇到的基本几何图形对象为Point、MultiPoint、Polyline和Polygon。
除了这些顶级实体外,就是作为多义线和多边形的组成部分的几何图形,是组成几何图形的子要素。
它们是Segment、Path和Ring。
Polyline和Polygon由一系列相连接的、构成列Path的片段组成。
ArcGIS接口详细说明之个人开发心得1. 关于IField接口(esriGeoDatabase)2. 关于IFieldEdit接口(esriGeoDatabase)3. 关于IFields接口(esriGeoDatabase)4. 关于IPoint接口(esriGeometry)5. 关于IPointArray接口(esriGeometry)6. 关于IPointCollection接口(esriGeometry)7. 关于IPolyline接口(esriGeometry)8. 关于IGeometry接口(esriGeometry)9. 关于IArea接口(esriGeometry)10. 关于IEnvelope接口(esriGeometry)11. 关于IFeature接口(esriGeoDatabase)12. 关于IRow接口(esriGeoDatabase)13. 关于IFeatureClass接口(esriGeoDatabase)14. 关于ITable接口(esriGeoDatabase)15. 关于IFeatureCursor接口(esriGeoDatabase)16. 关于IQueryFilter接口(esriGeoDatabase)17. 关于IFeatureLayer接口(esriCarto)18. 关于IFeatureSelection接口(esriCarto)19. 关于IMap接口(esriCarto)20. 关于IPropertySet接口(esriSystem)21. 关于IFeatureWorkspace接口(esriGeoDatabase)22. 关于IWorkspaceEdit接口(esriGeoDatabase)23. 关于IWorkspaceFactory接口(esriGeoDatabase)24. 关于ITopologicalOperator接口(esriGeometry)25. 创建Buffer并选择里面的要素26. Merge要素Union要素27. 怎样从Table中获取具体需求值的Row28. 怎样ZoomInCenter29. 怎样读取一个字段内的所有值30. 怎样编辑更改属性字段的值31. 怎样将MapControl中的Map复制到PageLayoutControl中32. 怎样判断是否出于编辑状态33. 怎样用点创建一个Polygon34. 怎样运用属性来计算总面积35. 关于属性域的一些心得36. 怎样实现翻折Flip方法37. 回答cumtbGIS关于ITopologicalOperator接口Clip方法的问题38. 回答机器猫FJJ关于ISpatialFilter接口方法的问题(完整函数)39. 回答网友韶华响当当关于更改符号的代码(完整函数)40. 回答网友韶华响当当关于显示属性的代码(完整函数)1. 关于IField接口(esriGeoDatabase)IField接口的第一个属性AliasName(只读,获得字段的别名)IField接口的第二个方法CheckValue(Value)(方法,对于指定的属性字段,基于字段类型判断参数值是否有效,有效,则返回True,否则返回False)例子代码:'Get FieldSet pField = pFields.Field(6)bChkField = pField.CheckV alue(45.86)If bChkField = True Then'Add data to selected rows for the field selected.End If复制代码IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称)例子代码:Dim pFields As IFieldsDim pField As IFieldDim pGeoDef As IGeometryDefDim pDomain As IDomainDim i As LongSet pFields = pFeatClass.FieldsFor i = 0 To pFields.FieldCount - 1Set pField = pFields.Field(i)If pField.Type = esriFieldTypeGeometry ThenSet pGeoDef = pField.GeometryDefElseDebug.Print pField.AliasNameDebug.Print pField.DefaultValueSet pDomain = pField.DomainDebug.Print pField.EditableDebug.Print pField.IsNullableDebug.Print pField.LengthDebug.Print Debug.Print pField.PrecisionDebug.Print pField.RequiredDebug.Print pField.ScaleDebug.Print pField.TypeDebug.Print pField.VarTypeEnd IfNext2. 关于IFieldEdit接口(esriGeoDatabase)所有该接口的属性均为可读可写,经常用与对新建字段的设置,因为字段一旦被设置,其基本属性就不能被更改,所以就需要该接口类型的变量去转换,方法为:IFeatureClass pFC_SCP_PT;IFieldEdit editPT = new FieldClass();pFC_SCP_PT.AddField((IField)editPT);如果在vb中去编写代码,则赋值和获取均为同一属性,而在C#中,为了区分设置和获取,属性均有两个,类似于Name和Name_2,这样就可以区分了,普遍用设置的带有_2的那个属性。
第4章地图组成及图层控制4.1 地图对象地图(Map)是ArcEngine的主要组成部分。
Map对象既是数据的管理容器,同时也是数据显示的主要载体。
Map对象的主要接口有IMap、IGraphicsContainer、IActiveView、IActiveViewEvents、IMapBookmark和ITableCollection等。
Map对象共有35个接口,更多的接口请查看“帮助”文件。
本节介绍几个主要的接口。
4.1.1 IMap接口IMap接口主要用于管理Map对象中的layer对象、要素选择集、MapSourround对象和标注等。
Map对象通过图层的方式管理地理数据。
在IMap接口中定义了大量的方法来操作其中的图层对象,如AddLayer、AddLayers,这两个方法分别是将一个、多个图层加载进Map对象;ClearLayers是清除Map中所有的图层;LayerCount则是Map中的图层记数器,计算Map中有多少个图层;SelectFeature是在Map中选择实体;SelectByShape是通过指定的实体在Map中选择实体;SelectionCount是获取选择实体的个数。
当图层添加进Map对象时,最先添加的图层放在最下面,后续添加的图层则依次叠加在原有图层上。
下面通过例子演示如何使用这些主要方法和属性。
新建一个VS2005工程,工程命名为“lesson1”,在Form1窗体上添加一个ToolbarControl 控件,一个MapControl控件,一个LicenseControl1控件,一个Button控件;然后在ToolbarControl 控件的属性里设置“伙伴控件”为MapControl,如图4-1所示。
ArcgisEngine(ae)接⼝详解(5):IGeometry⼏何⾼级操作 IPoint point = new PointClass();point.PutCoords(100, 200);//ITopologicalOperator接⼝⽤于⼏何对象的⼏何操作ITopologicalOperator topo = point as ITopologicalOperator;//做⼀个⼏何对象的缓冲区(结果也是个⼏何对象),参数1是缓冲半径//点线⾯的缓冲区都是⾯,所以可以直接as到IPolygonIPolygon polygon = topo.Buffer(100) as IPolygon;ITopologicalOperator2 topo2 = point as ITopologicalOperator2;//错误⼏何对象的修复,如果当⼏何对象有⼏何错误,例如⾯有⾃相交,可以⽤此修复topo2.IsKnownSimple_2 = false;topo2.Simplify();topo = polygon as ITopologicalOperator;//获取⾯的边,⾯的边是线IPolyline polyline = topo.Boundary as IPolyline;IPolygon polygon2 = new PolygonClass();topo = polygon as ITopologicalOperator;//求两个⼏何对象的重叠部分//两个⼏何对象的重叠部分,可以有很多种⼏何类型组合,例如⾯与⾯重叠是⾯,线与线重叠是线或者点,点与点重叠是点,点与⾯重叠是点,线与⾯重叠是线等等 //参数2是返回结果是多少维的意思,根据经验如果返回结果是点就是0维(esriGeometry0Dimension),线就是1维,⾯就是2维//官⽅⽂档还有详细说明,使⽤者要结合⽂档和实际使⽤情况相互对照来学习IGeometry geometry3 = topo.Intersect(polygon2, esriGeometryDimension.esriGeometry2Dimension);//两个⼏何对象的⼏何操作还有://Union 求两个⼏何对象合并后的,也就是求并集//Clip 裁剪//Cut ⽤线把⾯⼀份为⼆//Difference 擦除//IRelationalOperator⽤于判断两个⼏何对象的空间关系//IRelationalOperator的每种空间关系在官⽅⽂档有具体截图IRelationalOperator relaOper = polygon as IRelationalOperator;//求两个⼏何对象是否有重叠部分,注意:Overlaps判断的两个⼏何对象的⼏何类型必须相同bool result = relaOper.Overlaps(polygon2);//其他空间关系判断有://Contains-完全包含//Crosses-穿过?//Disjoint-完全不相交//Equals-完全重叠(就是两个⼏何对象完全⼀样,常⽤)//Touches-边沿重叠?//Within-完全包含2IPoint point2 = new PointClass();point.PutCoords(200, 300);//计算两点距离double distance = GeometryHelper.TwoPointDistance(point, point2);。
ArcEngineIMap接口使用方法使用IMap接口显示各种数据源的数据。
IMap接口的成员ActiveGraphicsLayer:活动图形图层,如果没有将创建一个基本memory graphics layer。
AddLayer:向地图中添加单个图层。
AddLayers:向地图中添加多个图层。
AddMapSurround:向地图中添加map surround。
AnnotationEngine:地图使用的注记(标签)引擎。
AreaOfInterest:地图的感兴趣区域。
Barriers:barriers列表和标签权重。
BasicGraphicsLayer:基本图形层。
ClearLayers:从地图中移除所有图层。
ClearMapSurrounds:从地图中移除所有旁注。
ClearSelection:清除地图选择。
ClipBorder:ClipGeometry周围一个可选边界。
ClipGeometry:地图图层中一个要剪切的形状。
ComputeDistance:计算地图上两个点的距离并返回结果。
CreateMapSurround:创建并初始化一个map surround。
从样式集中指定一个可选样式。
DelayDrawing:暂停绘制。
DelayEvents:将操作按批组合来减少通知。
DeletLayer:从map中删除图层。
DeleteMapSurround:从地图中删除map surround。
Description:地图描述。
DistanceUnits:地图的距离单位。
Expanded:指出地图是否可以扩张。
FeatureSelection:地图中选择的要素。
GetPageSize:获得地图的页面大小。
IsFramed:指出地图是否在一个框架内而不是在整个窗口中绘制。
Layer:给定序号的layer。
LayerCount:地图中图层的数目。
Layers:以uid表明类型的地图图层。
如果recursive是true,将以layers的形式返回layers。
ArcEngine接口大全二ArcEngine接口大全(二)《转自ESRI中国社区》7. 关于IPolyline接口(esriGeometry)IPolyline接口的第一个属性FromPoint与ToPoint(读写,设置或者读取该点的起始点和终止点,返回都是IPoint类型的变量)IPolyline接口的第二个方法QueryFromPoint (from )(方法,返回IPoint 类型的变量到参数from)IPolyline接口的第三个方法QueryToPoint (to )(方法,返回IPoint类型的变量到参数to)1.Public Sub t_ICurve_QueryPoints()2. Dim pID As New UID3. pID = "esriEditor.editor"4. Dim pEditor As IEditor5. Dim pApp As IApplication6. Set pApp = MxApplication7. Set pEditor = pApp.FindExtensionByCLSID(pID)8.9. If pEditor.SelectionCount <> 1 Then10. MsgBox "select one Curve"11. Exit Sub12. End If13.14. Dim pEnumFeat As IEnumFeature15. Dim pFeature As IFeature16.17. Set pEnumFeat = pEditor.EditSelection18.19. Dim pCurve As ICurve20. Dim pPointFrom As IPoint21. Dim pPointT o As IPoint22.23. Set pPointFrom = New Point24. Set pPointTo = New Point25.26. Set pFeature = pEnumFeat.Next27.28. While Not pFeature Is Nothing29. If pFeature.Shape.GeometryType = esriGeometryPolyline Or _30. esriGeometryPolyline Or esriGeometryLine Then31. Set pCurve = pFeature.Shape32. pCurve.QueryFromPoint pPointFrom33. pCurve.QueryToPoint pPointT o34. MsgBox "+++ICurve properties..." & vbCrLf _35. & "Curve.QueryFromPoint (x,y) = " & pPointFrom.X & "," & pPointFrom.Y & vbCrLf _36. & "Curve.QueryToPoint (x,y) = " & pPointTo.X & ","& pPointTo.Y & vbCrLf37. End If38. Set pFeature = pEnumFeat.Next39. WendIPolyline接口的第四个方法Generalize (maxAllowableOffset )(方法,用道格拉斯普克发来简化polyline)IPolyline接口的第五个方法Weed (maxAllowableOffsetFactor ) (方法,和方法Generalize类似,均为简化polyline的方法,不同的是参数。
ArcEngine接口大全(五)《转自ESRI中国社区》37.想用ITopologicalOperator做图层剪切1.Dim pTopoO As ITopologicalOperator2.Set pTopoO = pFeature.Shape3.Dim pEnv As IEnvelope4.Set pEnv = New Envelope5.pEnv.XMax = 1006.pEnv.XMin = 907.pEnv.YMax = 1008.pEnv.YMin = 909.pTopoO.Clip epnv10.pFeature.Store38.FJJ关于ISpatialFilter接口方法的问题ing System;ing System.Collections.Generic;ing ponentModel;ing System.Data;ing System.Drawing;ing System.Text;ing System.Windows.Forms;ing ESRI.ArcGIS.Geodatabase;ing ESRI.ArcGIS.Carto;space Solutions11.{12. public partial class Form1 : Form13. {14. public Form1()15. {16. InitializeComponent();17. ILayer pLayer;18. IFeatureLayer pFeatureLayer;19. IFeatureClass pFeatureClass;20. IFeatureCursor pFeatureCursor;21. IFeature pFeature;22. ISpatialFilter pSpatialFilter;23. pSpatialFilter = new SpatialFilterClass();24. pSpatialFilter.Geometry = pGeom; ///这个pGeom就是传进来的参数,就是你所谓的那个“选择了地图上的一块区域”25. pSpatialFilter.SpatialRel =esriSpatialRelEnum.esriSpatialRelContains;26. int layerCount = yerCount;27. for (int i = 0; i < layerCount; i++)28. {29. pLayer = axMapControl1.get_Layer(i);30. pFeatureLayer = (IFeatureLayer)pLayer;31. pFeatureClass = pFeatureLayer.FeatureClass;32. pFeatureCursor =pFeatureClass.Search((IQueryFilter)pSpatialFilter, false);33. pFeature = pFeatureCursor.NextFeature();34. while (pFeature != null)35. {36. listView1.Items.Add();37. }38. }39. }40. }41.}39.关于更改符号的代码1.private void axTOC1_OnDoubleClick(object sender,ITOCControlEvents_OnDoubleClickEvent e)2. {3. esriTOCControlItem itemType =esriTOCControlItem.esriTOCControlItemNone;4. IBasicMap basicMap = null;5. ILayer layer = null;6. object unk = null;7. object data = null;8. axTOC1.HitTest(e.x, e.y, ref itemType, ref basicMap, reflayer, ref unk, ref data);9. if (e.button == 1)10. {11. if (itemType ==esriTOCControlItem.esriTOCControlItemLegendClass)12. {13. //取得图例14. ILegendClass pLegendClass =((ILegendGroup)unk).get_Class((int)data);15. //创建符号选择器SymbolSelector实例16. FormSymbolControl SymbolSelectorFrm = newFormSymbolControl(pLegendClass, layer);17. if (SymbolSelectorFrm.ShowDialog() ==DialogResult.OK)18. {19. //局部更新主Map控件20. //m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);21. axMap1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);22. //设置新的符号23. pLegendClass.Symbol =SymbolSelectorFrm.pSymbol;24. //更新主Map控件和图层控件25. this.axMap1.ActiveView.Refresh();26. this.axTOC1.Refresh();27. }28. }29. }30. }40.关于显示属性的代码1. ///2. /// 填充DataTable中的数据3. ///4. ///5. ///6. ///7. public static DataTable CreateDataTable(ILayer pLayer, stringtableName)8. {9. //创建空DataTable10. DataTable pDataTable = CreateDataTableByLayer(pLayer,tableName);11. //创建DataTable的行对象12. DataRow pDataRow = null;13. //取得图层类型14. string shapeType = getShapeType(pLayer);15. //从ILayer查询到ITable16. ITable pTable = pLayer as ITable;17. ICursor pCursor = pTable.Search(null, false);18. //取得ITable中的行信息19. IRow pRow = pCursor.NextRow();20. int n = 0;21. while (pRow != null)22. {23. //新建DataTable的行对象24. pDataRow = pDataTable.NewRow();25. for (int i = 0; i < pRow.Fields.FieldCount; i++)26. {27. //如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值28. if (pRow.Fields.get_Field(i).Type ==esriFieldType.esriFieldTypeGeometry)29. {30. pDataRow = shapeType;31. }32. //当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据,33. //其存储的是标注内容,如此情况需将对应的字段值设置为Element34. else if (pRow.Fields.get_Field(i).Type ==esriFieldType.esriFieldTypeBlob)35. {36. pDataRow = "Element";37. }38. else39. {40. pDataRow = pRow.get_Value(i);41. }42. }43. //添加DataRow到DataTable44. pDataTable.Rows.Add(pDataRow);45. pDataRow = null;46. n++;47. pRow = pCursor.NextRow();48. ////为保证效率,一次只装载最多条记录49. //if (n == 2000)50. //{51. // pRow = null;52. //}53. //else54. //{55. // pRow = pCursor.NextRow();56. //}57. }58. return pDataTable;59. }41.关于IFeature变量添加进List<IFeature>数组里的问题1.List<IFeature> listFeature = new List<IFeature>();2.try3.{4. pFC_TER_LN =pFeatureWorkspace.OpenFeatureClass("GD10K_DLG_TER_LN_l");5.}6.catch7.{8. richTextBox1.SelectionStart = richTextBox1.Text.Length;9. richTextBox1.SelectedText = "地形图:" + + "中没有TER_LN_l图层!\n";10. richTextBox1.Refresh();11. continue;12.}13.for (int i = 0; i < pFC_TER_LN.FeatureCount([color=Red]null[/color]);i++) ///将该图层的每个Feature提取出来以供编辑时依次赋值,并且可以设置FeatureCount方法的参数为一个IQueryFilter类型的变量,就可以实现你所要求的方法了,用Search()方法,应该是不可以的,希望你们试一下。
ArcEngine接口大全(带示例)1、抽象类,类,和组件对象类抽象类是不能实例化的,抽象类中是一系列抽象的方法,故是不能实例化的,它只能被继承。
不同的类可以继承同一个抽象类,但内部对同一方法的实现可能是不一样的。
如AO中的接口都是抽象类。
用户可以在类中实现这些接口,也就是继承这些接口。
如用户可以在自己的类中实现ICommand接口,生成一个Command,或者实现ICommand、IT ool接口,生成一个T ool.类是不能直接实例化的,它只能作为另一个类的属性或者被其它类的对象实例化。
如Sde3Workspace Class、Sde4Workspace Class,FeatureClass,FeatureDataset它们是不能通过New 直接实例化的,只能通过SdeWorkspaceFactory CoClass这个组件对象类所实现的IWorkspaceFactory接口里的Open方法来实例化。
FeatureClass,FeatureDataset也是不能直接实例化的,他只能通过IFeatureWorkspace接口里的CreateFeatureClass,CreateFeatureDataset 方法来实例化。
组件对象类能够通过New来直接实例化。
如SdeWorkspaceFactory,QueryFilter它们是可以通过New来直接实例化的。
2、继承类继承(type inheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方法。
上图说明primary line 和secondary line 是line 的一种类型。
实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。
pole 对象有一个方法能够创建transformer 对象。
3、类和接口的实现一些类可能实现多个接口,一个接口也可能被多个类所实现,但不同的类实现同一个接口可能内部并不是一样的,这就实现了多态性.如ILayer这个接口被多个接口实现,其中包括FeatureLayer和RasterLayer,但这两个类实现ILayer接口时内部实现肯定是不一样的!但在外部对ILayer的操作是一样的!4、接口之间的相互查询一个类可以实现多个接口,每一个接口可能包括一系列的属性和方法,但有时候一个接口里可能没有你想要的方法和属性,可能在这个类所实现接口的另一个接口里,这就涉及到从一个接口转到这个类所实现接口的另一个接口里,对于类所实现的一系列接口里,接口间是可以相互跳转的。
arcengine 缓冲区查询缓冲区查询特别有⽤,也很⽅便,照着别⼈的⾃⼰写了⼀个,记录⼀下。
缓冲区查询主要⽤到的核⼼接⼝就两个,ITopologcialOperator和ISpatialFilter这两个接⼝。
第⼀个接⼝⽤来构建缓冲区和进⾏其他的拓扑操作,第⼆个接⼝是空间过滤器,其中提供空间查询的各种关系。
这两个接⼝还有很多其他属性和⽅法,⽤到时⾃⾏查看帮助。
⼀下是缓冲区查询的核⼼代码,当然之前必须指定查找的⽬标图层和建⽴缓冲区的图层和对象。
IGeometry pGeometry = TestFeature.Shape;ITopologicalOperator pTopologicalOperator = pGeometry as ITopologicalOperator;pGeometry = pTopologicalOperator.Buffer(Distence);//Distence是缓冲距离pTopologicalOperator.Simplify();ISpatialFilter pSpatialfilter = new SpatialFilterClass();pSpatialfilter.Geometry = pGeometry;pSpatialfilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;pSpatialfilter.GeometryField = "Shape";ILayer pLayer = this.axMCl1.get_Layer(0);IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;IFeatureCursor FeatureCursor = pFeatureClass.Search(pSpatialfilter, false);IFeature Feature = FeatureCursor.NextFeature();。
ArcEngine接口大全[转载]ArcEngine接口大全(四)《转自ESRI中国社区》(2010-11-14 14:58:22)转载原文标签:分类:AE开发转载原文地址:ArcEngine接口大全(四)《转自ESRI中国社区》作者:GisEr27.怎样从Table中获取具体需求值的Row:1.ITable pTable = (ITable)pFC;2. int index =pTable.Fields.FindField("FieldName");3. IQueryFilter pQFilter = new QueryFilterClass();4. ICursor pCur;5. pCur = pTable.Search(pQFilter, false);6. IRow pRow = new Row();7. IRow pAnswerRow = new Row();8. pRow = pCur.NextRow();9. while (pRow != null)10. {11. string Value =pRow.get_Value(index).ToString();12. if (Value == "Value")13. {14. pAnswerRow = pRow;15. break;16. }17. pRow = pCur.NextRow();18. }28.怎样ZoomInCenter:1.Public Sub ZoomInCenter()2. Dim pMxDocument As IMxDocument3. Dim pActiveView As IActiveView4. Dim pDisplayTransform As IDisplayTransformation5. Dim pEnvelope As IEnvelope6. Dim pCenterPoint As IPoint7. Set pMxDocument = Application.Document8. Set pActiveView = pMxDocument.FocusMap9. Set pDisplayTransform =pActiveView.ScreenDisplay.DisplayTransformation10. Set pEnvelope = pDisplayTransform.VisibleBounds11. 'In this case, we could have set pEnvelope toIActiveView::Extent12. 'Set pEnvelope = pActiveView.Extent13. Set pCenterPoint = New Point14.15. pCenterPoint.x = ((pEnvelope.XMax - pEnvelope.XMin) / 2) +pEnvelope.XMin16. pCenterPoint.y = ((pEnvelope.YMax - pEnvelope.YMin) / 2) +pEnvelope.YMin17. pEnvelope.width = pEnvelope.width / 218. pEnvelope.height = pEnvelope.height / 219. pEnvelope.CenterAt pCenterPoint20. pDisplayTransform.VisibleBounds = pEnvelope21. pActiveView.Refresh22.End Sub29.怎样读取一个字段内的所有值:1. IFeatureClass pFC =m_SDEQuery.getFeatureClass();2. IFeatureCursor pFeaCur = pFC.Search(null,false);3. IFeature pFeature = pFeaCur.NextFeature();4. int pFieldIndex =pFC.Fields.FindField(this.m_cboQryFld.SelectedItem.Value.To String());5. System.Collections.ArrayList pArr = newSystem.Collections.ArrayList();6. while (pFeature != null)7. {8. string theFieldValue =pFeature.get_Value(pFieldIndex).T oString();9. if (!pArr.Contains(theFieldValue) &&(theFieldValue.Trim() != ""))10. {11. m_cboQryText.Items.Add(theFieldValue);12. pArr.Add(theFieldValue);13. }14. pFeature = pFeaCur.NextFeature();15. }30怎样编辑更改属性字段的值:1.IRow prow = (IRow)bendiFeatureC.GetFeature(1);2.MessageBox.Show(prow.Table.Fields.FieldCount.ToString());3.ITable ptable = (ITable)bendiFeatureC;4.IQueryFilter pqfilter = new QueryFilterClass();5.pqfilter.WhereClause = ""dkmc" = '北江路南郊一公里'";6.IFeatureCursor pfeatcur;7.pfeatcur = bendiFeatureC.Search(pqfilter, false);8.IFeature pfff = pfeatcur.NextFeature();9.while (pfff != null)10.{11. IRow prrr = (IRow)pfff;12. prrr.set_Value(prrr.Fields.FindField("dkmc"), "北江路南郊二公里");13. pfff = (IFeature)prrr;14. pfff.Store();15. pfff = pfeatcur.NextFeature();16.}31怎样将MapControl中的Map复制到PageLayoutControl中1.Public Sub CopyAndOverwriteMap()2. On Error GoT o CopyAndOverwriteMap_err3. Dim pObjectCopy As IObjectCopy4. pObjectCopy = New ObjectCopy5. Dim pToCopyMap As Object6. pToCopyMap = frmMap.AxMapControl1.Map7. Dim pCopiedMap As Object8. pCopiedMap = pObjectCopy.Copy(pToCopyMap)9. Dim pToOverwriteMap As Object10. pToOverwriteMap =PrintPageLayout.AxPageLayoutControl1.ActiveView.FocusM ap11. pObjectCopy.Overwrite(pCopiedMap, pToOverwriteMap)12. frmMap.AxMapControl1.MousePointer13.=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPoin terArrow14. frmMain.StatusMessage.Text = ""15. PrintPageLayout.ShowDialog()16. Exit Sub17. CopyAndOverwriteMap_err:18. MsgBox(Err.Number & " - " & Err.Description,MsgBoxStyle.Critical, Application.ProductName & "- Copy Map")19. Exit Sub20.End Sub32怎样判断是否出于编辑状态:1.If m_pEditor.EditState = esriStateEditing Then2. m_pEditor.StartOperation3. '删除冗余节点4. DelSubPoint pMap5. m_pEditor.StopOperation "OK"6.End If33。
ArcgisEngine(ae)接⼝详解(5):IGeometry⼏何基础操作//点操作~~~~~~~~~~~~~~~~~~~~~~~~~//通过坐标⽣成点IPoint point = new PointClass();point.PutCoords(100, 200);//获取点坐标double x = point.X;double y = point.Y;//线操作~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//通过点集⽣成线IPolyline polyline = new PolylineClass();//思路是通过点集接⼝IPointCollection添加线的点,创建线和⾯同样可⽤此⽅法IPointCollection pointColl = polyline as IPointCollection;point = new PointClass();point.PutCoords(100, 200);pointColl.AddPoint(point);point = new PointClass();point.PutCoords(300, 100);pointColl.AddPoint(point);//通过点集⽣成线完成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//获取线的起点和终点IPoint pointStart = polyline.FromPoint;IPoint pointEnd = polyline.ToPoint;//获取线的长度double length = polyline.Length;//获取线的矩形范围(envelop),⾯的获取⽅式也⼀样//线和⾯都有envelope,不过点的envelop没有意义IEnvelope envelope = polyline.Envelope;//获取线是否是闭合的线bool isClosed = polyline.IsClosed;//把线的⽅向反转,就是起点和终点,点的顺序反转polyline.ReverseOrientation();//获取线的所有点,对于⾯同样可⽤此⽅法for (int i = 0; i < pointColl.PointCount; i++){IPoint point1 = pointColl.Point[i];}//⾯操作~~~~~~~~~~~~~~~~~~~~~~~~~~~IPolygon polygon = new PolygonClass();//通过点集⽣成线:与线⼀样//注意:⽣成⾯时点集要求第⼀个点做坐标和最后⼀个点的坐标⼀样,也可理解为同⼀个点添加了两次,否则会出错//获取⾯的周长length = polygon.Length;IArea area = polygon as IArea;//获取⾯的⾯积double area1 = area.Area;//获取⾯的所有点,跟线获取的⽅法⼀样//⼏何通⽤操作~~~~~~~~~~~~~~~~~~~~~~~~~~~//点线⾯都可以as到IGeometry,所有⼏何对象的类型都可以,因此所有⼏何类型接⼝都继承了IGeometryIGeometry geometry = polygon as IGeometry;//获取⼏何类型,可以区分出点,线,⾯等//如果有种情况获取到的⼏何对象的类型是IGeometry,那可以通过这个判断是什么⼏何类型,然后在as到对应的接⼝再做下⼀步操作esriGeometryType geometryType = geometry.GeometryType;//获取是否空⼏何对象//空⼏何对象和null不同,例如点对象可是没有点坐标,线对象没有⼀个点等等//空⼏何对象其中⼀种情况是,从feature获取到的⼏何对象,可能是空的,因为⼀条要素肯定有⼀个对应的⼏何对象,可是编辑时⼜可以不录⼊⼏何对象(⽽只是录⼊属性字段值)bool isEmpty = geometry.IsEmpty;//矩形范围(Envelope)操作~~~~~~~~~~~~~~~~~~~~~~~~~~~IEnvelope envelope2 = polygon.Envelope;//获取矩形的坐标,矩形⽤最⼩点(左下⾓的点)和最⼤点(右上⾓的点)两个点就⾜够表⽰double xmin = envelope2.XMin;double ymin = envelope2.YMin;double xmax = envelope2.XMax;double ymax = envelope2.YMax;//获取矩形的宽和⾼double height = envelope2.Height;double width = envelope2.Width;//通过坐标创建矩形envelope2 = new EnvelopeClass();envelope2.PutCoords(100, 200, 300, 400);//扩⼤和缩⼩//有两种情况,根据参数3设置,false=按长度,true=按⽐例//下例是⽔平扩⼤10(⽶),垂直扩⼤20(⽶)envelope2.Expand(10, 20, false);//下例是⽔平设为原来的0.8倍(可以理解为缩⼩了20%),垂直设为原来的1.1倍(可以理解为放⼤了10%) envelope2.Expand(0.8, 1.1, true);//移动//把矩形中⼼点移到某个点(实际是整个矩形移动)envelope2.CenterAt(point);//矩形转⾯//逻辑上矩形也是⾯,但在ae对象中IEnvelop和IPolygon不能互转,下⾯是edm的转换⽅法polygon = GeometryHelper.EnvelopeToPolygon(envelope);。
ArcEngine接口大全(六)《转自ESRI中国社区》44.Map接口在ArcMap中Map对象是由MXDocument对象的MapFrame对象管理,MapFrame是一个框架元素。
Map对象有双重身份,一方面是数据的管理容器,可以加载地理数据和图形元素,扮演了数据管理器的角色,另一方面它又可以让用户看到这些数据即扮演了数据显示器的角色,当加载数据到Map对象的时候,Map对象是数据的管理者;当改变视图范围,刷新地图的时候它是数据的显示者。
Map对象主要实现的接口由IMap,IGraphicContainer,IActiveView,IMapBookmarks 等接口。
IMap接口主要用于管理Map对象中的Layer对象,要素选择集对象,MapSourround对象,空间参考等对象。
Map对象可以显示图形元素(Graphics Element),Map对象通过IGraphicsContainer接口来管理这些元素对象,包括图形元素和框架元素。
IGraphicsContainer返回的是Map对象中处于活动状态的Graphics layer引用指针,它可以是一个Basicgraphicslayer,也可以是CompositeGraphicsLayer中的一个图层,或者是一个FDOGraphicsLayer注记图层。
45.IActiveView接口IActiveView接口定义了Map对象的数据显示功能。
使用该接口可以改变视图的范围,刷新视图。
IActiveView的PartialRefresh(esriViewGeography, pLayer, null)用于刷新指定图层:IActiveView的PartialRefresh(esriViewGeography, null, null) 用于刷新刷新所有图层:IActiveView的PartialRefresh(esriViewGeoSelection, null, null) 用于刷新所选择的对象:IActiveView的PartialRefresh(esriViewGraphics, null, null) 用于刷新图形元素:IActiveView的PartialRefresh(esriViewGraphics, pElement, null) 用于刷新指定图形元素IActiveView的PartialRefresh(esriViewGraphics, null, null) 用于刷新所有图形元素IActiveView的PartialRefresh(esriViewGraphicSelection, null, null)用于刷新所选择的图元。
[转载]ArcEngine接口大全(四)《转自ESRI中国社区》(2010-11-14 14:58:22)转载原文标签:分类:AE开发转载原文地址:ArcEngine接口大全(四)《转自ESRI中国社区》作者:GisEr27.怎样从Table中获取具体需求值的Row:1.ITable pTable = (ITable)pFC;2. int index =pTable.Fields.FindField("FieldName");3. IQueryFilter pQFilter = new QueryFilterClass();4. ICursor pCur;5. pCur = pTable.Search(pQFilter, false);6. IRow pRow = new Row();7. IRow pAnswerRow = new Row();8. pRow = pCur.NextRow();9. while (pRow != null)10. {11. string Value =pRow.get_Value(index).ToString();12. if (Value == "Value")13. {14. pAnswerRow = pRow;15. break;16. }17. pRow = pCur.NextRow();18. }28.怎样ZoomInCenter:1.Public Sub ZoomInCenter()2. Dim pMxDocument As IMxDocument3. Dim pActiveView As IActiveView4. Dim pDisplayTransform As IDisplayTransformation5. Dim pEnvelope As IEnvelope6. Dim pCenterPoint As IPoint7. Set pMxDocument = Application.Document8. Set pActiveView = pMxDocument.FocusMap9. Set pDisplayTransform =pActiveView.ScreenDisplay.DisplayTransformation10. Set pEnvelope = pDisplayTransform.VisibleBounds11. 'In this case, we could have set pEnvelope toIActiveView::Extent12. 'Set pEnvelope = pActiveView.Extent13. Set pCenterPoint = New Point14.15. pCenterPoint.x = ((pEnvelope.XMax - pEnvelope.XMin) / 2) +pEnvelope.XMin16. pCenterPoint.y = ((pEnvelope.YMax - pEnvelope.YMin) / 2) +pEnvelope.YMin17. pEnvelope.width = pEnvelope.width / 218. pEnvelope.height = pEnvelope.height / 219. pEnvelope.CenterAt pCenterPoint20. pDisplayTransform.VisibleBounds = pEnvelope21. pActiveView.Refresh22.End Sub29.怎样读取一个字段内的所有值:1. IFeatureClass pFC =m_SDEQuery.getFeatureClass();2. IFeatureCursor pFeaCur = pFC.Search(null,false);3. IFeature pFeature = pFeaCur.NextFeature();4. int pFieldIndex =pFC.Fields.FindField(this.m_cboQryFld.SelectedItem.Value.ToString());5. System.Collections.ArrayList pArr = newSystem.Collections.ArrayList();6. while (pFeature != null)7. {8. string theFieldValue =pFeature.get_Value(pFieldIndex).ToString();9. if (!pArr.Contains(theFieldValue) &&(theFieldValue.Trim() != ""))10. {11. m_cboQryText.Items.Add(theFieldValue);12. pArr.Add(theFieldValue);13. }14. pFeature = pFeaCur.NextFeature();15. }30怎样编辑更改属性字段的值:1.IRow prow = (IRow)bendiFeatureC.GetFeature(1);2.MessageBox.Show(prow.Table.Fields.FieldCount.ToString());3.ITable ptable = (ITable)bendiFeatureC;4.IQueryFilter pqfilter = new QueryFilterClass();5.pqfilter.WhereClause = ""dkmc" = '北江路南郊一公里'";6.IFeatureCursor pfeatcur;7.pfeatcur = bendiFeatureC.Search(pqfilter, false);8.IFeature pfff = pfeatcur.NextFeature();9.while (pfff != null)10.{11. IRow prrr = (IRow)pfff;12. prrr.set_Value(prrr.Fields.FindField("dkmc"), "北江路南郊二公里");13. pfff = (IFeature)prrr;14. pfff.Store();15. pfff = pfeatcur.NextFeature();16.}31怎样将MapControl中的Map复制到PageLayoutControl中1.Public Sub CopyAndOverwriteMap()2. On Error GoTo CopyAndOverwriteMap_err3. Dim pObjectCopy As IObjectCopy4. pObjectCopy = New ObjectCopy5. Dim pToCopyMap As Object6. pToCopyMap = frmMap.AxMapControl1.Map7. Dim pCopiedMap As Object8. pCopiedMap = pObjectCopy.Copy(pToCopyMap)9. Dim pToOverwriteMap As Object10. pToOverwriteMap =PrintPageLayout.AxPageLayoutControl1.ActiveView.FocusMap11. pObjectCopy.Overwrite(pCopiedMap, pToOverwriteMap)12. frmMap.AxMapControl1.MousePointer13.=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerArrow14. frmMain.StatusMessage.Text = ""15. PrintPageLayout.ShowDialog()16. Exit Sub17. CopyAndOverwriteMap_err:18. MsgBox(Err.Number & " - " & Err.Description,MsgBoxStyle.Critical, Application.ProductName & "- Copy Map")19. Exit Sub20.End Sub32怎样判断是否出于编辑状态:1.If m_pEditor.EditState = esriStateEditing Then2. m_pEditor.StartOperation3. '删除冗余节点4. DelSubPoint pMap5. m_pEditor.StopOperation "OK"6.End If33。
怎样用点创建一个Polygon:1.Dim pPnt0 as IPoint, pPnt1 as IPoint, pPnt2 as IPoint2.Set pPnt0 = New Point3.Set pPnt1 = New Point4.Set pPnt2 = New Point5.pPnt0.PutCoords x1, y16.pPnt1.PutCoords x2, y27.pPnt2.PutCoords x3, y38.Dim pPolygon as IPointCollection(注意,这里的polygon是设置为点集的)9.Set pPolygon =New Polygon10.pPolygon.AddPoint pPnt011.pPolygon.AddPoint pPnt112.pPolygon.AddPoint pPnt213.pPolygon.AddPoint pPnt0(注意,这里一定要闭合回到pPnt0才能形成一个Polygon)14.Set pFeature.Shape = pPolygon15.pFeature.Store16.(用这种方法可以创建一个Polyline:17.Dim pPolyline as IPointCollection18.Set pPolyline =New Line19.pPolyline.AddPoint pPnt020.pPolyline.AddPoint pPnt121.pPolyline.AddPoint pPnt2(这时就是一个polyline,不是闭合的)22.还可以用另外一种方法,画一条两点之间的线段:23.Dim pLine As ILine24.Set pLine = New esriGeometry.Line25.pLine.PutCoords pPnt0, pPnt1(第一个为from点,第二个为to点)26.)34样运用属性来计算总面积:1.Dim pDoc As IMxDocument2.Dim pMap As IMap3.Dim pFeatureLayer As IFeatureLayer4.Dim pFeatureClass As IFeatureClass5.6.Set pDoc = m_pApplication.Document7.Set pMap = pDoc.ActiveView.FocusMap8.Set pFeatureLayer = yer(0)9.Set pFeatureClass = pFeatureLayer.FeatureClass10.11.' +++ create the query filter, and give12.' +++ it a where clause13.Dim pQueryFilt As IQueryFilter14.Dim pFeatureCursor As IFeatureCursor15.16.Set pQueryFilt = New QueryFilter17.pQueryFilt.WhereClause = "subtype = 'COM'"18.Set pFeatureCursor = pFeatureClass.Search(pQueryFilt, False)19.20.' +++ get the area field21.Dim pFields As IFields22.Dim pField As IField23.Dim lAIndex As Long24.25.Set pFields = pFeatureClass.FieldsIndex = pFields.FindField("Area")27.Set pField = pFields.Field(lAIndex)28.29.' +++ a variable to hold the total area30.Dim dtotArea As Double31.dtotArea = 0#32.33.' +++ loop through all of the features and34.' +++ calculate the sum of all of the areas35.Dim pFeature As IFeature36.Set pFeature = pFeatureCursor.NextFeature37.Do38.dtotArea = dtotArea + pFeature.Value(lAIndex)39.Set pFeature = pFeatureCursor.NextFeature40.Loop Until pFeature Is Nothing41.42.' +++ send the total area to a message box43.MsgBox dtotArea35关于属性域的一些心得1.Dim pField As IField2. Dim pFields As IFields3. Dim pFieldEdit As IFieldEdit4. Dim pFieldsEdit As IFieldsEdit5. Dim pGeometryDef As IGeometryDef6. Dim pGeometryDefEdit As IGeometryDefEdit7.8. Set pFields = New Fields9. Set pFieldsEdit = pFields10. pFieldsEdit.FieldCount = 3511.12. Set pField = New Field13. Set pFieldEdit = pField14. With pFieldEdit15. .Name = "OBJECTID"16. .AliasName = "OBJECTID"17. .Type = esriFieldTypeOID18. End With19. Set pFieldsEdit.Field(0) = pField20.21. Set pField = New Field22. Set pFieldEdit = pField23. = "SHAPE"24. pFieldEdit.Type = esriFieldTypeGeometry25.26. Set pGeometryDef = New GeometryDef27. Set pGeometryDefEdit = pGeometryDef28. With pGeometryDefEdit29. .GeometryType = esriGeometryPolygon30. Set .SpatialReference = New UnknownCoordinateSystem31. End With32. Set pFieldEdit.GeometryDef = pGeometryDef33. Set pFieldsEdit.Field(1) = pField复制代码个人觉得,在创建shp文件时,运用上面的方法就可以创建,但是当在GDB中创建featureclass的时候就会出现问题,有可能是空间参考的问题。