• 沿线批量内插点对象


    最近碰到有一个数据处理的要求,需要针对线对象批量的内插生成点对象,本想自己写算法,后来发现AO中已提供接口实现,省事了

    将点层放在第一层,在toc中选择要内插的线层,然后运行如下vba程序

    该程序也适用于面对沿边线内插,关键接口IConstructMultipoint,方法ConstructDivideEqual 是指定个数,方法ConstructDivideEqual 是等距内插,自动计算内插个数。它支持等距内插和设定内插点个数两种方式,需要注意一点,起点和终点作为默认点,如果是设定内插点个数的,要在目标个数基础上减2,帮助中明确说是内部点个数作为输入参数

    GetInterPointNum函数是自定义的,目的是获取需要内插点的个数

    Public Sub CreatePointsAlongCurve()
        Dim pMxDoc As IMxDocument
        Set pMxDoc = ThisDocument
        Dim pMap As IMap
        Set pMap = pMxDoc.FocusMap
       
        Dim pInGeometry As IGeometry
        Dim pInLayer As ILayer
        Dim pInFLayer As IFeatureLayer
        Dim pOutFLayer As IFeatureLayer
        Dim pInFCursor As IFeatureCursor
        Dim pOutFCursor As IFeatureCursor
        Dim pOutFBuffer As IFeatureBuffer
        Dim pInFClass As IFeatureClass
        Dim pOutFClass As IFeatureClass
        Dim pSelSet As ISelectionSet
        Dim pFSelection As IFeatureSelection
        Dim pInFeature As IFeature
        Dim pCurve As ICurve
        Dim pPointCollection As IPointCollection
        Dim pConstructMultipoint As IConstructMultipoint
        Dim i As Long, lAID As Long
        Dim pPointDist As Double
        Dim pPolyline As IPolyline
        Dim dLength As Double
       
        Set pInLayer = pMxDoc.SelectedLayer
        If pInLayer Is Nothing Then
            MsgBox "请在TOC中选择要转换的图层", vbCritical, "错误提示"
            Exit Sub
        End If
        If TypeOf pInLayer Is IFeatureLayer Then
            Set pInFLayer = pMxDoc.SelectedLayer
        Else
            MsgBox "必须选择矢量要素类图层", vbCritical, "错误提示"
        Exit Sub
        End If
       
        Set pOutFLayer = pMap.Layer(0)
        Set pInFClass = pInFLayer.FeatureClass
        Set pOutFClass = pOutFLayer.FeatureClass
       
        If Not pOutFClass.ShapeType = esriGeometryPoint Then
            MsgBox "目标图层非点图层", vbCritical, "错误提示"
            Exit Sub
        End If
       
        Set pFSelection = pInFLayer
        Set pSelSet = pFSelection.SelectionSet
       
        Set pOutFBuffer = pOutFClass.CreateFeatureBuffer
        Set pOutFCursor = pOutFClass.Insert(True)
       
        Set pInFCursor = pInFLayer.Search(Nothing, False)
        Set pInFeature = pInFCursor.NextFeature
        Do While Not pInFeature Is Nothing
            Set pInGeometry = pInFeature.Shape
            lAID = pInFeature.Value(2)
            Set pCurve = pInGeometry
            dLength = pCurve.Length
           
            Set pConstructMultipoint = New Multipoint
            pConstructMultipoint.ConstructDivideEqual pCurve, GetInterPointNum(dLength, lAID) - 2
            Set pPointCollection = pConstructMultipoint
           
            For i = 0 To pPointCollection.PointCount - 1
                Set pOutFBuffer.Shape = pPointCollection.Point(i)
                pOutFCursor.InsertFeature pOutFBuffer
            Next i
           
            Set pInFeature = pInFCursor.NextFeature
        Loop
       
        pMxDoc.ActiveView.Refresh
        MsgBox "over"
        Exit Sub
    End Sub

  • 相关阅读:
    Scala泛型
    Tensorflow激活函数
    20181030-4 每周例行报告
    20181023-3 每周例行报告
    20181016-10 每周例行报告
    20181009-9 每周例行报告
    第三周作业(4)——单元测试
    第三周作业(5)——代码规范
    第三周作业(2)——功能测试
    第三周作业(3)——词频统计--效能分析
  • 原文地址:https://www.cnblogs.com/linghe/p/1389958.html
Copyright © 2020-2023  润新知