http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcObjects开发 >> 正文

ArcGIS接口详细说明之个人开发心得

作者:万人迷先…    文章来源:万人迷先生    点击数:    更新时间:2010-4-7
摘要:ArcGIS接口详细说明之个人开发心得
1.        关于IField接口(esriGeoDatabase)
IField接口的第一个属性AliasName(只读,获得字段的别名)
IField接口的第二个方法CheckValue(Value)(方法,对于指定的属性字段,基于字段类型判断参数值是否有效,有效,则返回True,否则返回False)
例子代码:
  1. 'Get Field
  2. Set pField = pFields.Field(6)   
  3. bChkField = pField.CheckValue(45.86)   
  4. If bChkField = True Then
  5. 'Add data to selected rows for the field selected.
  6. End If
IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称)
例子代码:
  1. Dim pFields As IFields
  2. Dim pField As IField
  3. Dim pGeoDef As IGeometryDef
  4. Dim pDomain As IDomain
  5. Dim i As Long
  6. Set pFields = pFeatClass.Fields
  7. For i = 0 To pFields.FieldCount - 1
  8.   Set pField = pFields.Field(i)
  9.   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 = "ELEV1";
  6. editPT.Type_2 = esriFieldType.esriFieldTypeDouble;

3.        关于IFields接口(esriGeoDatabase)
IFields接口的第一个属性Field(Index) (只读,以用于获取具体的字段,返回类型为IField)
IFields接口的第二个属性FieldCount(只读,以用于获取属性的数量)
利用上面两个接口并用索引去依次循环获得每一列的属性pField(Ifield接口)
例子代码:

  1. Dim i As Long
  2. Dim pField As IField
  3. For i = 0 To (pFields.FieldCount - 1)
  4.     Set pField = pFields.Field(i)
  5.     Debug.Print pField.Name & ": " & pField.Type
  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 "average_income"
  7. i = pFields.FindField("average_income")
  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 "current population"
  7. i = pFields.FindFieldByAliasName("current population")
  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轴的角度,做一条直线,再将调用此参数的点向该直线做垂线并交于一个新点,并将调用此方法的点移动到该点)

