完整代码可以关注公众号:Smilecoc的杂货铺

1.获取百度api接口
首先需要在百度的公众平台http://lbsyun.baidu.com/上点击控制台,如果是新用户的话需要进行注册和验证。注册和验证完毕后可以点击创建应用,填写应用名称等相关信息,应用类型根据需要进行设置,有浏览器端和服务器端两种。在这里特别说明的是,在IP白名单框里最好设置为:0.0.0.0/0,因为有时候把自己己的IP地址输进去可能也不行。
创建应用完成后我们就可以得到刚刚创建的应用的密钥(AK)

2.获取起始地点的地理编码
首先是找到获取步行距离的官方文档http://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1,但是发现对应的api接口里需要起始地点的地理编码,所以首先需要获取对应起始位置的地理编码http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding。如果有其他的需求,例如找路线规划等等都可以通过说明文档进行修改

def getapiurl(myaddress):
    url=r"http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}".format(myaddress,myAK)#说明文档里给出的api接口
    print(url)
    return url

def getPosition(url):
    '''返回经纬度信息'''
    res = requests.get(url)
    json_data = json.loads(res.text)

    if json_data['status'] == 0:
        lat = json_data['result']['location']['lat']  # 纬度
        lng = json_data['result']['location']['lng']  # 经度
    else:
        print("Error output!")
        return json_data['status']
    return lat, lng

3.获取起始地点的步行距离

def getdistance(startlat,startlng,endlat,endlng):
    #{: .6f}保留小数点后六位
    distanceurl=r"http://api.map.baidu.com/directionlite/v1/walking?origin={:.6f},{:.6f}&destination={:.6f},{:.6f}&ak={}".format(startlat,startlng,endlat,endlng,myAK)
    res = requests.get(distanceurl)
    dis_json_data = json.loads(res.text)
    if dis_json_data['status'] == 0:
        distance=dis_json_data['result']['routes'][0]['distance']
        print(distance)

这里通过api获取的json文件中的结构与说明文档中的结构有一些出入,所以还是要按照实际的情况灵活修改

这样主体程序就完成了,接着加上读取数据和用户交互窗口
首先是利用pandas读取并处理数据:

def get_address(file_path):
    data=pd.read_excel(file_path)
    startaddress=data['地区']+data['出发行政区域']+data['出发地址']
    endaddress=data['地区']+data['到达行政区域']+data['到达地址']
    distance=[]
    #遍历series输入需要查询的起始地点
    for i in range(1,len(startaddress)+1):
        startlat, startlng = getPosition(startaddress[i-1])
        endlat, endlng = getPosition(endaddress[i-1])
        #将输出结果拼接为list
        distance.append(getdistance(startlat, startlng, endlat, endlng))
    dfdistance=pd.DataFrame(distance)
    #使用concat拼接两个dataframe,其中axis=1表示横向拼接,如果不加此参数或者为0表示纵向拼接
    result=pd.concat([data,dfdistance],axis=1)
    #更改列名称
    result.rename(columns={0: 'distance'}, inplace=True)
    result.to_excel(parent_path + '/结果文件.xlsx',index=None)

这里因为api接口只能一个一个距离导入,所以首先将结果拼接成list再与之前的数组利用concat拼接。在使用pandas时很重要的一点是pandas的最小使用维度在一列数据中,所以只有比较好的数据结构时使用pandas才会比较方便

最后是利用tkinter实现用户交互窗口,实现一个窗口可以让用户选取文件并将生成的结果文件保存到同一文件夹下

#获取文件路径
def get_filename():
    root = tk.Tk()
    root.withdraw()
    #file_path为文件的路径,parent_path为文件所在的文件夹路径
    file_path = filedialog.askopenfilename()
    parent_path = os.path.dirname(file_path)
    return file_path, parent_path

实现的效果如下:
在这里插入图片描述
这样整个程序就 完工了!

接下来是将生成的数据打包为直接可执行的文件,因为一般用户不会自己装python和配置。
1.首先按下win+R键,输入cmd打开命令运行窗口,输入cd+文件路径进入指定的文件夹
在这里插入图片描述
2.安装pyinstaller库:

pip install pyinstaller

这里我之前已经安装过pyinstaller库,所以直接跳过这一步
如果已经安装过pyinstaller库,那么在上一步时就要进到pyinstaller库安装的那一个文件夹运行。

3.打包:

python pyinstaller.py -F baidu_map_distance.py

这里要注意:
一是baidu_map_distance.py为要打包的程序名称。
第二是因为现在我的程序是放在安装 pyinstaller的文件夹下的,所以填的是相对路径,如果是要打包其他文件夹中的程序,需要使用绝对路径
三是F的含义为将原文件打包为exe文件,还有其他几个可选参数

  • -F的含义为将原文件打包为exe文件
  • -D:创建一个目录,包含exe文件,但会依赖很多文件,这是默认选项
  • -c:使用控制台,这也是默认选项
  • -w:使用窗口,无控制台

使用-F的好处是会将所有的依赖文件打包到exe里,使用起来比较方便,只要给最终的exe文件就可以了。但是相应的坏处就是文件会比较大,比较慢。
而-D的话生成之后需要依赖文件夹里的其他文件,需要传输所有的文件给别人才能使用,只有一个exe文件的话就会无法运行。

程序运行完成后的文件夹会多出三个文件夹
在这里插入图片描述
在dist文件夹里就可以找到打包完的程序了
在这里插入图片描述
其他两个文件夹为过程文件,可以不用管它了

这样我们就大功告成了!

最新文章更新在我的博客:http://smilecoc.vip/2020/03/07/get_baidu_distance_bypython/
源码及使用文件地址:
https://github.com/smilecoc/baidumapapi_getdistance