前言
很多人在分析覆盖范围时只是在地图上简单作圆,但现实的情况是各种复杂路况,步行500米并不能到达圆中的所有位置,故得出的覆盖率往往比实际情况偏大,所以本篇主要讲述如何获取步行能到500米的覆盖范围。
前期准备
站点坐标数据
准备一个包含站点名称、经纬度坐标的Excel文件,内容大致为
名称 | 经度 | 纬度 |
---|---|---|
梧州南站 | 111.2154 | 23.39775 |
龙腾金院 | 111.2166 | 23.40081 |
中团变电站 | 111.2249 | 23.40481 |
... | ... | ... |
获取方式:
- 通过地图网站抓取
- 在公交站点附近,通过“梧州公交小程序” -> 我的 -> 定位勘误 查看并记下
注册mapbox并获取token
这次需要使用mapbox提供的api,所以需要注册一下mapbox,已经有了的可以跳过此步。
要注册Mapbox并获取访问令牌,您可以按照以下步骤操作:
访问 Mapbox 官网 (https://www.mapbox.com/)。
点击页面顶部的 "Sign up" 按钮或 "Free account" 以开始注册流程。如果您已经有账户,请直接登录您的账户。
使用有效的电子邮件地址和密码填写相关信息并创建一个新账户,然后完成注册过程。
注册完成后,进入个人账户管理界面,在左侧导航栏中找到“Access tokens”选项卡。
在该页面上点击右上角的 "Create a new token" 按钮,为您的新令牌设置适当的权限和描述。请务必选择您需要的功能级别以及令牌的有效期(可选)。
确认所有信息无误后,点击“Create”按钮生成访问令牌。
请注意,一旦创建完成,这个访问令牌将是不可见的,请在需要使用时进行复制并妥善保存以备后续开发中使用。丢失了此访问令牌可能会导致无法正常使用Mapbox服务。
最后,在您的代码或项目中正确配置 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软件中就可以查看了。