例子代码:

  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 "angle = " & i & "*pi/4" & vbCrLf & pNpoint.X & "," & pNpoint.Y
  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.    
  12.    pNPoint.ConstrainDistance dRadius, pPoint
  13.    MsgBox "Radius = " & dRadius & " x,y = " & pNPoint.X & "," & pNPoint.Y
  14. 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接口的第一个属性FromPointToPoint(读写,设置或者读取该点的起始点和终止点,返回都是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 = "esriEditor.editor"
  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 "select one Curve"
  11.      Exit Sub
  12.    End If
  13.    
  14.    Dim pEnumFeat As IEnumFeature
  15.    Dim pFeature As IFeature

  16.    Set pEnumFeat = pEditor.EditSelection

  17.    Dim pCurve As ICurve
  18.    Dim pPointFrom As IPoint
  19.    Dim pPointTo As IPoint
  20.    
  21.    Set pPointFrom = New Point
  22.    Set pPointTo = New Point

  23.    Set pFeature = pEnumFeat.Next

  24.    While Not pFeature Is Nothing
  25.      If pFeature.Shape.GeometryType = esriGeometryPolyline Or _
  26.      esriGeometryPolyline Or esriGeometryLine Then
  27.        Set pCurve = pFeature.Shape
  28.        pCurve.QueryFromPoint pPointFrom
  29.        pCurve.QueryToPoint pPointTo
  30.        MsgBox "+++ICurve properties..." & vbCrLf _
  31.          & "Curve.QueryFromPoint (x,y) = " & pPointFrom.X & "," & pPointFrom.Y & vbCrLf _
  32.          & "Curve.QueryToPoint (x,y) = " & pPointTo.X & "," & pPointTo.Y & vbCrLf
  33.      End If
  34.      Set pFeature = pEnumFeat.Next
  35.    Wend
  36. End Sub

IPolyline接口的第四个方法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 = "esriEditor.editor"
  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 "select one polygon"
  11.      Exit Sub
  12.    End If
  13.    
  14.    Dim pEnumFeat As IEnumFeature
  15.    Dim pFeature As IFeature

  16.    Set pEnumFeat = pEditor.EditSelection

  17.    Dim pGeometry As IGeometry

  18.    Set pFeature = pEnumFeat.Next

  19.    While Not pFeature Is Nothing
  20.      If pFeature.Shape.GeometryType = esriGeometryPolygon Then
  21. (通过pFeature.Shape获得Geometry)
  22.        Set pGeometry = pFeature.Shape
  23.        MsgBox "+++Polygon::IGeometry properties..." & vbCrLf _
  24.          & "Dimension = " & pGeometry.Dimension & vbCrLf _
  25.          & "Geometry type = " & pGeometry.GeometryType & vbCrLf _
  26.          & "Envelope =  " & pGeometry.Envelope.XMin & "," & pGeometry.Envelope.YMin & "," _
  27.          & pGeometry.Envelope.XMax & "," & pGeometry.Envelope.YMin & vbCrLf _
  28.          & "IsEmpty =  " & pGeometry.IsEmpty & vbCrLf _
  29.          & "SpatialReference = " & pGeometry.SpatialReference.Name
  30.      End If
  31.      Set pFeature = pEnumFeat.Next
  32.    Wend
  33. 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

9.        关于IArea接口(esriGeometry)

  1. Public Sub t_IArea_polygon()
  2.    Dim pID As New UID
  3.    pID = "esriEditor.editor"
  4.    Dim pEditor As IEditor
  5.    Dim pApp As IApplication
  6.    Set pApp = Application
  7.    Set pEditor = pApp.FindExtensionByCLSID(pID)
  8.    If pEditor.SelectionCount <>  1 Then
  9.      MsgBox "select one polygon"
  10.      Exit Sub
  11.    End If
  12.    
  13.    Dim pEnumFeat As IEnumFeature
  14.    Dim pFeature As IFeature
  15.    Dim i As Long

  16.    Set pEnumFeat = pEditor.EditSelection

  17.    Dim pArea As IArea
  18.    Dim pCenter As IPoint
  19.    Dim pLabel As IPoint
  20.    Set pCenter = New Point
  21.    Set pLabel = New Point

  22.    Set pFeature = pEnumFeat.Next

  23.    While Not pFeature Is Nothing
  24.      If pFeature.Shape.GeometryType = esriGeometryPolygon Then
  25.        Set pArea = pFeature.Shape
  26.        MsgBox "+++Polygon::IArea properties..." & vbCrLf _
  27.        & "Area = " & pArea.Area & vbCrLf _
  28.        & "Center.X = " & pArea.Centroid.X & vbCrLf _
  29.        & "Center.Y = " & pArea.Centroid.Y & vbCrLf _
  30.        & pArea.LabelPoint.X & vbCrLf _
  31.        & "LabelPoint.Y = " & pArea.LabelPoint.Y

  32.        pArea.QueryCentroid pCenter
  33.        pArea.QueryLabelPoint pLabel
  34.        MsgBox "+++Polygon::IArea Queries..." & vbCrLf _
  35.        & "Center = " & pCenter.X & "," & pCenter.Y & vbCrLf _
  36.        & "Label = " & pLabel.X & "," & pLabel.Y & vbCrLf
  37.      End If
  38.      Set pFeature = pEnumFeat.Next
  39.    Wend
  40. End Sub
复制代码

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)
应用:(中心放大)

  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
复制代码

IEnvelope接口的第一个方法CenterAt(pPoint) (方法,将这个矩形的边框移动到参数pPoint的位置,但是其他属性不变,如它的Width和Height)
例子代码:

  1. ' The example shows how to move an Envelope to a new
  2. ' center point (pPoint).
  3. Public Sub t_EnvCenterAt()
  4.   Dim pEnv1 As IEnvelope
  5.   Dim pPoint As IPoint

  6.   Set pEnv1 = New Envelope
  7.   Set pPoint = New Point

  8.   pEnv1.PutCoords 100, 100, 200, 200
  9.   pPoint.PutCoords 0, 0

  10.   pEnv1.CenterAt pPoint

  11.   Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double
  12.   pEnv1.QueryCoords dXmin, dYmin, dXmax, dYmax

  13.   If pEnv1.IsEmpty Then
  14.     MsgBox "envelope is empty"
  15.   Else
  16.     MsgBox dXmin & "," & dYmin & "," & dXmax & "," &  dYmax
  17.   End If
  18. End Sub
复制代码

