Calendar
页面载入中....
Placard
页面载入中....
Category
页面载入中....
Latest Entries
页面载入中....
Latest Comments
页面载入中....
Last Messages
页面载入中....
User Login
页面载入中....
Links
Information
页面载入中....
Search
Other


Welcome to my blog!
  在VBA中利用AO计算矢量线段的走向 
 
因为工作需要需要计算shp线文件中的每一条线的走向(即线段与正北的夹角),咨询esri支持,得到的答复是:
        ArcGIS Desktop中没有直接的工具可以完成改功能,但可以写一个VBA小程序完成,原理比较简单,如下:
 1、获得每条线段的起始点和终止点
 2、用IVector3D接口的ConstructDifference 方法输入起始点和终止点构建矢量
3、IVector3D接口的Azimuth方法即可获得方位角。
    我没有用过ao的vba编程,不过按照“ConstructDifference”、“IVector3D”、“Azimuth”为关键字在ao的帮助中找到了些范例,费了两天时间终于还拼凑出来实现了我想要的功能。我的体会是,也许我们对于ao的具体类/方法并不明确,但是可以借助esri所提供的帮助范例组合出我们想要的结果。呵呵。

Public Sub GetAzimuth2()
    Dim pMxDoc As IMxDocument
    Dim pEnumFeature As IEnumFeature
    Dim pFeature As IFeature
    Dim pStartPoint As IPoint
    Dim pEndPoint As IPoint
    Dim LineVector As IVector3D
    Dim LineAzimuth As Double     '存储线段的方位角
    Dim pFields As IFields
    Dim pField As IField
    Dim Item As Long
   
    Dim pFeatcls As IFeatureClass
    Dim pFeatLayer As IFeatureLayer
    Dim pDoc As IMxDocument
    Dim pMap As IMap
    Dim pFeatureClass As IFeatureClass
    Dim pFeatureCursor As IFeatureCursor
    Dim pCurve As ICurve
   
    Set pDoc = ThisDocument
    Set pMap = pDoc.Maps.Item(0)
    Set pFeatLayer = pMap.Layer(0)
    Set pFeatcls = pFeatLayer.FeatureClass
    Set pFeatureClass = pFeatLayer.FeatureClass ' pFeatureLayer.FeatureClass
    Set pFeatureCursor = pFeatureClass.Search(Nothing, False)
    Set pFeature = pFeatureCursor.NextFeature
    Do While Not pFeature Is Nothing
        Set pPointCol = pFeature
        Set pFields = pFeature.Fields

        If (pFields.FindField("走向") <> -1) Then
            Item = pFields.FindField("走向")
            Set pField = pFields.Field(Item)    '获得走向字段
        Else
            MsgBox "没有可以存储计算走向值的字段!"
            Exit Sub
        End If

       
        'MsgBox "字段名:" & pField.Name
        Set pCurve = pFeature.Shape         '获得要素的shape
        Set pStartPoint = pCurve.FromPoint  '将曲线的起点赋予pStartPoint
        Set pEndPoint = pCurve.ToPoint      '将曲线的终点赋予pEndPoint
        Set LineVector = CreateVector3DTwoPoints(pStartPoint, pEndPoint)
        LineAzimuth = LineVector.Azimuth * 180 / 3.14159 'Azimuth为线段的弧度值,将其转化为度表示
        'MsgBox "该线段的走向为" & LineAzimuth
        If LineAzimuth > 360 Then           '走向大于360度,可以用减去360度的值表示
            LineAzimuth = LineAzimuth - 360 '还有大于360度的情况??
        End If
      
        If LineAzimuth >= 180 Then           '走向大于180度,可以用减去180度的值表示
            LineAzimuth = LineAzimuth - 180
        End If
        pFeature.Value(Item) = LineAzimuth
        pFeature.Store
   Set pFeature = pFeatureCursor.NextFeature
   Loop
End Sub

[ 阅读全文 | 回复(0) | 引用通告 | 编辑

  Post  by  gisboy 发表于 2007-1-7 15:11:00
  • 标签:VBA AO 矢量线段 走向 
  • 发表评论:
    页面载入中....
    页面载入中....
    Powered by Oblog.