Python批量获取mapbox出行圈shapefile数据

mapbox地图网站有个Isochone API接口Isochrone API | Playground | Mapbox,可以快速获得等时圈数据。

 第一步,获取access token

(1)打开mapbox网站Maps, geocoding, and navigation APIs & SDKs | Mapbox,右上角登录或者注册。

(2)登录后在网页最下面,可以看到Access tokens一栏,里面有一个默认的token(也可以新建一个),把这个token复制。

第二步,设置等时圈参数

(1)打开mapbox的 Isochone API接口Isochrone API | Playground | Mapbox,可以看到网页界面由左侧参数,右侧地图,底部请求网址和返回json数据组成。

(2)网站的使用比较简单,设置好参数之后即可得到等时圈数据。第一个参数access token里填入第一步复制的token(默认已自动填好);第二个参数longitude和latitude填入等时圈的起点经纬度,使用wgs84坐标;第三个参数routing profile选择walking步行、cycling骑行和driving驾车三种出行方式的其中一种,获得对应出行方式的等时圈;第四个参数contour minutes有10 min、20 min、30 min和15 min increments四个选项,对应10分钟等时圈、20分钟等时圈、30分钟等时圈和15分钟增量等时圈(即15、30、45、60分钟等时圈,最大为60分钟);第五个参数style可以选择返回polygons面数据或lines线数据;第六个参数contour colors可以选择等时圈颜色;第七个参数denoise可以去噪,一般设置为1即可;第八个参数generalize可以改变泛化容差,即改变边的曲折程度,一般设置为0即可。

 第三步,下载等时圈数据

设置好参数后,网站即返回等时圈数据,在网页底部的response里,但该数据是GeoJSON格式,我们可以复制response里的内容,将其复制到txt文档中,并将文件后缀改为.json,然后直接将该json文件拖入QGIS中打开,再另存为shp文件。

也可以通过python的pyshp库或geopandas库去获取shp文件。下面介绍通过pyshp库批量获取mapbox等时圈数据的方法。

python批量获取等时圈数据

由前面设置好的参数可以得到请求网址Request URL,该网址里有各个参数。

https://api.mapbox.com/isochrone/v1/mapbox/driving/113.319154,23.109143500000002?contours_minutes=15,30,45,60&polygons=true&denoise=1&access_token=你的token

 通过分析可以看出,网址里driving代表驾车方式,可以更换为walking步行或cycling骑行;113.319154,23.109143500000002为经纬度坐标;contours_minutes可以设置时间范围,最大为60分钟,可最多携带4个时间间隔,用逗号隔开;access_token=后需要填入你的token,其他参数按照默认的即可。

而对于返回的Response数据,等时圈的属性信息在features下的properties里,等时圈的几何信息在features下的geometry里。

 

搞清楚请求url和返回数据的结构之后,我们就可以编写代码了。

(1)导入需要使用的库

import time
import requests
import pandas as pd
import shapefile
import osr

 (2)编写获取数据的函数,使用的参数包括起点名称name,起点经度lon,起点维度lat,出行方式transit。对于等时圈的范围,此处使用15、30、45、60分钟的距离,可根据需要自行调整

def getdata(name,lon,lat,transit):
    print('获取{}的等时圈'.format(name))
    url = 'https://api.mapbox.com/isochrone/v1/mapbox/{}/{},{}?contours_minutes=15,30,45,60&polygons=true&denoise=1&generalize=0&access_token=你的token'.format(transit,lon,lat)
    try:
        r = requests.get(url,timeout=(3,7)).json()
        w = shapefile.Writer('./shp/isochrone_{}_{}.shp'.format(name,transit), encoding='gbk')
        w.field('name', 'C')
        w.field('transit', 'C')
        w.field('contour', 'N')
        w.field('metric', 'C')
        w.field('color', 'C')
        w.field('opacity', 'N', decimal=2)
        
        for i in r['features']:
            coords = i['geometry']['coordinates']
            w.poly(coords)
            w.record(
                name=name,
                transit=transit,
                contour=i['properties']['contour'],
                metric=i['properties']['metric'],
                color=i['properties']['color'],
                opacity=i['properties']['opacity']
                )
        w.close()
        #添加投影信息
        proj = osr.SpatialReference()
        proj.ImportFromEPSG(4326)
        wkt = proj.ExportToWkt()
        projfile = './shp/isochrone_{}_{}.prj'.format(name,transit)
        f0 = open(projfile, 'w')
        f0.write(wkt)
        f0.close()
        print('获取成功!')
        
    except:
        print('获取失败')
        df = {}
        df['name'] = name
        df['lon'] = lon
        df['lat'] = lat
        df['transit'] = transit
        dm = pd.DataFrame([df])
        dm.to_csv('./queryagain.csv',mode='a',index=False,header=False,encoding='utf-8-sig')

 (3)把需要获取等时圈的起点信息保存在csv文件中,包括起点的名称name,经度lon,维度lat,出行方式transit,可以通过poi数据获取。读取csv文件后对等时圈起点进行批量获取

if __name__ == '__main__':
    print('开始爬取数据')
    dt = pd.read_csv('./query.csv',engine='python')
    for i in range(len(dt)):
        getdata(dt['name'][i],dt['lon'][i],dt['lat'][i],dt['transit'][i])
        time.sleep(0.5)
    print('All Done!!!')

至此代码编写完成!

 将批量获取的数据拉进ArcGIS软件即可进行相关分析。

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Atom数据

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值