Python应用指南:获取高德地铁站点数据(单城市版)

书接上文,上篇文章是一次性下载全国所以城市的地铁站点数据,但是可视化的过程需要手动把换乘站给一个个复制出来分配到其他各个经过的线路,还需要核对站点顺序不能出错,如果只需要单个城市的数据呢?另外能不能直接生成shp图层?本篇文章就提出了优化方案,优化了脚本来抓取高德地图地铁站点数据,并给出excel或shp文件的下载方式以供选择。

获取单个城市的地铁数据,数据来源:高德地图 | 地铁图 (amap.com)

打开开发者模式快捷键Ctrl+Shift+I ,找到这个文件,双击打开;

我们就可以看到储存的地铁站点数据,包括城市编码、线路名称、线路编码、站点名称、站点编码、经度、纬度、POI编码、站点拼音等一系类标签,我们的目的就是获取这些信息,接下来直接放出完整代码,老规矩直接copy直接运行即可;

完整代码#运行环境Python 3.11

import requests
import geopandas as gpd
import pandas as pd
from datetime import datetime


def get_railway_stop(city_name, save_file=''):
    """
    数据来源于高德地图: https://ditu.amap.com/

    :param city_name: 要爬取的地铁城市名,要正确输入
    :param save_file: 是否保存为文件
                     1 表示存成 Excel 文件
                     2 表示存成 Shapefile 文件
    """

    def fetch_city_list():
        """
        获取可以爬取地铁信息的城市列表

        :return: 城市列表的 JSON 数据或 None(如果请求失败)
        """
        try:
            # 发送 GET 请求获取城市列表
            response = requests.get('https://map.amap.com/service/subway?_1707184339116&srhdata=citylist.json')
            response.raise_for_status()  # 如果响应状态码不是 200,将抛出 HTTPError 异常
            return response.json()
        except requests.RequestException as e:
            # 打印错误信息
            print(f"Failed to fetch city list: {e}")
            return None

    def fetch_subway_data(adcode, spell):
        """
        根据城市编号和拼音获取地铁数据

        :param adcode: 城市编号
        :param spell: 城市拼音
        :return: 地铁数据的 JSON 数据或 None(如果请求失败)
        """
        try:
            # 构造带有动态时间戳的 URL
            url = f'https://map.amap.com/service/subway?&_={int(datetime.now().timestamp())}&srhdata={adcode}_drw_{spell}.json'
            # 发送 GET 请求获取地铁数据
            response = requests.get(url)
            response.raise_for_status()  # 如果响应状态码不是 200,将抛出 HTTPError 异常
            return response.json()
        except requests.RequestException as e:
            # 打印错误信息
            print(f"Failed to fetch subway data: {e}")
            return None

    # 获取城市列表
    citylist = fetch_city_list()
    if citylist is None:
        # 如果获取城市列表失败,则返回 None
        return None

    # 查找指定城市的拼音和编号
    city_info = next((city for city in citylist['citylist'] if city['cityname'] == city_name), None)
    if not city_info:
        # 如果找不到指定城市,则输出错误信息并返回 None
        print('城市名输入错误')
        return None

    # 获取该城市的拼音
    spell = city_info['spell']
    # 获取该城市的编号
    adcode = city_info['adcode']
    # 获取地铁数据
    subway_data = fetch_subway_data(adcode, spell)

    if subway_data is None:
        # 如果获取地铁数据失败,则返回 None
        return None

    # 获取文件名,例如 '深圳市地铁'
    filename = subway_data['s']
    # 初始化存储地铁站数据的列表
    station_data = []

    for line in subway_data['l']:
        # 遍历每条线路的地铁站
        for station in line['st']:
            # 将每个地铁站的信息添加到列表中
            station_data.append({
                'name': station['n'],  # 地铁站名
                'line': f"{line['kn']} {line['la']}",  # 地铁线路名
                'color': line['cl'],  # 地铁线路颜色
                'poiid':  station['poiid'], # 地铁线路id
                'lon': station['sl'].split(',')[0],  # 经度
                'lat': station['sl'].split(',')[1],  # 纬度
                'transfer': station['t']  # 是否换乘站 (1: 是)
            })

    # 创建 DataFrame
    stations_df = pd.DataFrame(station_data)
    # 将经度和纬度列转换为数值类型
    stations_df[['lon', 'lat']] = stations_df[['lon', 'lat']].apply(pd.to_numeric)

    # 保存数据
    if save_file == 1:
        # 存成 Excel 文件
        stations_df.to_excel(f'{filename}.xlsx', index=False)
        print(f"Data saved to {filename}.xlsx")
    elif save_file == 2:
        # 存成 Shapefile 文件
        # 将 DataFrame 转换为 GeoDataFrame
        geo_stations_df = gpd.GeoDataFrame(stations_df,
                                           geometry=gpd.points_from_xy(stations_df['lon'], stations_df['lat']),
                                           crs='EPSG:4326')
        # 保存为 Shapefile 文件
        geo_stations_df.to_file(f'{filename}.shp', driver='ESRI Shapefile', encoding='utf-8')
        print(f"Data saved to {filename}.shp")

    # 返回 DataFrame
    return stations_df


