🐱 算神的小窝 🤓

获取公交站点500米覆盖范围.md


CreationTime:9/24/2024 9:04:20 AM LastAccessTime:2/5/2025 9:58:03 AM


前言

很多人在分析覆盖范围时只是在地图上简单作圆,但现实的情况是各种复杂路况,步行500米并不能到达圆中的所有位置,故得出的覆盖率往往比实际情况偏大,所以本篇主要讲述如何获取步行能到500米的覆盖范围。

前期准备

站点坐标数据

准备一个包含站点名称、经纬度坐标的Excel文件,内容大致为

名称 经度 纬度
梧州南站 111.2154 23.39775
龙腾金院 111.2166 23.40081
中团变电站 111.2249 23.40481
... ... ...

获取方式:

  1. 通过地图网站抓取
  2. 在公交站点附近,通过“梧州公交小程序” -> 我的 -> 定位勘误 查看并记下

注册mapbox并获取token

这次需要使用mapbox提供的api,所以需要注册一下mapbox,已经有了的可以跳过此步。

要注册Mapbox并获取访问令牌,您可以按照以下步骤操作:

  1. 访问 Mapbox 官网 (https://www.mapbox.com/)。

  2. 点击页面顶部的 "Sign up" 按钮或 "Free account" 以开始注册流程。如果您已经有账户,请直接登录您的账户。

  3. 使用有效的电子邮件地址和密码填写相关信息并创建一个新账户,然后完成注册过程。

  4. 注册完成后,进入个人账户管理界面,在左侧导航栏中找到“Access tokens”选项卡。

  5. 在该页面上点击右上角的 "Create a new token" 按钮,为您的新令牌设置适当的权限和描述。请务必选择您需要的功能级别以及令牌的有效期(可选)。

  6. 确认所有信息无误后,点击“Create”按钮生成访问令牌。

  7. 请注意,一旦创建完成,这个访问令牌将是不可见的,请在需要使用时进行复制并妥善保存以备后续开发中使用。丢失了此访问令牌可能会导致无法正常使用Mapbox服务。

  8. 最后,在您的代码或项目中正确配置 Mapbox token 即可开始使用其提供的各种功能和服务。

完成以上步骤之后,您就成功获取了一个用于访问Mapbox地图API的token,可以将其应用于自己的开发项目中了。请注意保管好这个令牌以避免安全风险。

Python实现

import time
import requests
import pandas as pd
import geopandas as gpd
from shapely.geometry import Polygon
from concurrent.futures import ThreadPoolExecutor

def qingqiu(url,name,maxtries=5):
    if maxtries>0:
        try:
            res = requests.get(url=url).json()
            geometry = res['features'][0]['geometry']['coordinates'][0]
            infos[name]=geometry
        except Exception as e:
            print(e)
            time.sleep(2)
            qingqiu(url,name, maxtries-1)
    else:
        pass

def fn(name):
    global n
    lng = float(df[df['名称']==name]['经度'])
    lat = float(df[df['名称']==name]['纬度'])
    url = f'https://api.mapbox.com/isochrone/v1/mapbox/{type}/{lng},{lat}?{contours}={minute}&polygons=true&denoise=1&generalize=0&access_token={token}'
    qingqiu(url,name)
    print('---这是第'+str(n)+'个---')
    n += 1

if __name__ == '__main__':
    path = r'./data/梧州公交站点坐标.xlsx'
    token = '填入获取到的token'
    contours='contours_meters' #contours_minutes,contours_meters
    minute = '500'
    type = 'walking' #input('请输入出行方式(walking,cycling,driving):')
    t1 = time.time()
    df = pd.read_excel(path)
    names = list(df['名称'])

    infos={}
    n=0

    with ThreadPoolExecutor(3) as t:  # 线程池个数
        for name in names:
            t.submit(fn,name)

    gdf = gpd.GeoDataFrame({'geometry': [Polygon(geometry) for geometry in infos.values()],
            'name': [name for name in infos.keys()],
            'contour': minute,},
        crs='epsg:4326')
    gdf.to_file('./data/shp/梧州公交站点500米覆盖区域.shp',encoding='utf-8')
    t2 = time.time()
    print("数据采集完毕,用时{:.2f}秒".format(t2 - t1))
    print('导出shp文件done!')

后续步骤

把生成的shp文件导入到QGIS软件中就可以查看了。

An unhandled error has occurred. Reload 🗙