ArcEngine接口大全(带示例)

更新时间:2023-10-27 18:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1、抽象类,类,和组件对象类

抽象类是不能实例化的,抽象类中是一系列抽象的方法,故是不能实例化的,它只能被继承。不同的类可以继承同一个抽象类,但内部对同一方法的实现可能是不一样的。如AO中的接口都是抽象类。用户可以在类中实现这些接口,也就是继承这些接口。如用户可以在自己的类中实现ICommand接口,生成一个Command,或者实现ICommand、ITool接口,生成一个Tool.

类是不能直接实例化的,它只能作为另一个类的属性或者被其它类的对象实例化。如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、接口之间的相互查询

一个类可以实现多个接口,每一个接口可能包括一系列的属性和方法,但有时候一个接口里可能没有你想要的方法和属性,可能在这个类所实现接口的另一个接口里,这就涉及到从一个接口转到这个类所实现接口的另一个接口里,对于类所实现的一系列接口里,接口间是可以相互跳转的。如我想对一个feature的属性进行修改,给的就是这个feature的IFeature接口,我们知道对一个feature进行修改必须要把这个feature所在的featureclass的工作空间设为可编辑,且编辑结束后要结束编辑,这就要通过这个IFeatue接口来获得这个这个feature所在的IFeatureClass接口和IWorkspace接口,我们知道IFeatue接口里有一个object属性,这个属性返回的是IObjectClass,而FeatureClass这个类实现了IObjectClass和IFeatureClass这两个接口,这样就可以通过接口跳转从IObjectClass转换成IFeatureClass,这样就可以获得feature的IFeatureClass接口,其代码(c#)如下:

IObjectClass i_objcls=I_FtrCur.Class;

IFeatureClass i_ftrcls=(IFeatureClass)i_objcls;

Feature所在的FeatureClass的IFeatureClass接口有了,还要这个FeatureClass所在的工作空间的IWorkspace接口,获取这个接口可以通过两个方法

一、通过IFeatureClass接口里的FeatureDataset属性来获得IFeatureDataset接口。

IFeatureDataset接口里有一个Workspace属性返回IWorkspace接口,但这种方法有一个特别说明就是这个FeatureClass必须是一个FeatureDataset的成员,如果这个FeatureClass是一个独立,这个FeatureDataset返回的就是一个空值。所以这种方法对FeatureClass是一个FeatureDataset的成员时是适用的,独立时就不适用了。

二、通过接口转换。

FeatureClass实现了多个接口,其中有IDataset接口和IFeatureClass接口,我们已经有了IFeatureClass接口,就可以通过接口跳转来获得IDataset接口,在IDataset接口里有一个Workspace属性返回IWorkspace接口,这种方法对于FeatureClass是一个FeatureDataset的成员和FeatureClass是独立的这两种情况都是可以的。代码如下:

IDataset i_ftrDset=(IDataset)i_ftrcls //接口跳转

IFeatureWorkspace i_wks=(IFeatureWorkspace)i_ftrDset.Workspace

=============================================================================

个人感觉在OMD图中比较难理解的就是可实例化类CLASS。我做了以下例子去理解它: ArcEngine中 workSpace 就是一个可实例化类, WorkSpace不能用new创建,但可以通过WorkSpaceFarctory.Openfromfile()方法来创建.如下: IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactoryClass(); IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(ConnectionString, 0); 但当我们尝试用New去创建一个Workspace类时,如下: IWorkspace pWorkspace = new WorkspaceClass(); 就会出现以下错误:

“类型”ESRI.ArcGIS.Geodatabase.WorkspaceClass未定义构造函数;

所以,Class和CoClass的主要区别就是CoClass是带构造函数的Class.以此它可以用New直接创建对象

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 Then……

IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称) 例子代码:

1. Dim pFields As IFields 2. 3. 4. 5. 6. 7. 8. 9.

Dim pField As IField

