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。

相关推荐
小旭95274 小时前
分布式事务 Seata 详解 + 链路追踪 SkyWalking 实战
java·分布式·后端·信息可视化·skywalking
财经资讯数据_灵砚智能5 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月28日
人工智能·python·信息可视化·自然语言处理·ai编程
Wenzar_5 小时前
# D3.js实战进阶:从基础图表到交互式数据仪表盘的全流程构建在现代前端开发中,**数据可视化已成为提升用户体验的核心能力之一
java·javascript·python·信息可视化·ux
AI玫瑰助手5 小时前
Python基础:集合的定义、去重与交并差运算
开发语言·python·信息可视化
实用科研工具箱7 小时前
生物医学科研工具测评:绘图、数据可视化、素材一站式整理
信息可视化·数据挖掘·数据分析·科研·科研绘图·科研绘图工具
Elastic 中国社区官方博客21 小时前
Elasticsearch:智能搜索 - AI builder 及 skills
大数据·人工智能·elasticsearch·搜索引擎·ai·信息可视化·全文检索
丷丩1 天前
从“失忆工具“到“智能助手“:GeoAI平台的Agent架构演进
人工智能·架构·gis·空间分析·geoai
GIS地信小匠1 天前
(34)ArcGIS Pro 要素折点转点工具:线面节点批量提取实操
arcgis·空间分析·数据处理·gis教程·arcgls pro
木斯佳1 天前
HarmonyOS 数据可视化实战:封装自定义值机控件实操记录与复盘
信息可视化·harmonyos