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

news2024/9/27 19:23:27

书接上文,上篇文章是一次性下载全国所以城市的地铁站点数据,但是可视化的过程需要手动把换乘站给一个个复制出来分配到其他各个经过的线路,还需要核对站点顺序不能出错,如果只需要单个城市的数据呢?另外能不能直接生成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博客;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【复杂系统系列(初级)】自动调节动态平衡模型——生物体的稳态机制

【通俗理解】自动调节动态平衡模型——生物体的稳态机制 关键词提炼 #自动调节 #动态平衡 #生物体稳态 #反馈机制 #体温调节 #微分方程模型 第一节:自动调节动态平衡模型的类比与核心概念 1.1 自动调节动态平衡模型的类比 自动调节动态平衡模型可以被视为生物体…

grpc-spring 通信(监控视频传输)

先看效果 这是微软相机,22ms延迟 (不走网络存粹寄存器和内存的通信)这是程序抓取摄像头然后传给client,client的java窗口展示的,延时也是22ms(对了localhost好像也不走网络吧) 几个点 1.openc…

大功率舞台灯调光调色方案 | 支持深度调光,多路输出调光 36V/48V/60V FP7126

在舞台演出中,灯光扮演着非常重要的角色,它不仅可以烘托氛围,营造氛围,更能够为表演者增添光彩,塑造形象。在博物馆场所中,突出展品细节。根据灯光用途和适用类型,舞台灯可以细分为聚光灯、泛光…

foundation model

目录 多模态预训练模型 BLIP LLM GPT3 InstructGPT FLAN chain of thought ToolFormer QWEN Llama3 VLM QWen-VL VideoChat Video-ChatGPT 应用 DriveVLM PlanAgent 多模态预训练模型 CLIP BLIP 《Bootstrapping Language-Image Pre-training for Unified Visi…

突发!Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情?

突发!2024年8月29日Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情? 🧐 今天我们来聊一聊科技圈一则爆炸性消息:Runway ML 从 HuggingFace 和 GitHub 上删库跑路,毫无预警!这个举动…

基于asp.net的在线考试系统源码分享

这是一个基于asp.net的开发的在线考试系统,需要的小伙伴自己参考源码,下载链接我放在后面了。 1.主要功能 主要功能包含用户注册登陆、学生登录、老师登陆、试卷管理、分数管理、 填空题选择、选择题管理、题库管理、分数管理、试卷随机生成等等模块。…

【精选】基于Django的智能水果销售系统设计与实现

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

面试必问的 Linux 命令帮你整理好啦...

01.背景 作为一名测试工程师,Linux 是必须要掌握的一项技能。 因为大部分的互联网公司的项目都是搭建和部署在 Linux 服务器上的,所以测试就算不去负责搭建和维护测试环境,也需要在测试过程中去服务器那边定位测试中的问题。 所以&#xf…

PTA L1-027 出租

L1-027 出租(20分) 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]2 对应 arr[2]1,index[1]0 对应 arr[0…

这四种人不能合作做生意

合伙创业千万不要和这四种人合伙,不然公司做大了都不是你的! 一、不愿出钱的人,不愿出钱就不会有决心。公司一旦有风吹草动,最先跑路的都是没有出钱的。 二、不愿付出时间的人,想用业余时间参与,不愿全身心…

Unity编辑器扩展之Hierarchy面板扩展

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity编辑器扩展之Hierarchy面板扩展 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取&#xff…

css-functions-图形函数

概述 本文会讨论和图形函数有关的 5 个函数,分别是:inset、circle、ellipse、polygon和path。这个 5 个图形函数也对应着相应的<basic-shape>。 <basic-shape>是一种表现基础图形的 CSS 数据类型,作用于clip-path或shape-outside属性中;而其值是由图形函数获…

sfud移植

sfud移植 首先看readme文档 文件结构 inc文件夹&#xff1a;各种头文件&#xff0c;注意flash_def和cfg头文件 port文件夹&#xff1a;接口文件 src文件夹&#xff1a;代码源文件 移植 基础&#xff1a;你的SPI没问题&#xff0c;用普通工程可以正常操作Flash 首先打开f…

cloudways相关

服务器优惠链接&#xff1a; https://www.cloudways.com/en/?id1081165 cloudways 后台清缓存位置&#xff1a; 网站迁移到cloudways&#xff08;用cloudways的自动迁移插件&#xff09;&#xff1a; 不管原网站是不是用的cloudways主机&#xff0c;都可以用这个方法。 1…

【React】react项目安装tailwindcss

创建React项目 首先,如果您还没有React项目,可以使用以下命令创建一个新项目: npx create-react-app my-tailwind-app cd my-tailwind-app安装Tailwind CSS 接下来,按照以下步骤安装Tailwind CSS: 安装必要的依赖: npm install -D tailwindcss postcss autoprefixer初始化…

Kubernetes 1.31 新功能: 细粒度补充组控制

这篇文章讨论了 Kubernetes 1.31 中的一个新特性&#xff0c;用于改善 Pod 中容器的补充组&#xff08;Fine-grained SupplementalGroups control&#xff09;处理。 动机&#xff1a;在容器镜像中的 /etc/group 定义的隐式组成员身份 尽管这种行为可能并不受许多 Kubernetes…

Redis安装+常用命令合集大全+Redis Desktop Manager

文章目录 一&#xff1a;Redis 简介二&#xff1a;安装和配置Redis第一步&#xff1a;下载Redis第二步&#xff1a;解压Redis第三步&#xff1a;配置Redis第四步&#xff1a;启动Redis服务器第五步&#xff1a;验证Redis安装第六步&#xff1a;设置Redis为全局命令 三&#xff…

不同品类商标一样属于侵权吗!

商标分类有45类&#xff0c;有网友问普推知产商标老杨&#xff0c;不同品类商标一样属于侵权吗&#xff0c;这个要从多个角度来分析&#xff0c;不同品类商标是相同一样的&#xff0c;这样的基本不侵权的。 在注册申请商标是会经常遇到别人在某类别注册&#xff0c;但是有一些类…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80&#xff0c;443&#xff0c;445&#xff0c;3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

各个击破:NetXpert XG2帮您解决“布线安装与维护”难题

在传输大量数据时&#xff0c;光纤变得越来越重要&#xff0c;而铜缆在未来也将继续发挥重要作用&#xff0c;因此我们不仅要比较两种类型布线的优缺点&#xff0c;还要探究光纤传输中的错误来源。 测试光缆传输损耗的准确性对于故障排除至关重要&#xff0c;特别是在光纤情况下…