分享

ArcObject代码集锦

 joey 2006-03-12
搜集自gisforum
————————————————————————————
向SHP文件插入一条记录‘产生一个点对象
Dim pPoint As IPoint
pPoint = New Point
pPoint.PutCoords(100, 2)

‘打开工作空间
Dim pWorkspaceFactory As IWorkspaceFactory
pWorkspaceFactory = New ShapefileWorkspaceFactory
Dim pFeatWorkspace As IFeatureWorkspace
pFeatWorkspace = pWorkspaceFactory.OpenFromFile("e:\us", 0)

Dim pWorkspaceEdit As IWorkspaceEdit
pWorkspaceEdit = pFeatWorkspace

‘获取一个要素类
Dim pFeatureClass As IFeatureClass
pFeatureClass = pFeatWorkspace.OpenFeatureClass("points")

‘得到要素类的字段结构
Dim pFields As IFields
pFields = pFeatureClass.Fields

‘开始编辑过程
pWorkspaceEdit.StartEditing(True)
pWorkspaceEdit.StartEditOperation()

Dim pFeatCursor As IFeatureCursor
pFeatCursor = pFeatureClass.Insert(True)

Dim pFeatBuffer As IFeatureBuffer
pFeatBuffer = pFeatureClass.CreateFeatureBuffer
pFeatBuffer.Value(pFields.FindField("name")) = "point1"
pFeatBuffer.Value(pFields.FindField("shape")) = pPoint

‘插入记录
pFeatCursor.InsertFeature(pFeatBuffer)
pFeatCursor.Flush()

pWorkspaceEdit.StartEditOperation()
pWorkspaceEdit.StopEditing(True)
-----------------------
代码经过实际测试,没有任何问题!

 

 

自己做要素的闪烁下面的方法需要传入四个参数,第一个是MapControl空间的ScreenDisplay对象,pGeometry是要被闪烁的要素图形,nTimer是闪烁的次数,而time是闪烁的时间。
这个方法只能用于闪烁Polygon类型要素。
Private Sub FlashPolygon(ByVal pDisplay As IScreenDisplay, ByVal pGeometry As IGeometry, ByVal nTimer As Integer, ByVal time As Integer)
Dim pFillSymbol As ISimpleFillSymbol
Dim pSymbol As ISymbol
Dim pRGBColor As IRgbColor

pRGBColor = New RgbColor
pRGBColor.Green = 128

pFillSymbol = New SimpleFillSymbol
pFillSymbol.Outline = Nothing
pFillSymbol.Color = pRGBColor
pSymbol = pFillSymbol
pSymbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen

Dim i As Integer

pDisplay.StartDrawing(0, esriScreenCache.esriNoScreenCache)
pDisplay.SetSymbol(pFillSymbol)
For i = 0 To nTimer
pDisplay.DrawPolygon(pGeometry)
System.Threading.Thread.Sleep(time)
Next
End Sub
-------------------------------
这个方法需要对ScreenDisplay对象有深入的了解,不过并不复杂,在我的书稿中对这个对象有详细的介绍。
代码经过测试,可以完美使用。

 

 

要素动态跟踪的算法这个算法其实很简单,核心原理是在一个timer_tick事件中不断改变一个markerElement的geometry。而我们关注的目标也是这些符合条件的geometry如何得到。

1.polyline上的节点
我们我们要取一条polyline上的节点,这个方法是非常简单的,使用ipointcollection接口对象ppts,我们通过QI一条polyline,可以获取这些点集合。
dim ppts as ipointcollection
ppts=ppolyline
其中的点从ppts.point(i)中取得

2.获取均匀点
如果一条线很长,但是只有一个segment,那么点将很快移动完毕,这样肯定我们也不满意,我们希望能够不管线的长度是多少,一定要让点移动10次,我们就必须找出一条线上等距离的11个点的位置出来,算法如下:

