天天看點

如何求曲線上任意點到端點的距離

現在在網上找到了一段代碼,利用它可以求曲線上任意點到端點的距離,應該可以滿足求曲線上任意兩點沿曲線的距離的要求,大家可以看一下,希望能提出寶貴的意見

具體做法如下:

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值,使點最好能落線上上。

如何求曲線上任意點到端點的距離

繼續閱讀