ArcGIS小技巧:起讫(Origin-Destination,OD)流量数据可视化教程

起讫点(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。

相关推荐
vx_biyesheji00013 小时前
计算机毕业设计:Python网约车订单数据可视化系统 Django框架 可视化 数据大屏 数据分析 大数据 机器学习 深度学习(建议收藏)✅
大数据·python·机器学习·信息可视化·django·汽车·课程设计
财经资讯数据_灵砚智能1 天前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月5日
大数据·人工智能·python·信息可视化·自然语言处理·ai编程
赵钰老师2 天前
【ADCIRC】基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术应用
python·信息可视化·数据分析
计算机学姐2 天前
基于SpringBoot的兴趣家教平台系统
java·spring boot·后端·spring·信息可视化·tomcat·intellij-idea
GIS地信小匠2 天前
(22)ArcGIS Pro 联合与标识分析:全范围合并、属性标记,空间叠加双核心工具
arcgis·空间分析·数据处理·gis教程·arcgls pro
城数派2 天前
谷歌18亿建筑足迹数据集 Google Open Buildings V3
数据库·arcgis·信息可视化·数据分析·excel
GIS地信小匠2 天前
(24)ArcGIS Pro 字段计算与几何属性:赋值拼接、条件判断及面积坐标自动计算
arcgis·空间分析·数据处理·gis教程·arcgls pro
J2虾虾2 天前
数据可视化
信息可视化
GIS地信小匠2 天前
(23)ArcGIS Pro 空间连接与缓冲区分析:属性传递、多环缓冲区实战全攻略
arcgis·arcgis pro·空间分析·数据处理·gis教程
财经资讯数据_灵砚智能2 天前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月4日
大数据·人工智能·python·信息可视化·自然语言处理·ai编程