• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

gisoracle

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

ArcGIS Pro脚本工具(3)——直线转弧线

OD成本矩阵求解后的生成线为直线,如下左图,略丑。一通捣鼓终于实现了将直线转为弧线,效果见右图。

实现的方法主要是参考了这片文章,在此先感谢前辈大佬。

生成流向弧线工具 - GIS知乎-新一代GIS问答社区http://zhihu.geoscene.cn/article/2811在前文的基础上,修改了添加折点的方法(为此还解了一道几何题,几乎抓破脑壳),增加了对弧线方向和弧度的控制。值得一提的是,将原直线的属性信息也一并增加到了新生成的弧线中,方便后续的符号化。

工具脚本

    # -*- coding: utf-8 -*-
     
    #引入模块
    import os, arcpy
    import arcpy.cartography as CA
     
     
    #输入原始的line
    line = arcpy.GetParameterAsText(0)
     
     
    #计算弧线的顶点坐标的函数
    k=arcpy.GetParameter(2)
    d=arcpy.GetParameterAsText(3)
     
    def addPoint(x0, y0, x2, y2):
        if d =="顺向":
            x1,y1 = (x2+x0)/2-(y2-y0)/k,(y2+y0)/2+(x2-x0)/k
        elif d=="逆向":
            x1,y1 = (x2+x0)/2+(y2-y0)/k,(y2+y0)/2-(x2-x0)/k
        return (x1, y1)  
     
      
    # 创建一个临时线要素类addVertex
    addVertex = arcpy.CreateFeatureclass_management("in_memory", "addVertex", "POLYLINE", spatial_reference = arcpy.Describe(line).spatialReference)
    arcpy.AddField_management(addVertex, "ORIGID", "LONG")  
     
     
    #创建与line对应的折线并写入addVertex
    with arcpy.da.SearchCursor(line, ["SHAPE@", "OID@"]) as sc:  
        with arcpy.da.InsertCursor(addVertex, ["SHAPE@", "ORIGID"]) as ic:  
            for row in sc:  
                shp = row[0]
                p0 = shp.firstPoint  
                p2 = shp.lastPoint
                x1,y1 = addPoint(p0.X, p0.Y, p2.X, p2.Y)  
                p1 = arcpy.Point(x1,y1)  
                new_geometry = arcpy.Polyline(arcpy.Array([p0, p1, p2]))  
                new_row = [new_geometry, row[1]]  
                ic.insertRow(new_row)
     
     
    #调用SmoothLine工具,输入折线addVertex生成弧线curveline
    curveline = arcpy.GetParameterAsText(1)
    CA.SmoothLine(addVertex, curveline, "BEZIER_INTERPOLATION", "", "", "NO_CHECK")
     
     
    #将原始line的属性信息连接到curveline中
    try:
        arcpy.management.JoinField(curveline, "ORIGID", line, "OBJECTID", )
    except:
        arcpy.management.JoinField(curveline, "ORIGID", line, "FID", )
     
     
    # Delete inmemo fc
    arcpy.Delete_management("in_memory")

 工具参数

 工具使用

 工具下载

代码请自取,完整工具请私信联系
工具说明

有网友获取了代码制作了Pro和ArcMap工具箱,这里需要说明,ArcMap10.7中使用该代码制作的工具会出现错误,弧线曲度较大的情况下生成不了预想中的弧线,原因是ArcMap中的平滑线工具不能正常工作。10.8正常,其他版本没有试过。
————————————————
版权声明:本文为CSDN博主「学学GIS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_28157641/article/details/124437500

posted on 2023-02-08 15:28  gisai  阅读(733)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3