Dim pGeoDef As IGeometryDef Dim pDomain As IDomain Dim i As Long

Set pFields = pFeatClass.Fields For i = 0 To pFields.FieldCount - 1 Set pField = pFields.Field(i)

If pField.Type = esriFieldTypeGeometry Then

10. Set pGeoDef = pField.GeometryDef 11. Else

12. Debug.Print pField.AliasName 13. Debug.Print pField.DefaultValue 14. Set pDomain = pField.Domain 15. Debug.Print pField.Editable

16. Debug.Print pField.IsNullable 17. Debug.Print pField.Length 18. Debug.Print pField.Name 19. Debug.Print pField.Precision 20. Debug.Print pField.Required 21. Debug.Print pField.Scale 22. Debug.Print pField.Type 23. Debug.Print pField.VarType 24. End If 25. Next

2. IFieldEdit接口(esriGeoDatabase)

所有该接口的属性均为可读可写,经常用与对新建字段的设置,因为字段一旦被设置,其基本属性就不能被更改,所以就需要该接口类型的变量去转换,方法为:

IFeatureClass pFC_SCP_PT;

IFieldEdit editPT = new FieldClass(); pFC_SCP_PT.AddField((IField)editPT);

如果在vb中去编写代码,则赋值和获取均为同一属性,而在C#中,为了区分设置和获取,属性均有两个,类似于Name和Name_2,这样就可以区分了,普遍用设置的带有_2的那个属性。

IFieldEdit接口的第一个属性Name (读写,设置或者获取该变量类型变量字段的名称) IFieldEdit接口的第二个属性Precision(读写,设置或者获取该变量类型变量字段的长度) IFieldEdit接口的第三个属性Scale(读写,设置或者获取该变量类型变量字段的精度) IFieldEdit接口的第四个属性Type(读写,设置或者获取该变量类型变量字段的类型) 例子代码:

1. IFeatureClass pFC_SCP_PT; 2. editPT = new FieldClass(); 3. editPT.Precision_2 = 8; 4. editPT.Scale_2 = 3;

5. editPT.Name_2 = \

6. editPT.Type_2 = esriFieldType.esriFieldTypeDouble; 3. IFields接口(esriGeoDatabase) IFields接口的第一个属性Field(Index) (只读,以用于获取具体的字段,返回类型为IField) IFields接口的第二个属性FieldCount(只读,以用于获取属性的数量)

利用上面两个接口并用索引去依次循环获得每一列的属性pField(Ifield接口) 例子代码: 1. 2. 3. 4. 5.

Dim i As Long

Dim pField As IField

For i = 0 To (pFields.FieldCount - 1) Set pField = pFields.Field(i)

Debug.Print pField.Name & \

6. Next i

IFields接口的第三个方法FindField(Name)(方法,输入想要查找的属性域字段的名称,如果有,则返回该属性域字段在此Fields的索引,没有则返回-1) 例子代码:

1. Dim i As Integer

2. Dim pFields As IFields 3. Dim pField As IField 4. 'Get Fields

5. Set pFields = pFeatClass.Fields

6. 'Find the field named \7. i = pFields.FindField(\8. 'Set the current field

9. Set pField = pFields.Field(i) 10. 'Delete field from featureclass 11. pFeatClass.DeleteField pField

IFields接口的第四个方法FindFieldByAliasName(Name)(方法,与第三个方法类似,此时输入的为该列属性字段的别名,此方法不经常用) 例子代码:

1. Dim i As Integer

2. Dim pFields As IFields 3. Dim pField As IField 4. 'Get Fields

5. Set pFields = pFeatClass.Fields

6. 'Find the field with the aliasname \7. i = pFields.FindFieldByAliasName(\8. 'Set the current field

9. Set pField = pFields.Field(i) 10. 'Delete field from featureclass 11. pFeatClass.DeleteField pField

4. 关于IPoint接口(esriGeometry)

