因为工作需要需要计算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