复杂网络理论在研究城市路网结构的应用

写在前面的话

毕业好久啦,决定整理一下本科期间的代码。这篇是和我的毕业论文相关的,使用复杂网络理论,结合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)

在这里插入图片描述
需要完整的分析代码或地图文件可以下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值