利用ArcGIS Pro制作弧线OD图【ArcGIS Python系列】
利用 ArcGIS Pro 制作弧线 OD 图
Origin-Destination(OD)图是一种用于可视化起点和终点之间关系的地理图表。它在空间上表示出不同地点之间的连接和流动。在 OD 图中,起点和终点通常用节点(点)表示,而它们之间的连接则用线段或弧线表示。
OD 图常用于分析和展示交通、迁移、货物流动等领域的数据。它可以帮助我们理解不同地点之间的交互模式、流量分布和路径选择。通过 OD 图,我们可以识别热门起点和终点、主要交通走廊、流量密集区域等信息,从而支持规划、决策和优化。
在 ArcGIS 中,可以使用网络分析工具和 OD 矩阵分析来生成和可视化 OD 图。通过计算起点和终点之间的距离、时间或其他属性,可以将 OD 数据转换为图表形式,以便更直观地展示地理关系和流动模式。
有两种方法可以生成直线 OD 图:
一是通过起终点坐标和联系量的表(csv),通过XY转线
工具生成连接线,因为这种方法的数据全部都通过其他方式生成了,适合嵌入工作流中;
二是通过起点要素和终点要素,使用生成起点-目的地链接 (分析)
生成从起点要素到目的地要素生成连接线,适合纯 ArcGIS Pro 的工作流。
此处使用第一种方法。
准备 OD 数据
针对研究的内容,通过 Python 的相关操作生成了含有起点城市、终点城市、起点城市坐标、终点城市坐标和联系量的 csv 表格,导入 arcgis 如图所示:
此表是代表的“2012 年至 2022 年中国城市规划相关期刊作者所在城市间合作网络”数据,from_X
和from_Y
代表起点城市中心点的经纬度,坐标是 WGS_1984。weight
代表期刊合作作者所在城市间的联系次数。
XY 转线
# 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 图:
直线转弧线
用到了公众号想去南方的小松鼠
的一篇文章:《ArcGIS Pro 曲线 OD 图》提供的直线转曲线工具脚本。
脚本实现了批量运行SmoothLine
函数,避免手动一个个运行,你可以将以下脚本粘贴到 ArcGIS Pro 自带的 jupyter notebook 中运行,也可以使用工具箱。
脚本参数:必须需要输入一个投影坐标系下的直线要素类,输出一个曲线要素类。
使用 Python 代码运行
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
放入项目文件夹或者直接导入文件夹下的工具箱就可以调用:
我们先要讲上一步生成的直线 OD 图进行投影
,运行,更改以下符号系统,根据weight
字段将符号系统设置为分级符号:
创建新布局,加上标题,最终我们生成了弧线 od 图:
文章索引
【ArcGIS Python 系列】系列笔记为学习 ArcGIS Pro 和
Arcpy
过程中的总结,记下来方便回看,最新版本会优先发布在我的博客和GITHUB。
【ArcGIS Python 系列】教程部分:
- 一、Arcpy 介绍和安装【ArcGIS Python 系列】
- 二、ArcGIS Pro 和 ArcMap 的区别【ArcGIS Python 系列】
- 三、Arcpy 基础【ArcGIS Python 系列】
- 四、探索空间数据【ArcGIS Python 系列】
- 五、处理地理数据异常【ArcGIS Python 系列】
- 六、处理几何数据【ArcGIS Python 系列】
- 七、处理栅格数据【ArcGIS Python 系列】
- 八、制图模块【ArcGIS Python 系列】
- 九、自定义工具箱【ArcGIS Python 系列】
- 十、ArcGIS_Pro 常见问题【ArcGIS Python 系列】
- 利用 ArcGIS Python 批量处理地理数据的坐标系
- 使用 ArcGIS Python 检测洪水影像的区域
- 利用 ArcGIS_Python 制作考虑路况的交通等时圈
- 利用 ArcGIS Pro 制作弧线 OD 图【ArcGIS Python 系列】
- 使用 ArcGIS Pro 对卫星图进行建筑轮廓识别和车辆检测
- ArcGIS_Pro 官方课程整理
- 持续更新…
【ArcGIS Python 系列】jupyter notebook:
- 4.2.3-arcpy 基础(代码练习).ipynb
- 4.2.4-探索空间数据(代码练习).ipynb
- 4.2.5-示例 1:使用 Arcpy 进行 GIS 人口空间分布数据探索.ipynb
- 4.2.7-处理几何数据代码练习和示例 2.ipynb
- 4.2.8-栅格数据(代码练习).ipynb
- 4.2.9-制图模块.ipynb
- 4.2.12-实操 1-利用 Python 批量处理地理数据的坐标系.ipynb
- 4.2.13-实操 2-使用 Python 对图像中的洪水进行分类.ipynb
- 4.2.14-实操 3-制作考虑路况的交通等时圈.ipynb
如果你觉得本系列文章有用,欢迎关注博客,点赞 👍 和收藏,也欢迎在评论区讨论,也欢迎访问我的爱发电支持我,或者对此文章进行赞赏。