IEnvelope接口的长宽属性HeightWidth属性(读写,可以通过该属性获取或设置该边框的长和宽)
IEnvelope接口的4个顶点属性UpperLeft、UpperRight、LowerLeftLowerRight(读写,返回IPoint类型的四个顶点,比直接获得最值坐标更加方便严谨)
例子代码:

  1. Private Sub Form_Load()
  2.    Set m_pEnveLope = New Envelope
  3.    Set m_pCPoint = New Point
  4.    m_pEnveLope.XMin = 0
  5.    m_pEnveLope.YMin = 0
  6.    m_pEnveLope.XMax = 0
  7.    m_pEnveLope.YMax = 0
  8.    m_pCPoint.X = 0
  9.    m_pCPoint.Y = 0
  10.    Set m_pLowerLeft = New Point
  11.    Set m_pLowerRight = New Point
  12.    Set m_pUpperLeft = New Point
  13.    Set m_pUpperRight = New Point
  14.    update_props
  15. End Sub

  16. Private Sub update_props()
  17.    Set m_pLowerLeft = m_pEnveLope.LowerLeft
  18.    edtLlx.Text = m_pLowerLeft.X
  19.    edtLly.Text = m_pLowerLeft.Y
  20.    Set m_pLowerRight = m_pEnveLope.LowerRight
  21.    edtLrx.Text = m_pLowerRight.X
  22.    edtLry.Text = m_pLowerRight.Y
  23.    Set m_pUpperLeft = m_pEnveLope.UpperLeft
  24.    edtUlx.Text = m_pUpperLeft.X
  25.    edtUly.Text = m_pUpperLeft.Y
  26.    Set m_pUpperRight = m_pEnveLope.UpperRight
  27.    edtUrx.Text = m_pUpperRight.X
  28.    edtUry.Text = m_pUpperRight.Y
  29. End Sub
复制代码

IEnvelope接口的最值坐标属性XMax、XMin、YMaxYMin(读写,可以通过该属性获取或设置该边框的四个顶点的坐标)
IEnvelope接口的第五个方法Union (inEnvelope ) (方法,将参数输入的几何边框和调用该方法的几何边框求并集,并将结果赋值给第一个边框,即调用此方法的object)
例子代码:

  1. Public Sub t_EnvUnion()
  2.    Dim pEnv1 As IEnvelope
  3.    Dim pEnv2 As IEnvelope
  4.    
  5.    Set pEnv1 = New Envelope
  6.    Set pEnv2 = New Envelope
  7.    
  8.    pEnv1.PutCoords 100, 100, 200, 200
  9.    pEnv2.PutCoords 150, 150, 250, 250
  10.    
  11.    pEnv1.Union pEnv2
  12.    
  13.    Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double
  14.    pEnv1.QueryCoords dXmin, dYmin, dXmax, dYmax
  15. End Sub
复制代码

IEnvelope接口的第六个方法Union (inEnvelope ) (方法,返回与输入参数相交的区域的几何边框,并将结果赋值给第一个边框,即调用此方法的object)
例子代码:

  1. ' The example shows how to intersect 2 envelopes. The result is put in
  2. ' the first envelope.
  3. Public Sub t_EnvIntersect()
  4.    Dim pEnv1 As IEnvelope
  5.    Dim pEnv2 As IEnvelope
  6.    
  7.    Set pEnv1 = New Envelope
  8.    Set pEnv2 = New Envelope
  9.    
  10.    pEnv1.PutCoords 100, 100, 200, 200
  11.    pEnv2.PutCoords 150, 150, 250, 250
  12.    
  13.    pEnv1.Intersect pEnv2
  14.    
  15.    Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double
  16.    pEnv1.QueryCoords dXmin, dYmin, dXmax, dYmax

  17.    If pEnv1.IsEmpty Then
  18.      MsgBox "envelope is empty"
  19.    Else
  20.      MsgBox dXmin & "," & dYmin & "," & dXmax & "," & dYmax
  21.    End If
  22. End Sub
复制代码

IEnvelope接口的第七个方法PutCoords (XMin, YMin,XMax,YMax) (方法,将新建的一个边框的4个极坐标设置为输入的参数)
例子代码:

  1. Public Function CreateEnvXY(dblXMin As Double, dblYMin As Double, _
  2.                             dblXMax As Double, dblYMax As Double) As IEnvelope
  3.    Set CreateEnvXY = New esriGeometry.Envelope
  4.    CreateEnvXY.PutCoords dblXMin, dblYMin, dblXMax, dblYMax
  5. End Function