IPoint接口的第一个方法PutCoords(X,Y)(方法,设置该点的坐标)或者直接调用可以读写的属性X和Y,将坐标赋值给X和Y 例子代码:

1. Dim pPoint As IPoint 2. Set pPoint = New Point 3. pPoint.PutCoords 100, 100

IPoint接口的第二个方法QueryCoords(X,Y) (方法,得到该点的坐标) 例子代码:

1. Dim pPoint as IPoint

2. Dim dX as Double, dY as Double 3. pPoint.QueryCoords dX, dY

IPoint接口的第三个方法ConstrainAngle (constraintAngle, anchor, allowOpposite ) (方法,如果第三个参数allowOpposite为True,则将第二个参数anchor这个点作为一个原点,然后以第一个参

数constraintAngle为与x轴的角度,做一条直线,再将调用此参数的点向该直线做垂线并交于一个新点,并将调用此方法的点移动到该点)

4. 关于IPoint接口(esriGeometry)

IPoint接口的第一个方法PutCoords(X,Y)(方法,设置该点的坐标)或者直接调用可以读写的属性X和Y,将坐标赋值给X和Y 例子代码:

1. Dim pPoint As IPoint 2. Set pPoint = New Point 3. pPoint.PutCoords 100, 100

IPoint接口的第二个方法QueryCoords(X,Y) (方法,得到该点的坐标) 例子代码:

1. Dim pPoint as IPoint

2. Dim dX as Double, dY as Double 3. pPoint.QueryCoords dX, dY

IPoint接口的第三个方法ConstrainAngle (constraintAngle, anchor, allowOpposite ) (方法,如果第三个参数allowOpposite为True,则将第二个参数anchor这个点作为一个原点,然后以第一个参数constraintAngle为与x轴的角度,做一条直线,再将调用此参数的点向该直线做垂线并交于一个新点,并将调用此方法的点移动到该点)

例子代码:

1. 'Finds the closes point to line from (0,0) with angles 2. 'defined by steps of pi/4 (Note all angles in radians) 3. Dim pApoint As IPoint 4. Dim pNpoint As IPoint 5. Dim pi As Double 6. Dim dAngle As Double 7. Dim i As Long 8.

9. Set pApoint = New Point 10. pi = 4 * Atn(1) 11. dAngle = 0

12. pApoint.PutCoords 0, 0 13.

14. Set pNpoint = New Point 15.

16. For i = 0 To 7

17. pNpoint.PutCoords 1, 0 18. dAngle = i * pi / 4

19. pNpoint.ConstrainAngle dAngle, pApoint, True

20. MsgBox \21. Next i

IPoint接口的第四个方法ConstrainDistance (constraintRadius, anchor ) (方法,以第二个参数anchor这个点为圆心,然后以第一个参数constraintRadius为半径做一个圆,将调用此参数的点移动到该点与圆心做线段交于该圆的交点上)

例子代码:

1. Public Sub t_constraindistance() 2. Dim pPoint As IPoint 3. Dim pNPoint As IPoint 4. Dim dRadius As Double 5.

6. Set pPoint = New Point 7. pPoint.PutCoords 0, 0 8. Set pNPoint = New Point 9. pNPoint.PutCoords 2, 2 10. dRadius = 1.4142135623731

11. pNPoint.ConstrainDistance dRadius, pPoint

1. MsgBox \2. End Sub

5. 关于IPointArray接口(esriGeometry)

IPointArray接口的第一个方法Add(p)(方 法,向该类型的数组变量添加Point) IPointArray接口的第二个属性Count (只读,获得该数组变量中Point的个数,返回Long类型变量)

IPointArray接口的第三个属性

Element(Index) (只读,获得该数组变量中位于参数Index索引位置的点Point,返回一个Point类型的变量)

IPointArray接口的第四个方法Insert (Index, p ) (方法,向索引位置Index插入一个点Point)

IPointArray接口的第五个方法Remove (Index ) (方法,移除索引位置Index的点Point)