Function MakeMultiPoint(ByVal pGeometry As IGeometry, ByVal nPoints As Integer) As IGeometryCollection
        Dim pGeometryCollection As IGeometryCollection
        If TypeOf pGeometry Is IPolyline Then
            ‘ return a multipoint containing nPoints equally
            ‘ distributed on the Polyline
            Dim pConstructGeometryCollection As IConstructGeometryCollection
            pConstructGeometryCollection = New GeometryBag
            pConstructGeometryCollection.ConstructDivideEqual(pGeometry, nPoints - 1, esriConstructDivideEnum.esriDivideIntoPolylines)
            Dim pEnumGeometry As IEnumGeometry
            pEnumGeometry = pConstructGeometryCollection
            pGeometryCollection = New Multipoint
            Dim pPolyline As IPolyline
            pPolyline = pEnumGeometry.Next
            pGeometryCollection.AddGeometry(pPolyline.FromPoint)
            Do While Not pPolyline Is Nothing
                pGeometryCollection.AddGeometry(pPolyline.ToPoint)
                pPolyline = pEnumGeometry.Next
            Loop
        End If
        MakeMultiPoint = pGeometryCollection
        pGeometryCollection = Nothing
    End Function
这个函数可取出符合要求的点集出来。

 

 

 


向要素类中插入一条要素的方法本例使用ifeatureclass::insertFeature和featurebuffer等命令构成。
Option Explicit

Dim pFeatClass As IFeatureClass
‘-----看看没有绘制前要素类里面的要素数目
Private Sub Command1_Click()
Dim pLayer As IFeatureLayer
Set pLayer = MapControl1.Map.Layer(0)
Set pFeatClass = pLayer.FeatureClass
Label1.Caption = pFeatClass.FeatureCount(Nothing)
End Sub
‘----插入要素的方法
Public Sub insertFeat(ByVal pGeo As IGeometry, ByVal pFeatClass As IFeatureClass)
Dim pFeatCursor As IFeatureCursor
Dim pFeatBuffer As IFeatureBuffer
Set pFeatCursor = pFeatClass.Insert(True)
Set pFeatBuffer = pFeatClass.CreateFeatureBuffer()

Dim pFlds As IFields
Dim pFld As IField
Dim i As Long
Dim pPolygon As IPolygon

Set pPolygon = pGeo

Set pFlds = pFeatClass.Fields
For i = 1 To pFlds.FieldCount - 1
Set pFld = pFlds.Field(i)

If (pFld.Type = esriFieldTypeGeometry) Then
Dim pGeom As IGeometry
Set pGeom = pPolygon
pFeatBuffer.Value(i) = pGeom

Else
If pFld.Type = esriFieldTypeInteger Then
pFeatBuffer.Value(i) = CLng(0)
ElseIf pFld.Type = esriFieldTypeDouble Then
pFeatBuffer.Value(i) = CDbl(0)
ElseIf pFld.Type = esriFieldTypeSmallInteger Then
pFeatBuffer.Value(i) = CInt(0)
ElseIf pFld.Type = esriFieldTypeString Then
pFeatBuffer.Value(i) = ""
Else
MsgBox "Need to handle this field type"
End If
End If
Next i

pFeatCursor.InsertFeature pFeatBuffer
End Sub
‘------map控件上拖曳绘制
Private Sub MapControl1_OnMouseDown(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long, ByVal mapX As Double, ByVal mapY As Double)
Dim pGeo As IGeometry
Set pGeo = MapControl1.TrackPolygon
‘----使用方法
insertFeat pGeo, pFeatClass
Label1.Caption = pFeatClass.FeatureCount(Nothing)
End Sub

 

 

 

 

 

 

 

 

要素的标注标注有两种方法,一个是添加TextElement到文档对象,另一种是基于要素的某个属性进行标注,它需要载入数据支持。第一种方法在P8中可以看到。下面介绍后一种方法:
Public sub Anno(byval pGeoFeatLyr as iGeofeaturelayer,byval field as string)
   Dim pGeoFeatLayer As IGeoFeatureLayer
