ArcGIS计算曲线上任意点到端点的距离
网上找到了一段代码,利用它可以求曲线上任意点到端点的距离,应该可以满足求曲线上任意两点沿曲线的距离的要求,具体做法如下:1、在ARCMAP中加载点图层和对应的线图层,注意只能加载这两个图层,且点图层必须在线图层之上,为了便于大家更清楚地看清起点...
- 作者:lwf902来源:lwf902|2009年12月21日
网上找到了一段代码,利用它可以求曲线上任意点到端点的距离,应该可以满足求曲线上任意两点沿曲线的距离的要求,具体做法如下:
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值,使点最好能落在线上。
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值,使点最好能落在线上。
下一篇:ArcGIS教程大全
+ hot
热门推荐