IPointArray接口的第六个方法

RemoveAll (方法,移除所有在此数组中的点)

6. 关于IPointCollection接口(esriGeometry) IPointCollection接口的第一个方法AddPoint(inPoint

[,before] [,after]) (方法,向该类型的点集变量添加Point,第一个参数为添加的Point,第二个第三个参数为可选择的参

数,默认添加进点集的末尾)

IPointCollection接口的第二个属性Point(i) (只读,获得该点集变量中第i个位置的Point,返回IPoint类型变量,i从0计算开始)

IPointCollection接口的第三个属性PointCount (只读,获得该点集变量中点的个数,返回Long类型变量,切记,如果一个PointCollection变量是由闭合的Geometry转换而来的话,那么点的个数比节点数多一个,因为是闭合的,所以首位节点是同一个点)

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 UID 3. pID = \4. Dim pEditor As IEditor 5. Dim pApp As IApplication 6. Set pApp = MxApplication

7. Set pEditor = pApp.FindExtensionByCLSID(pID) 8.

9. If pEditor.SelectionCount <> 1 Then 10. MsgBox \11. Exit Sub 12. End If 13.

14. Dim pEnumFeat As IEnumFeature 15. Dim pFeature As IFeature 16.

17. Set pEnumFeat = pEditor.EditSelection 18.

19. Dim pCurve As ICurve 20. Dim pPointFrom As IPoint 21. Dim pPointTo As IPoint 22.

23. Set pPointFrom = New Point 24. Set pPointTo = New Point 25.

26. Set pFeature = pEnumFeat.Next 27.

28. While Not pFeature Is Nothing

29. If pFeature.Shape.GeometryType = esriGeometryPolyline Or _

30. esriGeometryPolyline Or esriGeometryLine Then 31. Set pCurve = pFeature.Shape 32. pCurve.QueryFromPoint pPointFrom 33. pCurve.QueryToPoint pPointTo

34. MsgBox \

35. & \

vbCrLf _

36. & \37. End If

38. Set pFeature = pEnumFeat.Next

39. WendIPolyline接口的第四个方法Generalize (maxAllowableOffset ) (方法,用道格拉斯

普克发来简化polyline)

IPolyline接口的第五个方法Weed (maxAllowableOffsetFactor ) (方法,和方法Generalize类似,均为简化polyline的方法,不同的是参数。)

8. 关于IGeometry接口(esriGeometry) 1. Public Sub t_IGeometry_polygon() 2. Dim pID As New UID 3. pID = \4. Dim pEditor As IEditor 5. Dim pApp As IApplication 6. Set pApp = Application

7. Set pEditor = pApp.FindExtensionByCLSID(pID) 8.

9. If pEditor.SelectionCount <> 1 Then 10. MsgBox \11. Exit Sub 12. End If 13.

14. Dim pEnumFeat As IEnumFeature 15. Dim pFeature As IFeature 16.

17. Set pEnumFeat = pEditor.EditSelection 18.

19. Dim pGeometry As IGeometry 20.

21. Set pFeature = pEnumFeat.Next 22.

23. While Not pFeature Is Nothing

24. If pFeature.Shape.GeometryType = esriGeometryPolygon Then 25. (通过pFeature.Shape获得Geometry) 26. Set pGeometry = pFeature.Shape

27. MsgBox \

28. & \

29. & \

30. & \

& \

31. & pGeometry.Envelope.XMax & \32. & \

33. & \34. End If

35. Set pFeature = pEnumFeat.Next 36. Wend 37. End Sub

IGeometry接口的第一个属性Dimension(只读,返回一个类型为esriGeometryDimension的该图形的几何维度)

-1 esriGeometryNoDimension 1 esriGeometry0Dimension 2 esriGeometry1Dimension 4 esriGeometry2Dimension 5 esriGeometry25Dimension 6 esriGeometry3Dimension

IGeometry接口的第二个属性Extent(只读,返回一个类型为IEnvelope的该图形的几何范围的最大边框)