复制代码

IEnvelope接口的第八个方法QueryCoords (XMin, YMin,XMax,YMax)(方法,将已有的一个边框的4个极坐标输出到参数当中以备后用)
IEnvelope接口的第九个方法Expand (dx, dy, asRatio) (方法,按照输入的dx与dy参数来放大或者缩小当前的边框,用与对ArcMap窗体的中心放大或缩小,或者点击屏幕获得点击点的坐标,并将中心点设置成点击点,并进行一定比例的放大或者缩小)
例子代码:

  1. Public Sub t_EnvExpand()
  2.    Dim pEnv1 As IEnvelope
  3.    Set pEnv1 = New Envelope
  4.    pEnv1.PutCoords 100, 100, 200, 200
  5.    
  6.    pEnv1.Expand 0.5, 0.5, True
  7.    
  8.    Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double
  9.    pEnv1.QueryCoords dXmin, dYmin, dXmax, dYmax
  10.    
  11.    If pEnv1.IsEmpty Then
  12.      MsgBox "envelope is empty"
  13.    Else
  14.      MsgBox dXmin & "," & dYmin & "," & dXmax & "," & dYmax
  15.    End If
  16. End Sub
复制代码

注意!!!一般情况设置为True,来控制倍数的放大

  1. Expand scales the size of the Envelope.  If asRatio = FALSE, the expansion is additive.
  2. XMin = XMin - dx
  3. YMin = YMin - dy
  4. XMax = XMax + dx
  5. YMax = YMax + dy
  6. If asRatio = TRUE, the expansion is multiplicative.
  7. XMin = (XMin - dx*Width)/2
  8. YMin = (YMin - dy*Height)/2
  9. XMax = (XMax + dx*Width)/2
  10. YMax = (YMax + dy*Height)/2
  11. The Envelope remains centered at the same position.
复制代码

IEnvelope接口的第十个方法Offset (X, Y) (方法,将已有的一个边框的按照输入参数的大小来进行水平竖直的移动)
例子代码:

  1. Private Sub btnOffset_Click()
  2.   m_pEnveLope.Offset 10, 20
  3.   update_props
  4. End Sub
  5. 注意!!!
  6. The new position of the Envelope is as follows:
  7. new XMin= old XMin + X
  8. new YMin = old YMin + Y
  9. new XMax = old XMax + X
  10. new YMax = old YMax + Y
复制代码
 
11.        关于IFeature接口(esriGeoDatabase)
IFeature接口的第一个属性Class(只读)
IFeature接口的第二个方法Delete(方法,删除该行。因为一个Feature在表格中对应的就是一行数据,删除该行就能相应的删除这个Feature)
IFeature接口的第三个属性Extent(只读,获取该Feature要素在地图上的一个矩形范围,返回值为IEnvelope类型)
IFeature接口的第四个属性FeatureType(只读,获取该Feature要素的要素类型,返回值为枚举类型的esriFeatureType)
IFeature接口的第五个属性Fields(只读,获取该Feature要素的字段集合,返回值为IFields类型)
IFeature接口的第六个属性Shape(读写,获取该Feature要素的图形,返回值为IGeometry类型,或者各种实体化的类型,如IPolyline)
IFeature接口的第七个属性ShapeCopy(只读,克隆该Feature要素的几何图形,返回值为IGeometry类型)
IFeature 接口的第八个方法Store(方法,保存该行。)
此属性可用于对Feature要素的几何图形进行操作,步骤如下:
用IFeature.ShapeCopy方法获取一个已经存在的Geometry,或者新建一个Geometry
对Geometry进行操作
通过IFeature.Shape属性将Geometry写入
通过IFeature.Store方法保存该Feature要素
例子代码:
  1. Dim pFeature As IFeature
  2. Dim pGeo As IGeometry
  3. Set pGeo = pFeature.ShapeCopy
  4. 'Change the shape
  5. pFeature.Shape = pGeo
  6. pFeature.Store
复制代码
IFeature接口的第九个属性Value(读写,利用字段的索引进行对该要素该字段的值的读写)
注意,索引Index是从0开始的。
object.Value(Index ) = [ value ]
IFeature 接口的第十个属性Table(只读,将该行要素转换成ITable格式的数据,即可对一张表进行数据操作,具体方法查看ITable接口)
例子代码:
  1. Dim pTable As ITable
  2. Set pTable = pRow.Table
