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