等高线加密基本原理以及算法代码实现

等高线comtour line指的是地形图上高程相等的各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线。垂直投影到一个标准面上,并按比例缩小画在图纸上,就得到等高线。等高线也可以看作是不同海拔高度的水平面与实际地面的交线,所以等高线是闭合曲线。

在用高程点插值生成grid,或先用高程点构建tin,再转为grid的过程中,需要等高线作拦截,避免插值结果的穿透。在arcgis中,由高程点生成grid时是可以选择barrier line的,但发现选了这个选项,运算时间非常的长,我做过一个全省的数据,5天都没有算完,后来想了一个变通的方法。

就是把等高线打散成点,然后把这些点添加到高程点数据中,直接用点数据生成grid。但如果等高线的点不够密,穿透情况非常明显,所以要对等高线的点进行加密,下面是加密代码(VBA),基于的原理就是等高线是由多个IPath构成,不存在弧的问题,可以做均匀线性插值

'等高线加密
Public Sub PolylineInsert()
    Dim pMxDoc As IMxDocument
    Set pMxDoc = ThisDocument
   
    Dim pMap As IMap
    Set pMap = pMxDoc.FocusMap
   
    Dim pLayer1 As IFeatureLayer
    Set pLayer1 = pMap.Layer(0)
    Dim pFC1 As IFeatureClass
    Set pFC1 = pLayer1.FeatureClass
   
    Dim pF1 As IFeature, pF2 As IFeature
    Dim pFeatCursor1 As IFeatureCursor
    Set pFeatCursor1 = pFC1.Search(Nothing, False)
    Set pF1 = pFeatCursor1.NextFeature
   
    Dim pPointcol As IPointCollection
    Dim pPointcol1 As IPointCollection
    Dim pP As IPoint
    Dim i As Long, j As Long, k As Integer
    Dim pP1 As IPoint, pP2 As IPoint
    Dim dx As Double, dy As Double
   
    Do Until pF1 Is Nothing
        Set pPointcol1 = New Polyline
        Set pPointcol = pF1.Shape
        For i = 0 To pPointcol.PointCount - 2
            Set pP1 = pPointcol.Point(i)
            Set pP2 = pPointcol.Point(i + 1)
            pPointcol1.AddPoint pP1
            dx = (pP1.X - pP2.X) / 20
            dy = (pP1.Y - pP2.Y) / 20
            For k = 1 To 19
                Set pP = New Point
                pP.PutCoords pP1.X - k * dx, pP1.Y - k * dy
                pPointcol1.AddPoint pP
                Set pP = Nothing
            Next k
        Next i
        pPointcol1.AddPoint pP2
        Set pF1.Shape = pPointcol1
        pF1.Store
        Set pF1 = pFeatCursor1.NextFeature
    Loop
    MsgBox "ok"
End Sub

这个代码中,我是在等高线每两个角点插入19个点,大家可以把这个数值参数化