复制代码
 
12.        关于IRow接口(esriGeoDatabase)
IRow接口的第一个方法Delete(方法,删除该行)
IRow接口的第二个属性Fields(只读,获取该Feature要素的字段集合,返回值为IFields类型)此方法类似于IFeature接口的Fields属性
IRow 接口的第三个方法Store(方法,保存该行。)此方法类似于IFeature接口的Store方法
IRow接口的第四个属性Table(只读,获取该行所在的表格,返回值为ITable类型)
例子代码:
  1. Dim pTable As ITable
  2. Set pTable = pRow.Table
复制代码
IRow接口的第五个属性Value(Index) (读写,获取该行在参数索引的字段的值,注意,索引Index是从0开始的。)
object.Value(Index ) = [ value ]
IRow接口的第六个属性HasOID(只读,判断指出该行是否有OID)
IRow接口的第七个属性OID(只读,获取该行的OID值)
例子代码:
  1. If pRow.HasOID Then
  2.   Debug.Print pRow.OID
  3. End If
复制代码
 
13.        关于IFeatureClass接口(esriGeoDatabase)
  1. Dim pFeatcls As IFeatureClass
  2. Dim pFeatLayer As IFeatureLayer
  3. Dim pDoc As IMxDocument
  4. Dim pMap As IMap

  5. Set pDoc = ThisDocument
  6. Set pMap = pDoc.Maps.Item(0)
  7. Set pFeatLayer = pMap.Layer(0)
  8. Set pFeatcls = pFeatLayer.FeatureClass
复制代码
IFeatureClass接口的第一个方法AddField(Field) (方法,增加一个属性字段到这个要素类,其中传入的参数为一个IField接口的变量,此变量可以由其他要素类获得并赋值给要操作的要素类,可用IFeilds接口的Field属性来获得)
IFeatureClass接口的第二个方法DeleteField(Field) (方法,删除一个属性字段,其中传入的参数为一个IField接口的变量)
IFeatureClass接口的第三个属性Fields(只读,获取该要素类的全部属性字段,返回一个IFields类型的变量)
例子代码:
  1. 'Assume we have a reference to a feature class, pFC
  2. Dim pFields As IFields
  3. Dim pField As IField
  4. Set pFields = pFC.Fields
  5. Set pField = pFields.Field(pFields.FindField("MyField"))

  6. pFC.DeleteField pField
复制代码
IFeatureClass接口的第四个方法FindField(Name) (方法,去查找在该要素类里面是否含有参数名字的属性字段,如果有,则返回索引,没有,则返回-1)
IFeatureClass接口的第五个属性AreaField(只读,获取属性字段为geometry的那一个Field)
例子代码:
  1. Dim pFeatcls As IfeatureClass
  2. Dim pFeatLayer As IFeatureLayer
  3. Dim pDoc As IMxDocument
  4. Dim pMap As Imap

  5. Set pDoc = ThisDocument
  6. Set pMap = pDoc.Maps.Item(0)
  7. Set pFeatLayer = pMap.Layer(0)
  8. Set pFeatcls = pFeatLayer.FeatureClass  
  9. Dim pFld As IField
  10. Set pFld = pFeatcls.AreaField

  11. If Not pFld Is Nothing Then
  12. MsgBox pFld.Name
  13. End If
复制代码
IFeatureClass接口的第六个方法Search (filter, Recycling) (方法,去得到一个IFeatureCursor类型的游标,该游标由filter来控制赛选,如果filter等于null,则返回整个featureclass的游标,再用IfeatureCursor的NextFeature的方法依次得到每一个Feature)
例子代码:
  1. Dim pFeatcls As IFeatureClass
  2. Dim pFeatLayer As IFeatureLayer
  3. Dim pDoc As IMxDocument
  4. Dim pMap As IMap

  5. Set pDoc = ThisDocument
  6. Set pMap = pDoc.Maps.Item(0)
  7. Set pFeatLayer = pMap.Layer(0)
  8. Set pFeatcls = pFeatLayer.FeatureClass

  9. ' +++ create the query filter, and give
  10. ' +++ it a where clause
  11. Dim pQFilt As IQueryFilter
  12. Dim pFeatCur As IFeatureCursor

  13. Set pQFilt = New QueryFilter
  14. pQFilt.WhereClause = "subtype = 'COM'"
  15. Set pFeatCur = pFeatcls.Search(pQFilt, False)

  16. ' +++ get the area field
  17. Dim pFlds As IFields
  18. Dim pFld As IField
  19. Dim lAIndex As Long

  20. Set pFlds = pFeatcls.Fields
  21. lAIndex = pFlds.FindField ("Area")
  22. Set pFld = pFlds.Field(lAIndex)

  23. ' +++ a variable to hold the total area
  24. Dim dtotArea As Double
  25. dtotArea = 0#

  26. ' +++ loop through all of the features and
  27. ' +++ calculate the sum of all of the areas
  28. Dim pFeat As IFeature
  29. Set pFeat = pFeatCur.NextFeature
  30. Do
  31. dtotArea = dtotArea + pFeat.Value(lAIndex)
  32. Set pFeat = pFeatCur.NextFeature
  33. Loop Until pFeat Is Nothing

  34. ' +++ send the total area to a message box
  35. MsgBox dtotArea
