前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用ArcGIS Pro制作弧线OD图【ArcGIS Python系列】

利用ArcGIS Pro制作弧线OD图【ArcGIS Python系列】

作者头像
renhai
发布2023-11-24 16:31:31
4960
发布2023-11-24 16:31:31
举报

利用ArcGIS Pro制作弧线OD图

Origin-Destination(OD)图是一种用于可视化起点和终点之间关系的地理图表。它在空间上表示出不同地点之间的连接和流动。在OD图中,起点和终点通常用节点(点)表示,而它们之间的连接则用线段或弧线表示。

OD图常用于分析和展示交通、迁移、货物流动等领域的数据。它可以帮助我们理解不同地点之间的交互模式、流量分布和路径选择。通过OD图,我们可以识别热门起点和终点、主要交通走廊、流量密集区域等信息,从而支持规划、决策和优化。

在ArcGIS中,可以使用网络分析工具和OD矩阵分析来生成和可视化OD图。通过计算起点和终点之间的距离、时间或其他属性,可以将OD数据转换为图表形式,以便更直观地展示地理关系和流动模式。

有两种方法可以生成直线OD图:

一是通过起终点坐标和联系量的表(csv),通过XY转线工具生成连接线,因为这种方法的数据全部都通过其他方式生成了,适合嵌入工作流中;

二是通过起点要素和终点要素,使用生成起点-目的地链接 (分析)生成从起点要素到目的地要素生成连接线,适合纯ArcGIS Pro的工作流。

此处使用第一种方法。

准备OD数据

针对研究的内容,通过Python的相关操作生成了含有起点城市、终点城市、起点城市坐标、终点城市坐标和联系量的csv表格,导入arcgis如图所示:

image-20230907090555279

此表是代表的“2012年至2022年中国城市规划相关期刊作者所在城市间合作网络”数据,from_Xfrom_Y代表起点城市中心点的经纬度,坐标是WGS_1984。weight代表期刊合作作者所在城市间的联系次数。

此表数据在OD图文件夹中。

XY转线

image-20230907090148445

代码语言:javascript
复制
# XY转线的函数:
arcpy.management.XYToLine(in_table, out_featureclass, startx_field, starty_field, endx_field, endy_field, {line_type}, {id_field}, {spatial_reference}, {attributes})

运行XY转线工具会根据起点和终点坐标生成直线图,ID字段填写的字段可以保留到输出要素中,一般我们需要将权重值传递到输出要素中。

空间参考根据坐标系选择输入表的坐标系,

运行之后的直线OD图:

image-20230907082531373

直线转弧线

用到了公众号想去南方的小松鼠的一篇文章:《ArcGIS Pro曲线OD图》提供的直线转曲线工具脚本。

脚本实现了批量运行SmoothLine函数,避免手动一个个运行,你可以将以下脚本粘贴到ArcGIS Pro自带的jupyter notebook中运行,也可以使用工具箱。

脚本参数:必须需要输入一个投影坐标系下的直线要素类,输出一个曲线要素类。

使用Python代码运行
代码语言:javascript
复制
import arcpy

def addPoint(x0, y0, x2, y2):
    """计算弧线顶点坐标的函数"""
    if orientation == "顺向":
        x, y = (x2 + x0) / 2 - (y2 - y0) / radian, (y2 + y0) / 2 + (x2 - x0) / radian
    elif orientation == "逆向":
        x, y = (x2 + x0) / 2 + (y2 - y0) / radian, (y2 + y0) / 2 - (x2 - x0) / radian
    return x, y

if __name__ == '__main__':
    # 传入参数 用jupyter notebook需要修改下面四个参数
    input_line = arcpy.GetParameterAsText(0)  # 输入直线要素类
    curveline = arcpy.GetParameterAsText(1) # 输出曲线要素类
    radian = arcpy.GetParameter(2)  # 角度 单位为度 默认为10度
    orientation = arcpy.GetParameterAsText(3)  # 方向  "顺向"或者"逆向"

    # 创建一个临时线要素类addVertex
    addVertex = arcpy.CreateFeatureclass_management("in_memory", "addVertex", "POLYLINE",
                                                    spatial_reference=arcpy.Describe(input_line).spatialReference)

    arcpy.AddField_management(addVertex, "origin", "LONG")

    # 创建与line对应的折线并写入addVertex
    with arcpy.da.SearchCursor(input_line, ["SHAPE@", "OID@"]) as sc:
        with arcpy.da.InsertCursor(addVertex, ["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)
                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
    arcpy.cartography.CA.SmoothLine(addVertex, curveline, "BEZIER_INTERPOLATION", "", "", "NO_CHECK")

    # 将原始line的属性信息连接到curveline中
    try:
        arcpy.management.JoinField(curveline, "origin",
                                   input_line, "OID", )
    except:
        arcpy.management.JoinField(curveline, "origin",
                                   input_line, "FID", )

    # Delete in_memory
    arcpy.Delete_management("in_memory")
使用工具箱

此工具箱我放在了OD图文件夹中,将 生成弧线工具.tbx 放入项目文件夹或者直接导入文件夹下的工具箱就可以调用:

image-20230907091728525

image-20230907091535142

我们先要讲上一步生成的直线OD图进行投影,运行,更改以下符号系统,根据weight字段将符号系统设置为分级符号:

image-20230907092009625

创建新布局,加上标题,最终我们生成了弧线od图:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 renhailab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用ArcGIS Pro制作弧线OD图
    • 准备OD数据
      • XY转线
        • 直线转弧线
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档