|
阅读:881回复:0
在VBA中利用AO计算矢量线段的走向
<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> |
|
|