复制代码
IFeatureClass接口的第七个方法Insert(useBuffering) (方法,去得到一个IFeatureCursor类型的游标,来用作插入新的Features,useBuffering是一个布尔型参数,当为True时即可以插入新的Feature,再用IFeatureCursor的InsertFeature (buffer )的方法去插入一个新的Feature)
例子代码:
  1. Dim pFeatcls As IFeatureClass
  2. Dim pFeatLayer As IFeatureLayer
  3. Dim pDoc As IMxDocument
  4. Dim pMap As Imap

  5. Set pDoc = ThisDocument
  6. Set pMap = pDoc.Maps.Item(0)
  7. Set pFeatLayer = pMap.Layer(0)
  8. Set pFeatcls = pFeatLayer.FeatureClass

  9. Dim pFeatCur As IFeatureCursor
  10. Dim pFeatBuf As IFeatureBuffer
  11. Dim v As Variant

  12. Set pFeatCur = pFeatcls.Insert(True)
  13. Set pFeatBuf = pFeatcls.CreateFeatureBuffer
  14. v = pFeatCur.InsertFeature(pFeatBuf)
复制代码
IFeatureClass接口的第八个方法CreateFeatureBuffer(方法,新建一个缓冲,返回一个IFeatureBuffer类型的变量,然后再对这个变量进行操作)
例子代码:
  1. Dim pFeatcls As IFeatureClass
  2. Dim pFeatLayer As IFeatureLayer
  3. Dim pDoc As IMxDocument
  4. Dim pMap As IMap

  5. Set pDoc = ThisDocument
  6. Set pMap = pDoc.Maps.Item(0)
  7. Set pFeatLayer = pMap.Layer(0)
  8. Set pFeatcls = pFeatLayer.FeatureClass

  9. 'create a feature cursor and feature buffer interface
  10. Dim pFeatCur As IFeatureCursor
  11. Dim pFeatBuf As IFeatureBuffer

  12. 'open the feature cursor and feature buffer
  13. Set pFeatCur = pFeatcls.Insert(True)
  14. Set pFeatBuf = pFeatcls.CreateFeatureBuffer

  15. 'get the list of fields
  16. Dim pFlds As IFields
  17. Dim pFld As IField
  18. Dim i As Long
  19. Dim pPolygon As IPolygon
  20. Dim pPolyline As IPolyline
  21. Dim pPt As IPoint

  22. Set pPolygon = New Polygon
  23. Set pPolyline = New Polyline
  24. Set pPt = New Point

  25. 'find the geometry field, based on the shape type,
  26. 'set the value for the field to the appropriate object
  27. Set pFlds = pFeatcls.Fields
  28. For i = 1 To pFlds.FieldCount - 1
  29. Set pFld = pFlds.Field(i)
  30. If (pFld.Type = esriFieldTypeGeometry) Then
  31. Dim pGeom As IGeometry
  32.     Select Case pFeatcls.ShapeType
  33.        Case esriGeometryPolygon
  34.           Set pGeom = pPolygon
  35.        Case esriGeometryPolyline
  36.           Set pGeom = pPolyline
  37.        Case esriGeometryPoint
  38.           Set pGeom = pPt
  39.     End Select

  40.     'set the value in the feature buffer
  41.     pFeatBuf.Value(i) = pGeom
  42.    
  43.     'if it is not a geometry column, determine what kind of
  44.     'field it is, and insert the equivalent of a null value
  45.     'for that field type
  46.    Else
  47.      If pFld.Type = esriFieldTypeInteger Then
  48.        pFeatBuf.Value(i) = CLng(0)
  49.      ElseIf pFld.Type = esriFieldTypeDouble Then
  50.        pFeatBuf.Value(i) = CDbl(0)
  51.      ElseIf pFld.Type = esriFieldTypeSmallInteger Then
  52.        pFeatBuf.Value(i) = CInt(0)
  53.      ElseIf pFld.Type = esriFieldTypeString Then
  54.        pFeatBuf.Value(i) = ""
  55.      Else
  56.        MsgBox "Need to handle this field type"
  57.      End If
  58.    End If
  59. Next i

  60. 'insert the feature from the buffer into the database
  61. pFeatCur.InsertFeature pFeatBuf