pGeoFeatLayer = pGeoFeatLyr
        Dim pAnnoProps As IannotateLayerPropertiesCollection             
        pAnnoProps = pGeoFeatLyr.AnnotationProperties
        pAnnoProps.Clear()              必须执行这个语句,否则里面会默认有一个pAnnoLayerProps
        Dim pAnnoLayerProps As IAnnotateLayerProperties
        Dim pPosition As ILineLabelPosition
        Dim pPlacement As ILineLabelPlacementPriorities
        Dim pBasic As IBasicOverposterLayerProperties
        Dim pLabelEngine As ILabelEngineLayerProperties
        Dim pTextSyl As ItextSymbol        标注的文字格式,注意
        pTextSyl = New TextSymbol
        Dim pFont As stdole.StdFont
        pFont = New stdole.StdFont
        pFont.Name = "verdana"
        pFont.Size = 5
        pTextSyl.Font = pFont
        pTextSyl.Color = HSVColor(250, 160, 200)
        pPosition = New LineLabelPosition
        pPosition.Parallel = False
        pPosition.Perpendicular = True
        pPlacement = New LineLabelPlacementPriorities
        pBasic = New BasicOverposterLayerProperties
        pBasic.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolyline
        pBasic.LineLabelPlacementPriorities = pPlacement
        pBasic.LineLabelPosition = pPosition
        pLabelEngine = New LabelEngineLayerProperties
        pLabelEngine.Symbol = pTextSyl
        pLabelEngine.BasicOverposterLayerProperties = pBasic
        pLabelEngine.Expression = field         field必须是这个样子——"[STATE_NAME]"
        pAnnoLayerProps = pLabelEngine
        pAnnoProps.Add(pAnnoLayerProps)
        pGeoFeatLyr.DisplayAnnotation = True
    AxMapControl.CtlRefresh(esriViewDrawPhase.esriViewBackground)
End sub
消除标注的方法也很简单,由于pGeoFeatLyr是一个全局变量,我们只要设置如下代码即可:
        pGeoFeatLyr.DisplayAnnotation = False
     AxMapControl.CtlRefresh(esriViewDrawPhase.esriViewBackground)

 

 

 

 

 

 

 

GIS数据回溯的基本思路以前看过一个GIS工程,里面有个很有特色的功能,就是数据回溯,这个功能可以依据时间点来现实当时的数据,当时我始终将这个功能和version混淆,不知道它是如何实现的,后来做工程的人指点了一下,经验不敢独享,贴出来给大家分享:
1.在设计要素类的时侯,特别设置两个字段,一个是starttime,一个是endtime。其中starttime去要素建立时侯的当前时间,而endtime取99999999。
2.当要素修改或者删除的时侯,只是将它的endtime取为当前时间。这样要素的删除就是假的,只是调整了一个结束时间而已。
3.某天打开一个要素类的时侯,仅仅需要取出这个类中endtime小于当前时间的要素。那些没有修改的要素的endtime都是99999999,当然会显示了。
因此,在进行数据回溯的时侯,不过是做一个判断而已,很简单吧。

 

 

 


  ‘Create a new AoInitialize object
  Set m_pAoInitialize = New AoInitialize
  If m_pAoInitialize Is Nothing Then
    MsgBox "Unable to initialize. This application cannot run!"
    Unload LabelEdit
    Exit Sub
  End If
  ‘Determine if the product is available
  If m_pAoInitialize.IsProductCodeAvailable(esriLicenseProductCodeEngine) = esriLicenseAvailable Then
    If m_pAoInitialize.Initialize(esriLicenseProductCodeEngine) <> esriLicenseCheckedOut Then
      MsgBox "The initialization failed. This application cannot run!"
      Unload LabelEdit
      Exit Sub
    End If
  Else
    MsgBox "The ArcGIS Engine product is unavailable. This application cannot run!"
    Unload LabelEdit
    Exit Sub
  End If

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多