基于transbigdata包获取线路和站点的邻接表及shp文件

发布时间 2023-09-22 20:38:07作者: Victooor_swd
import pandas as pd
import numpy as np
import geopandas as gpd
import transbigdata as tbd
import json
import csv
import networkx as nx
#输入需要的城市
place='深圳'
#输入需要的线路
line_range=[14,15,16,20]
#遍历线路列表,挨个处理
for x in line_range:
    try:
        #使用transbigdata包获取线路和站点
        #注:代码中所有使用文件路径的部分均需要自行设置路径
        line,stop = tbd.getbusdata(place,['地铁{}号线'.format(x)])
        print(stop)
        #将返回的geodataframe文件保存为shp文件,可以用GIS直接打开
        line.to_file('F:/test/shp文件/{}号线线路.shp'.format(x),driver='ESRI Shapefile',encoding='utf-8')#替换为自己的路径
        stop.to_file('F:/test/shp文件/{}号线站点.shp'.format(x),driver='ESRI Shapefile',encoding='utf-8')#替换为自己的路径
        #将geodataframe中的重要信息保存为csv文件
        dataframe_stop = pd.DataFrame({'stationname':stop['stationnames'],'line_name':stop['linename'],'lon':stop['lon'],'lat':stop['lat']})
        dataframe_line = pd.DataFrame({'linename':line['linename'],'line':line['line'],'geometry':line['geometry']})
        num=int(len(stop))
        dataframe_stop.head(num).to_csv("F:/test/站点信息{}号线.csv".format(x),index=False,sep=',',)#替换为自己的路径
        dataframe_line.to_csv("F:/test/线路信息{}号线.csv".format(x),index=False,sep=',')#替换为自己的路径
        data = pd.read_csv(r'F:/test/站点信息{}号线.csv'.format(x),sep=',',usecols=['stationname'])#替换为自己的路径
        #使用transbigdata中的模块构建站点邻接表和距离信息
        metroline_splited = tbd.split_subwayline(line,stop)
        fro = metroline_splited['stationnames']
        target = metroline_splited['stationnames1']
        length = metroline_splited["length"]
        dataframe_table = pd.DataFrame({'from':fro,'target':target,'length':length})
        dataframe_table.to_csv('F:/test/总邻接表.csv',mode='a',index=False,sep=',',encoding='ANSI')
        #未能成功获取报错并储存为txt文件
    except (KeyError,AttributeError,FileNotFoundError):
        print(r'{}号线未能成功获取'.format(x))
        with open("F:/test/Errorlog.txt","a") as log:#替换为自己的路径
            log.write(r'{}号线未能成功获取'.format(x))
            log.write('\n')
            log.close()
        pass
        continue
#根据总邻接表构建邻接矩阵(此步骤可有可无,看个人需求)
try:
    relation_cp = pd.read_csv("F:/test/总邻接表.csv",usecols = ['from','target'],sep=',')#替换为自己的路径
    relation_list = relation_cp.values.tolist()
    print(relation_list)
    member_dict = {}
    member_index = 0
    for name_tuple in relation_list:
        for name in name_tuple:
            if name in member_dict:
                continue
            member_dict[name] = member_index
            member_index += 1
    relation_matrix = [[0 for i in range(len(member_dict))]
                for i in range(len(member_dict))]
    for (x, y) in relation_list:
        x_index = member_dict[x]
        y_index = member_dict[y]
        relation_matrix[x_index][y_index] = 1
    print(relation_matrix)
    with open("F:/test/总邻接矩阵.csv","a",newline='') as csvfile:#替换为自己的路径
        writer = csv.writer(csvfile, delimiter=',')
        for i in relation_matrix:
            writer.writerow(i)
        csvfile.close()
except (KeyError,AttributeError,FileNotFoundError):
    pass