复制代码
 
14.        关于ITable接口(esriGeoDatabase)
ITable是把要素类当成一个表格来看,每一列对应一个字段(Field),每一行对应一个要素(Feature),所以对要素类(Ifeatureclass)接口的操作均可以类似的在Itable接口中找到。
两个接口可以进行如下强制转化:
VB语言
  1. Dim pFC As IFeatureClass
  2. Dim pTable As ITable

  3. Set pTable = pFC
复制代码
C#语言
  1. IFeatureClass pFC;
  2. ITable pTable;
  3. pTable = (ITable)pFC;
复制代码
ITable接口的第一个方法AddField(Field) (方法,增加一个属性字段到这个表,其中传入的参数为一个IField接口的变量,此变量可以由其他表获得并赋值给要操作的表,可用IFeilds接口的Field属性来获得)
ITable接口的第二个方法GetRow(OID) (方法,通过OID来从表格数据库中获取一行,返回一个IRow接口的变量)此方法类似于IFeatureClass接口的GetFeature方法
例子代码:
  1. Dim pWorkspace As IWorkspace
  2. Dim pFact As IWorkspaceFactory
  3.   
  4. ' This example uses an SDE connection. This code works the
  5. ' same for any open IWorkspace.
  6.    
  7. Dim pPropset As IPropertySet
  8. Set pPropset = New PropertySet
  9. With pPropset
  10.     .SetProperty "Server", "fred"
  11.     .SetProperty "Instance", "5203"
  12.     .SetProperty "Database", "sdedata"
  13.     .SetProperty "user", "test"
  14.     .SetProperty "password", "test"
  15.     .SetProperty "version", "sde.DEFAULT"
  16. End With
  17. Set pFact = New SdeWorkspaceFactory
  18. Set pWorkspace = pFact.Open(pPropset, Me.hWnd)
  19. Dim pFeatureWorkspace As IFeatureWorkspace
  20. Set pFeatureWorkspace = pWorkspace
  21.       
  22. Dim pTable As ITable
  23. Set pTable = pFeatureWorkspace.OpenTable("Pavement")
  24. Dim pRow As IRow
  25. Set pRow = pTable.GetRow(59)
  26. Debug.Print pRow.Value(2)
复制代码
ITable接口的第三个方法GetRows(oids, Recycling) (方法,得到一个游标ICursor,通过一个oids的OID数组参数和一个Recycling的布尔类型的参数,一般为True)此方法类似于IFeatureClass接口的GetFeatures方法
例子代码:
  1. Dim iOIDList() As Long
  2. Dim iOIDListCount As Long
  3. iOIDListCount = 5
  4.      
  5. ReDim iOIDList(iOIDListCount)
  6. iOIDList(0) = 1
  7. iOIDList(1) = 2
  8. iOIDList(2) = 3
  9. iOIDList(3) = 4
  10. iOIDList(4) = 50
  11.    
  12. Dim pCursor As ICursor
  13. Set pCursor = pTable.GetRows(iOIDList, True)
  14. Dim pRow As IRow
  15. Set pRow = pCursor.NextRow
  16. While Not pRow Is Nothing
  17.   Debug.Print pRow.Value(2)
  18.   Set pRow = pCursor.NextRow
  19. Wend
复制代码
ITable接口的第四个方法RowCount(QueryFilter) (方法,得到满足查询过滤器条件的行数。此方法IFeatureClass接口没有,所以是一个很好的有条件查询要素数量的一个方法)

Tags:ArcGIS接口  
责任编辑:gissky
相关文章列表
没有相关文章
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图