IGeometry接口的第三个属性GeometryType(只读,返回一个类型为esriGeometryType的该图形的几何类型)

esriGeometryNull = 0 esriGeometryPoint = 1 esriGeometryMultipoint = 2 esriGeometryPolyline = 3 esriGeometryPolygon = 4 esriGeometryEnvelope = 5 esriGeometryPath = 6 esriGeometryAny = 7 esriGeometryMultiPatch = 9 esriGeometryRing = 11 esriGeometryLine = 13 esriGeometryCircularArc = 14 esriGeometryBezier3Curve = 15 esriGeometryEllipticArc = 16 esriGeometryBag = 17 esriGeometryTriangleStrip = 18 esriGeometryTriangleFan = 19 esriGeometryRay = 20 esriGeometrySphere = 21

复制代码

(注意,这个pfeature是在前面定义的pfeature=pFeatureCursor.NextFeature,不用重新定义一个)

======================================================== 怎样在buffer里面选择要素:

======================================================== 1. 2. 3. 4. 5. 6. 7. 8. 9.

Dim pSpFilter As ISpatialFilter Set pSpFilter = New SpatialFilter

Dim pTopOper As ITopologicalOperator Set pTopOper = pfeature.Shape Dim pGeometry As IGeometry

Set pGeometry = pTopOper.Buffer(1) Set pSpFilter.Geometry = pGeometry

