現在在網上找到了一段代碼,利用它可以求曲線上任意點到端點的距離,應該可以滿足求曲線上任意兩點沿曲線的距離的要求,大家可以看一下,希望能提出寶貴的意見
具體做法如下:
1、在ARCMAP中加載點圖層和對應的線圖層,注意隻能加載這兩個圖層,且點圖層必須線上圖層之上,為了便于大家更清楚地看清起點,我把符号改為指向末端的方向箭頭
2、在點圖層屬性表中新加到端點的字段如aa,類型為double,如下
3、選中列aa ,在field caculator中輸入以下代碼
' ----- You'll need to change this value ----
Const TOLERANCE As Double = 500
' - 這個容差的設定一定要注意,要多次嘗試.若屬性表中出現-1,就加大這個值
Static pMxDoc As IMxDocument
Static pFtrLyr As IFeatureLayer
Static pFtrCls As IFeatureClass
Static pSpFltr As ISpatialFilter
Static pOutPt As IPoint
Dim pInPt As IPoint
Dim pTopOp As ITopologicalOperator
Dim pFtrCsr As IFeatureCursor
Dim pFtr As IFeature
Dim pPline As IPolyline
Dim dDis As Double
Dim dDummy As Double
Dim bDummy As Boolean
Set pInPt = [Shape]
Set pTopOp = pInPt
If pMxDoc Is Nothing Then
Set pMxDoc = ThisDocument
Set pFtrLyr = pMxDoc.FocusMap.Layer(1)
Set pFtrCls = pFtrLyr.FeatureClass
Set pSpFltr = New SpatialFilter
pSpFltr.SpatialRel = esriSpatialRelIntersects
Set pOutPt = New Point
End If
Set pSpFltr.Geometry = pTopOp.Buffer(TOLERANCE)
Set pFtrCsr = pFtrLyr.Search(pSpFltr, False)
Set pFtr = pFtrCsr.NextFeature
If pFtr Is Nothing Then
dDis = -1
Else
Set pPline = pFtr.Shape
pPline.QueryPointAndDistance esriNoExtension, pInPt, False, pOutPt, dDis, dDummy, bDummy
End If
Set pFtrCsr = Nothing
'
' Put dDis in the box below the Advanced window
'
見下圖
這裡要特别注意的是第二行的容差的設定一定要得當,不能過于大,也不能太小。太大的話,就可能算成了點到另一條曲線端點的距離,太小的話不能判斷點在曲線上。是以要多次嘗試,取最佳值。
算出來的表格結果如下:
以上表表示的是曲線上的每個點到各自曲線起點的距離
可以看看這個圖,可能會更加清楚
大家可以看上圖,越到曲線末端(箭頭方向)值越大。
要是要使結果更精确些,在選點時要設好snapping值,使點最好能落線上上。