百度地图开放平台轻量路径规划

背景

由于要做等时圈研究,手头上有一些poi数据,如小区地理位置信息,地铁站点的地理位置信息,想通过等时圈把两者连接起来,如不同站点的关于小区的等时圈,这就需要时间数据,多方对比发现百度地图开放平台的轻量路径规划能够很好解决这个问题。

思路

百度地图开放平台轻量路径规划_Gcj02坐标转bd09
比如要给图中绿色三角形找一些等时圈,直接构造等时圈太空洞,于是想在其周边一定范围内找一些poi散点,这样中心点到散点的时间和距离就能够通过轻量级路线规划找出来,有了周边所有散点之后就可以通过arcgis等值线圈起来。
轻量级路线规划服务(又名DirectionLite API )是一套REST风格的Web服务API,以HTTP/HTTPS形式提供了路线规划服务。由于我们主要研究对象时上班族,所以选择公交路线(含地铁)规划教适宜,公交路线规划时根据起讫(qi)点坐标规划同城公共交通出行路线和耗时,支持公交、地铁出行方式,这里的起店为地铁站,讫点所有小区。上海有415个地铁站,15000+小区,要把所有路线算出来,至少有600万条数据,数据量如此之大,完全实现不太实际,这里只选择特殊的起点来计算其到其他所有终点的距离和时间。效果大致如下
百度地图开放平台轻量路径规划_wgs84转bd09_02

完整代码
import csv #导入csv模块
import requests #导入服务器请求模块
import pandas as pd #导入数据分析模块

origin_data=pd.read_excel("起点.xlsx")#读取起点数据
destination_data=pd.read_excel("讫点.xlsx") #读取讫点数据
origin_place=origin_data["起点"] #起点名
destination_place=destination_data["讫点"] #讫点名
lng_lat_origin=origin_data["起点经纬度"] #起店经纬度字段
lng_lat_destination=destination_data["讫点经纬度"] #讫点经纬度字段
              
def routing(): #定义根据起讫点计算路径的距离和时间并写入csv
    path="transit.csv" #当前路径下新建一个等时圈csv文件
    with open(path, "w+", newline='') as csv_file: #打开文件,追加
        writer=csv.writer(csv_file) 
        header=["起点", "讫点", "距离(m)", "时间(min)", "起点经度", "起点纬度", "讫点经度", "讫点纬度"] #构造返回结果的表头
        writer.writerow(header) #先写入表头  
        for origin_index,origin_point in enumerate(lng_lat_origin):   #起点循环 
            for destination_index,destination_point in enumerate(lng_lat_destination): #终点循环
                #print(origin_point,destination_point) #测试起讫点经纬度
                url="http://api.map.baidu.com/directionlite/v1/transit?origin="+origin_point+"&destination="+destination_point+"&ak=您的AK"  #GET请求
                #print(url)
                header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'} #构造请求头
                response=requests.get(url,headers=header) #发出请求
                answer=response.json() #json化
                if answer["status"]==0: #如果成功返回
                    #print(len(answer["result"]["routes"])) #总共出行方案
                    origin_name=str(origin_place[origin_index]) #起始点
                    destination_name=destination_place[destination_index] #讫点名称
                    distance=str(round(answer["result"]["routes"][0]["distance"],0)) #距离,转化为千米
                    time_cosuming=str(round(answer["result"]["routes"][0]["duration"]/60,0)) #时长,转化为分钟   
                    origin_lng=str(lng_lat_origin[origin_index]).split(",")[1] #起点经度
                    origin_lat=str(lng_lat_origin[origin_index]).split(",")[0] #起点纬度
                    destination_lng=str(lng_lat_destination[destination_index]).split(",")[1] #终点经度
                    destination_lat=str(lng_lat_destination[destination_index]).split(",")[0] #终点纬度
                    data_row=[origin_name, destination_name, distance,time_cosuming, origin_lng, origin_lat, destination_lng, destination_lat]
                    print(data_row) #测试
                    writer.writerow(data_row) #写入csv
        csv_file.close() #全部写入后关闭csv文件
        
if __name__=="__main__":
    routing()
代码解读

构造url非常关键,一般有如下几种请求方式

  • 公交路线规划(transit)
http://api.map.baidu.com/directionlite/v1/transit?origin=40.056878,116.30815&destination=31.222965,121.505821&ak=您的AK
  • 步行路线规划(walking)
http://api.map.baidu.com/directionlite/v1/walking?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=您的AK
  • 骑行路线规划(riding)
http://api.map.baidu.com/directionlite/v1/riding?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=您的AK
  • 驾车路线规划(driving)
http://api.map.baidu.com/directionlite/v1/driving?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=您的AK

一定要看清经度和纬度的前后关系以及出行方式,这里选择transit关键词。首先把地铁经纬度读取进来,把小区经纬度读取进来,然后构造请求的url,起点的经纬度数据为地铁站的,讫点的经纬度数据为小区的,构造好起讫点请求url,就明确了从哪里到哪里,接下来就是怎么走的问题,紧接着用requests向服务器发出请求,返回json格式数据,获取相应的字段如时间和距离等,然后把起点名,终点名和终点的经度,终点的纬度整理成一条记录最后存入csv里,便得到地铁站到所有小区的时间和距离数据,接下来就是利用arcgis软件将这些数据可视化的工作。

结果截图

百度地图开放平台轻量路径规划_百度地图开放平台_03

注意事项

(1)轻量路径规划帮助文档
(2)个人认证的用户ak配额只有30000条,注意不要超过配额了
(3)url的构造一定要纬度在前,经度在后,以英文逗号隔开
(4)经纬度记得处理成6位小数
(5)对于数据量不大的可以存为csv,没必要存到数据库里面

百度地图开放平台轻量路径规划_wgs84转bd09_04