目录
- 数据来源
- 文件管理
- 引用的库
- 获取文件夹名称
- 读取文件
- 提取转化为线文件
- 提取转化为点文件
- 主程序
- 最终成果
数据来源
通过在高德地图搜索框直接搜索地铁线路,地图上会高亮显示地铁线路。通过尝试发现图中第一行返回的就是地铁线路的详细数据内容。
与其他大佬的自动化获取不同,我下载数据的方式还是纯靠手动😅
文件管理
按照如下的文件目录存储方式建立项目文件夹:
|- 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下,因此在读取文件阶段就直接要求只提取目标字典下的数据内容。
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("主程序错误")
最终成果