gisempire100
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:881回复:0

在VBA中利用AO计算矢量线段的走向

楼主#
更多 发布于:2008-01-04 17:50
<DIV>因为工作需要需要计算shp线文件中的每一条线的走向(即线段与正北的夹角),咨询esri支持,得到的答复是:<BR>        ArcGIS Desktop中没有直接的工具可以完成改功能,但可以写一个VBA小程序完成,原理比较简单,如下:</DIV>
<DIV> 1、获得每条线段的起始点和终止点</DIV>
<DIV> 2、用IVector3D接口的ConstructDifference 方法输入起始点和终止点构建矢量</DIV>
<DIV>3、IVector3D接口的Azimuth方法即可获得方位角。<BR>    我没有用过ao的vba编程,不过按照“ConstructDifference”、“IVector3D”、“Azimuth”为关键字在ao的帮助中找到了些范例,费了两天时间终于还拼凑出来实现了我想要的功能。我的体会是,也许我们对于ao的具体类/方法并不明确,但是可以借助esri所提供的帮助范例组合出我们想要的结果。呵呵。</DIV>
<P>Public Sub GetAzimuth2()<BR>    Dim pMxDoc As IMxDocument<BR>    Dim pEnumFeature As IEnumFeature<BR>    Dim pFeature As IFeature<BR>    Dim pStartPoint As IPoint<BR>    Dim pEndPoint As IPoint<BR>    Dim LineVector As IVector3D<BR>    Dim LineAzimuth As Double     '存储线段的方位角<BR>    Dim pFields As IFields<BR>    Dim pField As IField<BR>    Dim Item As Long<BR>    <BR>    Dim pFeatcls As IFeatureClass<BR>    Dim pFeatLayer As IFeatureLayer<BR>    Dim pDoc As IMxDocument<BR>    Dim pMap As IMap<BR>    Dim pFeatureClass As IFeatureClass<BR>    Dim pFeatureCursor As IFeatureCursor<BR>    Dim pCurve As ICurve<BR>    <BR>    Set pDoc = ThisDocument<BR>    Set pMap = pDoc.Maps.Item(0)<BR>    Set pFeatLayer = pMap.Layer(0)<BR>    Set pFeatcls = pFeatLayer.FeatureClass<BR>    Set pFeatureClass = pFeatLayer.FeatureClass ' pFeatureLayer.FeatureClass<BR>    Set pFeatureCursor = pFeatureClass.Search(Nothing, False)<BR>    Set pFeature = pFeatureCursor.NextFeature<BR>    Do While Not pFeature Is Nothing<BR>        Set pPointCol = pFeature<BR>        Set pFields = pFeature.Fields</P>
<P>        If (pFields.FindField("走向") <> -1) Then<BR>            Item = pFields.FindField("走向")<BR>            Set pField = pFields.Field(Item)    '获得走向字段<BR>        Else<BR>            MsgBox "没有可以存储计算走向值的字段!"<BR>            Exit Sub<BR>        End If</P>
<DIV>        <BR>        'MsgBox "字段名:" ; pField.Name<BR>        Set pCurve = pFeature.Shape         '获得要素的shape<BR>        Set pStartPoint = pCurve.FromPoint  '将曲线的起点赋予pStartPoint<BR>        Set pEndPoint = pCurve.ToPoint      '将曲线的终点赋予pEndPoint<BR>        Set LineVector = CreateVector3DTwoPoints(pStartPoint, pEndPoint)<BR>        LineAzimuth = LineVector.Azimuth * 180 / 3.14159 'Azimuth为线段的弧度值,将其转化为度表示<BR>        'MsgBox "该线段的走向为" ; LineAzimuth<BR>        If LineAzimuth > 360 Then           '走向大于360度,可以用减去360度的值表示<BR>            LineAzimuth = LineAzimuth - 360 '还有大于360度的情况??<BR>        End If<BR>       <BR>        If LineAzimuth >= 180 Then           '走向大于180度,可以用减去180度的值表示<BR>            LineAzimuth = LineAzimuth - 180<BR>        End If<BR>        pFeature.Value(Item) = LineAzimuth<BR>        pFeature.Store<BR>   Set pFeature = pFeatureCursor.NextFeature<BR>   Loop<BR>End Sub</DIV>
喜欢0 评分0
A friend is never known till a man has need. ...CL
游客

返回顶部