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。

相关推荐
rainy雨3 小时前
7S管理功能拆解:7S系统如何解决现场混乱与效率低下难题
信息可视化·精益工程
水梦雪幻3 小时前
GeoDa 空间回归分析
空间分析
Watermelo61721 小时前
【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦
前端·javascript·vue.js·信息可视化·性能优化·前端框架·设计规范
Elastic 中国社区官方博客2 天前
Elastic 为什么捐赠其 OpenTelemetry PHP 发行版
大数据·开发语言·elasticsearch·搜索引擎·信息可视化·全文检索·php
高洁012 天前
数据可视化实战:用AI工具制作专业数据分析图表
人工智能·python·深度学习·信息可视化·transformer
weiyvyy2 天前
信息化系统建设规划篇——蓝图设计与路径规划
大数据·信息可视化·信息化系统·企业信息化核心业务模块·信息化建设
zhang2008l2 天前
Python大数据可视化:基于大数据技术的共享单车数据分析与辅助管理系统_flask+hadoop+spider
大数据·python·信息可视化
ruanyongjing2 天前
Python中的简单爬虫
爬虫·python·信息可视化
weiyvyy2 天前
企业信息化系统的组成模块-数据与智能层
人工智能·信息可视化·信息与通信·信息化系统