Python通过百度全景图API爬取街景图像

前言:由于个人兴趣及学术研究方向,对图像语意分割进行研究学习,并将其和我的专业(风景园林)尝试进行结合研究。CityScapes数据集常常用于汽车自动驾驶,其街道物体的语意识别在街道语意信息分析中具有巨大研究意义,而当我将深度学习模型训练好之后,需要用到全景图像作为基础数据进行分析验证。
本篇博文便是我对百度地图开放平台API批量爬取的心得分享。

1.百度全景图爬取准备
如果说爬取需要准备什么,那么我想只需要你会一些python使用知识便可以了。
另外本次用到的各网站地址URL如下:

百度地图开放平台:http://wiki.lbsyun.baidu.com/index.php?title=%E9%A6%96%E9%A1%B5

全景静态图API使用文档:http://wiki.lbsyun.baidu.com/index.php?title=viewstatic

全景坐标拾取工具:http://quanjing.baidu.com/apipickup/

个人AK码:可以理解为秘钥,需要进行百度地图开放平台开发者认证即可获得。
进入平台官网——控制台——登录——个人中心——开发者认证
Python通过百度全景图API爬取街景图像_第1张图片
在应用管理中点击创建应用,应用名称可以随意设置,启用服务全开,IP白名单可根据提示设置为0.0.0.0/0
Python通过百度全景图API爬取街景图像_第2张图片
此时正如下图便获得了属于你的AK码
Python通过百度全景图API爬取街景图像_第3张图片
2.全景坐标拾取工具解析
图片获取肯定需要我们规定一个获取地点,而此时便需要用到这个官方发布的全景坐标拾取工具
Python通过百度全景图API爬取街景图像_第4张图片
我已提前选择好天津大学卫津路校区作为演示点。
其中我们需要的几个参数为
左上:搜索目标区域点
右上:当前区域坐标点、俯仰角、偏航角
下:街景静态图URL

我将这一URL复制过来:
https://api.map.baidu.com/panorama/v2?&width=512&height=256&location=117.185769,39.113806&ak=您的ak校验码
若你已经认证好开发者,尝试替换你的AK码,将URL复制到浏览器地址,就会出现这样一幅图。
Python通过百度全景图API爬取街景图像_第5张图片
有的同学这时要问了,说好的全景图呢?怎么只显示了一部分?分辨率还不高?
当时这就是我的疑问,稍作思考过后发现官方服务文档中给出了一系列的服务参数,是不是这些参数在“作祟”呢?
且听我一探究竟。

3.API参数解析及错误代码
若你尝试将上文中的URL代码增改参数
增加&fov=360
&width=1024
&height=512
如下:
https://api.map.baidu.com/panorama/v2?&width=1024&height=512&location=117.185769,39.113806&fov=360&ak=您的ak校验码
Python通过百度全景图API爬取街景图像_第6张图片
此时我们就得到了完整的360°全景图片。
需要注意的是,由于我个人需求,在下文的代码中,图片是以单张90°视角,分4张获取单个360°全景图。
参数说明:Python通过百度全景图API爬取街景图像_第7张图片
若没有出现图片,可参照下图错误码检查URL有没有出现问题。
注意开发者每日可免费向服务器申请100次获取。
返回码说明:
Python通过百度全景图API爬取街景图像_第8张图片

4.批量制作location坐标txt文件
鉴于提升代码可复用性,我用的是异步读取方法进行下载。
首先在将我要下载图片的所有location坐标保存到一个txt文件中,用英文输入法的;作为分割符号。
Python通过百度全景图API爬取街景图像_第9张图片
在代码中先将所有坐标读取到location列表中,在循环中遍历列表的每一个元素,
在每一次循环中下载这个坐标(location)下的4个视角(fov=90)的图像。

5.Python代码

import urllib.request  #打开网页模块
import urllib.parse    #转码模块
import os
import requests

#这里的路径可替换为自己保存文件夹的路径
save_path = r"F:\202006BaiDu\picture_save/"

ak = "填入你的ak码"

#判断文件夹是否存在,若不存在则创建
if not os.path.exists(save_path):
    os.makedirs(save_path)

#替换为你自己制作的txt路径及文件
#从txt文件中读取坐标
with open(r"F:\202006BaiDu\location.txt","r",encoding='UTF-8')as f:
    location = f.readlines()

#使用for循环遍历出每个location坐标
for i in range(len(location)):
    #使用for循环,每一次都输出[0,1,2,3]这一列表
    for j in range(4):

        # 将列表中的第i个拿出来,并用split划分拿第0个
        location_number = (location[i].split(';')[0]).replace("\n", "")
        location_number = location_number.replace(";", "")

        #旋转的角度
        #[0,1,2,3] * 90 = [0,90,180,270]
        heading_number = str(90*j)

        url = r"https://api.map.baidu.com/panorama/v2?" \
              "&width=1024&height=512" \
              "&location="+location_number+\
              "&heading="+heading_number+ \
              "&ak=" + ak

        #文件保存名称
        save_name =save_path+str(i)+"."+str(j)+".jpg"
        print(url)
        #打开网页
        rep = urllib.request.urlopen(url)
        #将图片存入本地,创建一个save_name的文件,wb为写入
        f = open(save_name,'wb')
        #写入图片
        f.write(rep.read())
        f.close()
        print('图片保存成功')

6.代码中的不足
第一次独立写出一个实用脚本,我的内心是无比激动的~
Python通过百度全景图API爬取街景图像_第10张图片
在解决完这一问题过后,反思代码是否还可以进行优化。
代码的主体部分,只需要传入遍历txt文件出的列表参数就可以进行,将主体部分定义为一个函数,并将location作为参数传入函数中。
这样应更符合一个规范的代码实现形式。

def get_picture(location):
	xxxx
if __name__ == '__main__':
	#实例化函数并传入location坐标
    get = get_picture(location)

你可能感兴趣的:(Python通过百度全景图API爬取街景图像)