# 上海市地铁站点坐标数据
get_railway_stop(city_name='上海市', save_file=1)

需要调整成其他城市,直接改下面的城市,另外这里提供了二种数据下载方式,也就是下面的1是Excel 格式,2是shp的点图层格式;

# 上海市地铁站点坐标数据
get_railway_stop(city_name='上海市', save_file=1)

Excel 格式;

shp的点图层格式,同时直接检索【点集转线】,且线字段选择line即可连成直线,方法在上篇文章里详细说明过;

同样的由于我们拿到的数据是高德坐标系GCJ02,但我们通常的数据源可能是WGS84,所以我们需要转一下地理坐标系,关于如果点集转线和坐标系批量转换可以参考上篇文章,链接也放在这里:Python应用指南:获取高德地铁站点数据(全国版)-CSDN博客

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于Python编写的中国城市轨道交通数据可视化分析项目源码+项目说明.zip ## 概述 > - 本项目是一个基于 Python 的简数据可视化分析的小Demo。通过这个项目可以练习使用Python数据可视化分析相关的强大的库和模块,练习绘制简的GUI界面并且连接数据库,更加深了对Python语言的学习和拓展。本项目也可作为学校的大作业、大实验实践或者课程设计等的选题项目。 > - 本项目通过多线程爬虫获取高德地图中的中国轨道交通的一些数据信息,高德地图这个权威的网站也保证了数据的完整可靠性,然后进行了一些简并且有趣的数据可视化分析,另外还设计了一个GUI界面,查询数据库或者文件中的一些信息。 > > - 如发现文档中或者源代码中有错误,欢迎大家在 `Issues` 中研究讨论,欢迎大家 `Fork` 和 `Pull requests` 改善代码,十分感谢! ## 使用语言 - Python 3 ## 主要技术 * **网络编程** * **多线程** * **文件操作** * **数据库编程** * **GUI** * **数据分析** ## 导入的库和模块 ```python import json import requests from bs4 import BeautifulSoup import sqlite3 import threading import tkinter as tk from tkinter import scrolledtext import pandas as pd from pyecharts import Line, Bar, Geo import numpy as np from wordcloud import WordCloud, ImageColorGenerator import jieba import matplotlib.pyplot as plt import seaborn as sns ``` ## 项目整体思路 1. 网页分析 2. 多线程爬虫爬取信息 3. 数据保存至文件中和数据库中 4. 利用 tkinter 绘制 GUI 界面,实现查询线路和站点两个功能 5. 数据可视化分析 (1)直接控制台显示分析结果 (2)绘制中国地图、柱状图等,生成 .html 文件 (3)绘制词云 (4)绘制柱状图、饼状图、折线图、散图、双变量图等,生成 .png 文件 ## 运行 - 分别运行`src`文件夹中的`.py`文件即可 ## 部分运行结果样例 .....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨超越luckly

买猫粮,楼下的流浪猫在等我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值