pSpFilter.SpatialRel = esriSpatialRelContains ('esriSpatialRelContains是ISpatialFilter里面SpatialRel的一种参数esriSpatialRelEnum,值为8,代表在这个区域内包含的要素)

10.

11. Set m_pSelGW_D = pLyr_D

12. m_pSelGW_D.SelectFeatures pSpFilter, esriSelectionResultNew, False 13. '(m_pSelGW_D是IfeatureSelection类型的变量) 14. pSpFilter.SpatialRel = esriSpatialRelIntersects 1. Set m_pSelGW_X = pLyr

2. m_pSelGW_X.SelectFeatures pSpFilter, esriSelectionResultNew, False 26. Merge要素Union要素

1. Private Sub UnionSelected() 2. Dim pMxDoc As IMxDocument 3. Dim pFtrLyr As IFeatureLayer 4. Dim pFtrCls As IFeatureClass 5. Dim pFtrSel As IFeatureSelection 6. Dim pFtr As IFeature

7. Dim pEnumGeom As IEnumGeometry

8. Dim pEnumGeomBind As IEnumGeometryBind 9. Dim pTopOp As ITopologicalOperator 10. Dim pUnionedPolylines As IPolyline

11. ' Get a ref to the selected polylines in the 1st layer 12. Set pMxDoc = ThisDocument

13. Set pFtrLyr = pMxDoc.FocusMap.Layer(0) 14. Set pFtrSel = pFtrLyr

15. Set pFtrCls = pFtrLyr.FeatureClass

16. ' Create an enumeration of the selected polyines 17. Set pEnumGeom = New EnumFeatureGeometry 18. Set pEnumGeomBind = pEnumGeom

19. pEnumGeomBind.BindGeometrySource Nothing, pFtrSel.SelectionSet 20. pEnumGeom.Reset 21.

22. ' Union the polylines

23. Set pUnionedPolylines = New Polyline 24. Set pTopOp = pUnionedPolylines 25. pTopOp.ConstructUnion pEnumGeom 26.

27. ' Add this new unioned polyline to the featureclass 28. Set pFtr = pFtrCls.CreateFeature 29. Set pFtr.Shape = pUnionedPolylines 30. pFtr.Store 31. End Sub

27.怎样从Table中获取具体需求值的Row:

1. ITable pTable = (ITable)pFC;

2. int index = pTable.Fields.FindField(\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 == \13. {

14. pAnswerRow = pRow; 15. break; 16. }

17. pRow = pCur.NextRow(); 18. }

28.怎样ZoomInCenter:

1. Public Sub ZoomInCenter()

2. Dim pMxDocument As IMxDocument 3. Dim pActiveView As IActiveView

4. Dim pDisplayTransform As IDisplayTransformation 5. Dim pEnvelope As IEnvelope 6. Dim pCenterPoint As IPoint

7. Set pMxDocument = Application.Document 8. Set pActiveView = pMxDocument.FocusMap

9. Set pDisplayTransform = pActiveView.ScreenDisplay.DisplayTransformation 10. Set pEnvelope = pDisplayTransform.VisibleBounds

11. 'In this case, we could have set pEnvelope to IActiveView::Extent 12. 'Set pEnvelope = pActiveView.Extent 13. Set pCenterPoint = New Point 14.

15. pCenterPoint.x = ((pEnvelope.XMax - pEnvelope.XMin) / 2) + pEnvelope.XMin 16. pCenterPoint.y = ((pEnvelope.YMax - pEnvelope.YMin) / 2) + pEnvelope.YMin 17. pEnvelope.width = pEnvelope.width / 2 18. pEnvelope.height = pEnvelope.height / 2 19. pEnvelope.CenterAt pCenterPoint

20. pDisplayTransform.VisibleBounds = pEnvelope 21. pActiveView.Refresh 22. End Sub

29.怎样读取一个字段内的所有值:

IFeatureClass pFC = m_SDEQuery.getFeatureClass(); IFeatureCursor pFeaCur = pFC.Search(null, false); IFeature pFeature = pFeaCur.NextFeature(); int pFieldIndex =

pFC.Fields.FindField(this.m_cboQryFld.SelectedItem.Value.ToString());

5. System.Collections.ArrayList pArr = new System.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. 2. 3. 4. 5.

IRow prow = (IRow)bendiFeatureC.GetFeature(1);

MessageBox.Show(prow.Table.Fields.FieldCount.ToString()); ITable ptable = (ITable)bendiFeatureC;

IQueryFilter pqfilter = new QueryFilterClass();

pqfilter.WhereClause = \北江路南郊一公里\\'\1. 2. 3. 4.

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(\北江路南郊二公里\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_err 3. Dim pObjectCopy As IObjectCopy 4. pObjectCopy = New ObjectCopy 5. Dim pToCopyMap As Object

6. pToCopyMap = frmMap.AxMapControl1.Map 7. Dim pCopiedMap As Object

8. pCopiedMap = pObjectCopy.Copy(pToCopyMap) 9. Dim pToOverwriteMap As Object

10. pToOverwriteMap = PrintPageLayout.AxPageLayoutControl1.ActiveView.FocusMap 11. pObjectCopy.Overwrite(pCopiedMap, pToOverwriteMap) 12. frmMap.AxMapControl1.MousePointer

13. =ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerArrow 14. frmMain.StatusMessage.Text = \15. PrintPageLayout.ShowDialog() 16. Exit Sub

17. CopyAndOverwriteMap_err:

18. MsgBox(Err.Number & \

Application.ProductName & \19. Exit Sub 20. End Sub

32怎样判断是否出于编辑状态:

1. If m_pEditor.EditState = esriStateEditing Then 2. m_pEditor.StartOperation 3. '删除冗余节点

4. DelSubPoint pMap

5. m_pEditor.StopOperation \6. End If

33。怎样用点创建一个Polygon: 1. 2. 3. 4. 5. 6.

Dim pPnt0 as IPoint, pPnt1 as IPoint, pPnt2 as IPoint Set pPnt0 = New Point Set pPnt1 = New Point Set pPnt2 = New Point pPnt0.PutCoords x1, y1 pPnt1.PutCoords x2, y2

7. pPnt2.PutCoords x3, y3

8. Dim pPolygon as IPointCollection(注意,这里的polygon是设置为点集的) 9. Set pPolygon =New Polygon 10. pPolygon.AddPoint pPnt0

11. pPolygon.AddPoint pPnt1 12. pPolygon.AddPoint pPnt2

13. pPolygon.AddPoint pPnt0(注意,这里一定要闭合回到pPnt0才能形成一个Polygon) 14. Set pFeature.Shape = pPolygon 15. pFeature.Store

16. (用这种方法可以创建一个Polyline:

17. Dim pPolyline as IPointCollection 18. Set pPolyline =New Line 19. pPolyline.AddPoint pPnt0 20. pPolyline.AddPoint pPnt1

21. pPolyline.AddPoint pPnt2(这时就是一个polyline,不是闭合的) 22. 还可以用另外一种方法,画一条两点之间的线段:

23. Dim pLine As ILine

24. Set pLine = New esriGeometry.Line

25. pLine.PutCoords pPnt0, pPnt1(第一个为from点,第二个为to点) 26. )

34样运用属性来计算总面积:

1. Dim pDoc As IMxDocument 2. Dim pMap As IMap

3. Dim pFeatureLayer As IFeatureLayer 4. Dim pFeatureClass As IFeatureClass 5.

6. Set pDoc = m_pApplication.Document 7. Set pMap = pDoc.ActiveView.FocusMap 8. Set pFeatureLayer = pMap.Layer(0)

9. Set pFeatureClass = pFeatureLayer.FeatureClass 10.

11. ' +++ create the query filter, and give 12. ' +++ it a where clause

13. Dim pQueryFilt As IQueryFilter

14. Dim pFeatureCursor As IFeatureCursor 15.

16. Set pQueryFilt = New QueryFilter

17. pQueryFilt.WhereClause = \

18. Set pFeatureCursor = pFeatureClass.Search(pQueryFilt, False) 19.

20. ' +++ get the area field 21. Dim pFields As IFields 22. Dim pField As IField 23. Dim lAIndex As Long 24.

25. Set pFields = pFeatureClass.Fields 26. lAIndex = pFields.FindField(\27. Set pField = pFields.Field(lAIndex)

图形元素(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接口也提供了用于查找和绘制元素的方法。Element是个抽象类,在开发中必须明确指定使用的Element的类型。另外IElement和ILineElement, ITextElement等并不是父子关系,后者没有Geometry属性。 53.MapGrid对象

MapGrid是布局视图中的一系列参考线和参考点用来帮助地图使用者快速地确定地图要素的位置如图7中的公里格网,MapGridBorder,MapGridLabel。MapGrid等。MapGrid对象由MapGrids来管理,一个MapGrids可以包含多个MapGrid对象

MapGrid是一个抽象类,它的子类有MeasuredGrid,IndexGrid,MgrsGrid,Graticule和CustomOverlayGrid五种,这些子类的对象由MapGridFactory对象创建。MapGride对象模型图如图所示

54.MapSurround对象

MapSurround对象是与一个地图对象关联的用于修饰地图的辅助图形元素对象如图所示。它的形状或内容会随着Map属性的变化而自动改变。如Map视图范围改变后比例尺(ScaleBar)也会自动调整比例,比例尺文本(ScaleBarText)也会相应改变它的比例值。

MapSurround对象由MapSurroundFrame 对象管理,所有的MapSurround对象添加在布局视图上,每一个MapSurround对象可以通过IMap接口的MapSurrounds属性的索引值所获取。也可以通过IMap接口的MapSurroundCount来遍历布局视图上的所有MapSurround对象。

所有的MapSurround对象都实现IMapSurround接口,使用IMapSurround接口的Name属性可以获得MapSurround对象的名称,通过IMapSurround的FitToBound方法可以设置一个MapSurround对象的大小。

同时MapSurround类也实现了IMapSurroundEvents接口,可以用来触发MapSounrround相关事件如:AfterDraw,BeforeDraw,ContensChanged。 下图是MapSurround对象模型

本文来源:https://www.bwwdw.com/article/s6l2.html

Top