起讫点(Origin-Destination,OD)可视化主要可以用于展示人群、交通流量或者城市交互的走向、分布等。尽管已有很多帖子分享,但可用性还有待改进,因此今天分享基于ArcGIS Pro3.5.2的OD图可视化教程,代码可直接复制粘贴使用。
1 主要步骤
(1)数据准备
OD图的数据格式包括起讫点xy坐标和属性(如下图

(2)点对转直线
搜索【XY to Line】工具,填写相关参数即可。例如o_x对应Start X Field


(3)直线转弧线
打开【New Notebook】,复制以下代码运行即可。注意设置工作空间(当前项目的地址)以及输入输出文件名等参数。
python
import arcpy
import os
# 设置工作空间
arcpy.env.workspace = r"D:\gjh\MyProject\MyProject.gdb"
arcpy.env.overwriteOutput = True
# 设置参数
input_line = "Sheet1_XYToLine"
curveline = "Sheet1_XYToLine_curved"
radian = 10.0
orientation = "顺向"
def addPoint(x0, y0, x2, y2, radian, orientation):
"""计算弧线顶点坐标的函数"""
if orientation == "顺向":
x = (x2 + x0) / 2 - (y2 - y0) / radian
y = (y2 + y0) / 2 + (x2 - x0) / radian
elif orientation == "逆向":
x = (x2 + x0) / 2 + (y2 - y0) / radian
y = (y2 + y0) / 2 - (x2 - x0) / radian
else:
raise ValueError("方向参数必须是'顺向'或'逆向'")
return x, y
print(f"开始处理: {input_line}")
print(f"输出到: {curveline}")
try:
# 检查输入文件
if not arcpy.Exists(input_line):
print(f"错误: 输入要素类 '{input_line}' 不存在")
else:
print(f"✓ 找到输入要素类: {input_line}")
# 1. 创建一个临时线要素类
# 注意:在ArcGIS Pro中,创建临时要素类的方法
temp_workspace = "memory" # 使用内存工作空间
temp_fc = arcpy.CreateFeatureclass_management(
temp_workspace,
"addVertex_temp",
"POLYLINE",
spatial_reference=arcpy.Describe(input_line).spatialReference
)[0]
# 2. 添加origin字段
arcpy.AddField_management(temp_fc, "origin", "LONG")
# 3. 创建与line对应的折线并写入临时要素类
print("正在创建控制点...")
with arcpy.da.SearchCursor(input_line, ["SHAPE@", "OID@"]) as sc:
with arcpy.da.InsertCursor(temp_fc, ["SHAPE@", "origin"]) 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, radian, orientation)
p1 = arcpy.Point(x1, y1)
new_geometry = arcpy.Polyline(arcpy.Array([p0, p1, p2]))
new_row = [new_geometry, row[1]]
ic.insertRow(new_row)
# 4. 调用SmoothLine工具(ArcGIS Pro正确语法)
print("正在平滑处理...")
# ArcGIS Pro的SmoothLine语法:
# arcpy.cartography.SmoothLine(in_features, out_feature_class, algorithm, tolerance, {endpoint_option}, {error_option})
# 方法1:使用BEZIER_INTERPOLATION算法
arcpy.cartography.SmoothLine(
in_features=temp_fc,
out_feature_class=curveline,
algorithm="BEZIER_INTERPOLATION",
tolerance="0", # 容差设为0
endpoint_option="NO_FIXED" # 不固定端点
)
# 5. 连接属性
print("正在连接属性...")
try:
arcpy.management.JoinField(curveline, "origin", input_line, "OBJECTID")
except:
try:
arcpy.management.JoinField(curveline, "origin", input_line, "OID")
except:
try:
arcpy.management.JoinField(curveline, "origin", input_line, "FID")
except Exception as join_err:
print(f"属性连接警告: {join_err}")
# 6. 删除临时字段
try:
arcpy.management.DeleteField(curveline, "origin")
except:
pass
# 7. 清理临时数据
try:
arcpy.Delete_management(temp_fc)
except:
pass
print(f"✓ 处理完成!")
print(f"输出要素类: {curveline}")
# 显示结果信息
if arcpy.Exists(curveline):
count = arcpy.GetCount_management(curveline)[0]
desc = arcpy.Describe(curveline)
print(f"生成要素数量: {count}")
print(f"几何类型: {desc.shapeType}")
except Exception as e:
print(f"✗ 处理失败: {str(e)}")
import traceback
traceback.print_exc()
# 清理临时数据
try:
arcpy.Delete_management("memory")
except:
pass
操作图片

(4)细节调整
调整符号,让更高值的线符号更粗,且覆盖等级更高(分享这点是因为小编在软件里找了半天)
1.单击图层后进入Feature Layer选项卡
2.进入Symbology选项卡
3.单击线符号后即可单独修改线符号
4.点击路网图标后进入Advanced,拖拽即可调整覆盖等级


2 写在后面
过程比较简单,但是小编每次使用都会忘记,也算是整理下做个备忘录吧。主要是已有帖子中,工具类和脚本类看评论都有各种报错,因此小编也想给大家分享个能直接使用的脚本。不过生成新要素后会丢失原有属性,可以使用【Add Join】恢复。
参考链接:
1.https://zhuanlan.zhihu.com/p/654791886;
2.https://blog.csdn.net/baidu_28157641/article/details/124437500
我是文狸,如果有任何疑问欢迎一起交流!欢迎关注梧桐GIS。