最近做一个地图可视化的项目需要在地图上画出成都已开通的地铁线路图,中间还是踩了几个小坑,记录一下整个过程。
1. 开发环境
python 3.8
plotly(没安装的自行pip安装)
百度地图API(获取所有线路的地铁站点信息)
2. 效果展示
废话不多说,先上效果图。
3. 实现过程
百度地图开放平台获取站点信息(json格式)
百度坐标系转换到WGS-84坐标系
生成excel或csv表格
plotly绘制线路图
3.1 百度地图开放平台获取站点信息,链接直接上代码:
1
city_code=75 #成都市城市代码
station_info = requests.get('http://map.baidu.com/?qt=bsi&c=%s&t=%s' % (
city_code,
int(time.time() * 1000)
))
station_info_json = eval(station_info.content)
1234567
3.2 为什么要进行坐标转换
plotly用的是WGS-84坐标系,而百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理,百度转WGS-84还稍微有点复杂,不过有开源代码,直接拿来用就可以了。
12
简单科普一下国内常用的坐标系(至于为什么有几种不同坐标系请自行google):
地球坐标系——WGS84:常见于 GPS 设备,Google 地图等国际标准的坐标系。
火星坐标系——GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系。
百度坐标系——BD-09:百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理。
3.3 将json数据存为excel文件,一遍mapbox调用,excel文件的格式如下:
1
获取站点信息的完整代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 6 11:16:45 2020
Chengdu Metro Lines by plotly with python
@author: 进击的SB
"""
import requests
import time
import numpy as np
import math
# import plotly.offline as py
# import plotly.graph_objs as go
import pandas as pd
PI = math.pi
null = None
city_code=75
station_info = requests.get('http://map.baidu.com/?qt=bsi&c=%s&t=%s' % (
city_code,
int(time.time() * 1000)
))
station_info_json = eval(station_info.content)
# print(station_info_json)
# 解析地铁线路站点信息
for line in station_info_json['content']:
# i = 0
plots = []
plots_name = []
for plot in line['stops']:
plots.appen