写在前面的话
毕业好久啦,决定整理一下本科期间的代码。这篇是和我的毕业论文相关的,使用复杂网络理论,结合ArcMap、Networkx工具对中外城市的路网进行简单的分析。
首先我们需要下载所需的路网数据,需要在GADM上获取行政区划数据,在ArcMap中进行简单的属性筛选,选出我们研究的道路,再通过栅格化的方法,将道路双线转单线。
最后使用networkx进行分析就可以啦。现在想来最烦的流程就是道路数据的获取和预处理。
这里分享一下我的复杂网络分析部分的代码
import geopandas as gpd
import networkx as nx
cities = ['Beijing', 'Shenzhen', 'Wuhan', 'Chengdu', 'WashingtonDC', 'SanFrancisco', 'Atlanta', 'Rome']
networks = []
node_numbers = []
edge_numbers = []
for city in cities:
# 读取节点数据
nodes_path = '文件路径'+'{0}\\{1}Net.shp'.format(city,city)
nodes_gdf = gpd.read_file(nodes_path)
# 排序
nodes_gdf_sorted = nodes_gdf.sort_values(by='JOIN_FID')
# 创建网络模型
G = nx.Graph()
# 添加节点
# 我们可以直接从geometry列中提取坐标
# 注意:这里假设geometry列是Point类型,并且包含X和Y坐标
for index, row in nodes_gdf.iterrows():
if row['TARGET_FID'] not in G.nodes():
# 提取坐标
x, y = row['geometry'].x, row['geometry'].y
G.add_node(row['TARGET_FID'], pos=(x, y))
# 添加边
# gdf中的每条边,添加到图中
i = 1
start_node = 0
end_node = 0
for index, row in nodes_gdf_sorted.iterrows():
if i % 2 == 1:
# 获取起始节点
start_node = int(row['TARGET_FID'])
else:
end_node = int(row['TARGET_FID'])
if start_node != end_node:
# 添加边到图中,同时设置边的属性
G.add_edge(start_node, end_node)
i = i + 1
# 检查无向图是否连通
if not nx.is_connected(G):
# 获取图中的连通分量
connected_components = list(nx.connected_components(G))
# 选择最大连通分量进行计算
largest_component = max(connected_components, key=len)
# 构建选择最大连通分量后的子图
subgraph = G.subgraph(largest_component)
G = subgraph
node_numbers.append(nx.number_of_nodes(G))
edge_numbers.append(nx.number_of_edges(G))
print('{0}:节点数:{1} 边数:{2}'.format(city,nx.number_of_nodes(G),nx.number_of_edges(G)))
networks.append(G)
需要完整的分析代码或地图文件可以下载