目录

  • 数据来源
  • 文件管理
  • 引用的库
  • 获取文件夹名称
  • 读取文件
  • 提取转化为线文件
  • 提取转化为点文件
  • 主程序
  • 最终成果


数据来源

通过在高德地图搜索框直接搜索地铁线路,地图上会高亮显示地铁线路。通过尝试发现图中第一行返回的就是地铁线路的详细数据内容。

python高德地图 python高德地图火车换乘_python


与其他大佬的自动化获取不同,我下载数据的方式还是纯靠手动😅

文件管理

按照如下的文件目录存储方式建立项目文件夹:

|- jsondata                  #用于存储原始json数据
	||- city1                #按照城市建立文件夹,分城市存储数据
	||- city2
	||- city3
		|||- line_1.json     #按照路线存储为不同的json数据
		|||- line_2.json
|- geojson                   #存储生成的geojson数据
	||- lines                #存储不同城市地铁线路的数据
		|||- city1.geojson   #按城市存储线路的geojson数据
		|||- city2.geojson        
	||- stations             #存储不同城市地铁站点数据
		|||- city1.geojson   #按城市存储站点的geojson数据
		|||- city2.geojson

引用的库

#用于读取文件的读取和写入
import os   
#用于解析json数据                
import json                 
#用于生成geojson
from geojson import Feature,Point, LineString, FeatureCollection

获取文件夹名称

传入一个文件夹路径rootpath,最终得到的就是该目录下文件的名称 列表

def filenames(rootpath):
    try:
        filenames_list = os.listdir(rootpath)
        print(filenames_list)
        return filenames_list
    except:
        print("文件名获取失败")

读取文件

传入一个文件夹路径json_name,最终得到的就是该目录下json文件。因为需要的数据都存储在busline_list下,因此在读取文件阶段就直接要求只提取目标字典下的数据内容。

python高德地图 python高德地图火车换乘_python高德地图_02

def filereader(json_name):
    try:
        with open(json_name,"r",encoding='utf-8') as rawjson_data:
            #将json数据转化为字典数据
            load_json = json.load(rawjson_data)
        busline_list = load_json['data']['busline_list']
        return busline_list
    except:
        print("文件读取错误")

提取转化为线文件

def line(busline_list,line_features):
    '''
    由于busline_list当中包含了双向的地铁线路以及不同分段的地铁数据,因此需要
    1.剔除重复线路的数据,
    2.选用busline_list列表中奇数序号的元素    
    '''
    try:
        for line_id in range(0,len(busline_list),2):
            try:
            	#一定要把公交线路数据筛掉[type为2的就是地铁数据]
                if(busline_list[line_id]['type']=='2'):
                        linename = busline_list[line_id]['name'].split("(")[0]
                        front_name = busline_list[line_id]['front_name']
                        terminal_name = busline_list[line_id]['terminal_name']
                        #这里需要组合经纬度坐标
                        lons = busline_list[line_id]['xs'].split(",")
                        lats = busline_list[line_id]['ys'].split(",")
                        cor = []
                        for cor_i in range(len(lons)):
                            tem_cor = (float(lons[cor_i]),float(lats[cor_i]))
                            cor.append(tem_cor)
                        line_feature = Feature(geometry=LineString(tuple(cor)),properties={
                                    "name":linename,"front_name":front_name,"terminal_name":terminal_name})
                        line_features.append(line_feature)
                else:
                    continue
            except:
                print("线路循环出错")
        return line_features      
    except:
        print("线路获取错误")

提取转化为点文件

def point(busline_list,subwaypointFeatures):
    '''
    由于busline_list当中包含了双向的地铁线路以及不同分段的地铁数据,因此需要
    1.剔除重复线路的数据,
    2.选用busline_list列表中奇数序号的元素
    3.剔除type不为2的元素    
    '''
    try:
        
        for stations_id in range(0,len(busline_list),2):
            try:
#                print(type(busline_list[stations_id]['type']))
                #判断buslist下的type属性是否为2,即是否为地铁数据
                if(busline_list[stations_id]['type']=='2'):
                        line_name = busline_list[stations_id]['name']
                        # 这里循环提取站点坐标
                        for station_id in range(len(busline_list[stations_id]['stations'])):
                            try:
                                station_name = busline_list[stations_id]['stations'][station_id]['name']
                                station_num = busline_list[stations_id]['stations'][station_id]['station_num']
                                station_cor_raw = busline_list[stations_id]['stations'][station_id]['xy_coords'].split(";")
                                station_lon = float(station_cor_raw[0])
                                station_lat = float(station_cor_raw[1])
                                station_cor = (station_lon,station_lat)
                                station_feature = Feature(geometry=Point(tuple(station_cor)),properties={
                                        "station_num":station_num,
                                        "line_name":line_name,
                                        "station_name":station_name
                                        })
                                print()
                                subwaypointFeatures.append(station_feature)
                            except:
                                print("站点提取出错")
                else:
                    continue
            except:
                print("站点循环出错")
        return subwaypointFeatures
    except:
        print("站点获取错误")

主程序

def main():
    try:
        rootpath = '存储json数据的路径名称'
        '''
        这里先读取json数据文件夹当中的文件夹名称
        判断文件当中是否有文件
        如果有文件那么执行相应的文件
        '''
        #获取文件夹名称
        foldname = filenames(rootpath)
        #遍历各个文件夹
        for fold_i in range(len(foldname)):
            try:
                subwaylineFeatures = []
                subwaypointFeatures = []
                #判断文件夹里面是否有内容
                #确定文件夹地址
                filepath = rootpath + "/"+foldname[fold_i]
                if(len(filenames(filepath))>0):
                    #如果文件夹当中有文件,那么开始清洗数据
                    #获取各条地铁线路数据名称
                    dataname = filenames(filepath)
                    for file_i in range(len(dataname)):
                        try:
                            datapath = rootpath + "/" +foldname[fold_i]+ "/" +dataname[file_i]
                            buslist_data = filereader(datapath)
                            line(buslist_data,subwaylineFeatures)
                            point(buslist_data,subwaypointFeatures)
                        except:
                            print("dataname")
                    line_feature_collection = FeatureCollection(subwaylineFeatures)
                    point_feature_collection = FeatureCollection(subwaypointFeatures)
                    
                    #这里尝试使用文件夹作为文件名称
                    line_name = '存储geojson线文件的文件夹路径' + '/' +foldname[fold_i] + '.geojson'
                    print(line_name)
                    point_name = '存储geojson点文件的文件夹路径' + '/' +foldname[fold_i] + '.geojson'
                    with open(line_name,'w') as f1:
                        json.dump(line_feature_collection,f1)
                    with open(point_name,'w') as f2:
                        json.dump(point_feature_collection,f2)
                    
                else:
                    print("else")
                    continue
            except:
                print("遍历文件夹有问题")
    except:
        print("主程序错误")

最终成果

python高德地图 python高德地图火车换乘_json_03


python高德地图 python高德地图火车换乘_python高德地图_04