文章目录
前言
目前有关街景的研究主要集中于图像本身(提取绿视率、天空开放程度、车道线等),而对图像元数据关注较少。国内两大街景平台中,腾讯已经不再更新街景,百度虽然保持更新,但我们只能爬取街景图像,图像元数据拿不到。国外街景平台Mapillary则提供了API用来访问图像元数据。本文主要介绍如何爬取Mapillary街景图像元数据。
一、创建Mapillary账户,并注册application
访问元数据需要token字符串,所以必须注册为Mapillary的用户。
1.创建账户
首先访问官网 https://www.mapillary.com (科学上网),点击右上角“浏览地图”。
在地图界面点击右上角“sign up”,进行注册即可。
2.注册application
登录账户后,访问下面网址https://www.mapillary.com/dashboard/developers并点击“Register application”按钮。
注册界面如下图所示:
应用名随便起,描述一句话即可,公司名字随便起,公司网址我写的本机地址–https://127.0.0.1:5000,重定向URL–https://www.mapillary.com/app。要开启application的READ WRITE权限,点击注册按钮,完成注册。
注册成功后,网页多了以下内容:
二、使用Mapillary API访问图像元数据
1.获取Access Token(访问令牌)
访问Mapillart API文档 https://www.mapillary.com/developer/api-documentation?locale=zh_CN ,我们阅读Authentication 和 OAuth 2.0 这两部分可知:针对 https://graph.mapillary.com 和 https://tiles.mapillary.com 的所有请求都必须经过授权。它们需要客户端或用户访问令牌。
(1)上一步注册的application需要在浏览器中访问授权URL,来初始化授权请求。
授权URL–https://www.mapillary.com/connect?client_id=XXXXX,这里的client_id是我们注册的application中的client ID。
(2)使用浏览器访问该网址后,点击界面中的Authorize按钮对application进行授权,界面如下:
(3)当application获得授权后,身份验证页面会将用户重定向到带有授权代码的应用回调 URL。URL的值:https://www.mapillary.com/app/?code=AQB6hSvhmNXoukVtSUTG5QjdgSe8ljizTlXrxeKJvnWgJEb1MpADbbm7MoIPDgDAsWpgFu_2TXkITgs_GAlmx0AbWd31FkVHjdyKmYeLDi0p1Svb3O1bg1G67LYri5M8n0K3ihgk29xiTS1MlJqFIbJxYf8T0Wu3-QSTTTOZJ_ajSluqgAOmB6fjg3VpKPBFigrTuCgQ46DZKYr_FvxirzMOZEx8TKC2MHqYOGm1kePfi8cQHPK-WIXl_Yo-Y2TphBxOj56cYU4bamtoTA97b6GX1PR7IIQ6UL8gtx3YJ4Op2g&lat=20&lng=0&z=1.5,其中请求参数code的值就是授权代码。下面第四步要立刻执行,因为授权代码会在短时间内过期。
(4)使用授权代码调用令牌endpoint,获取用户访问令牌。
令牌的endpoint–https://graph.mapillary.com/token
使用python的requests库,post请求url获取访问令牌,代码如下:
import requests
url = 'https://graph.mapillary.com/token'
# 请求头
headers = {
'Content-Type': 'application/json',
'Authorization': 'OAuth MLY|9198766056830810|06358e1be52b8b520eda5e1d12c67c62'
# Authorization--对应我们注册application的Client secret
}
# post请求发送的数据
data = {
'grant_type': "authorization_code",
'client_id': 9198766056830810,
#client_id--对应我们注册application的Client ID
'code':'AQBov06KDzJInB7TXegHDoOx43dG3FODdR0zL0aeGU3ZPPmpm2BAD6pBBsE1Mb8pQhd7z4kERgY9Zx0CHaLVRYUPIlFaXgjeCaNLtlEgZxYRd264nwjrfKjfw2fWUHpg0DmfC4ksovtp-WcYydRjHzY_kF2Nqehwy62ru7wMD9qmK4eKoCsrnkxtziKVqYBQPiqvHYFVmlkZ6bVHUbYpiex_0Dj4WWZkZ1FH9tR8m9MfFhglkbpQavagp4JHMm_pQndmnPxEi_V5Hq8rcLGPW9XQsQglym_MLsCUqYDeMFHj5A'
#code--授权代码
}
# 代理
proxy = {
'http':'http://127.0.0.1:7890',
'https':'http://127.0.0.1:7890'
}
r = requests.post(url=url,data=data,headers=headers,proxies=proxy)
print(r.text)
# 保存成json文件,便于后期的复制
with open('token_info.json','w') as f:
f.write(r.text)
print('保存成功!')
运行结果如下图所示:
一共三个字段,第一个access_token是请求元数据必需的访问令牌;第二个expires_in表示访问令牌多少秒后过期;第三个token_type表示token类别。
2.请求图像元数据
同样访问Mapillary API的官方文档,在Entities下面的Image部分,能看到请求的图像元数据的URL和元数据字段。URL–https://graph.mapillary.com/:image_id
字段如下:
以单张街景图像元数据获取为例,代码如下:
# 基于图像id获取图像元数据
import requests
import json
# 访问令牌
access_token = 'MLYARBCWjs5JCbL3DZCVjzcqm45guTkO7kbxFRv1GKkolecVAvhZAsqV3VHdGGRrtyz4wqviVJJnZAaOTuYAB9Dq0RCF0Ba0H4qhmZA1BtsodVLuvkvWZATclnpQw3ArfwZDZD'
# 该图像是武汉街景
image_id = '819055155387633'
# 获取图像元数据所有字段
url = 'https://graph.mapillary.com/{}?access_token={}&fields=altitude,atomic_scale,camera_parameters,camera_type,compass_angle,computed_altitude,computed_compass_angle,id,computed_geometry,thumb_256_url,thumb_1024_url,thumb_2048_url,thumb_original_url,sequence,mesh,sfm_cluster'.format(image_id,access_token)
proxy = {
'http':'http://127.0.0.1:7890',
'https':'http://127.0.0.1:7890'
}
# 返回值是json对象
r = requests.get(url=url,proxies=proxy)
# 把元数据保存成json格式
with open('img/武汉.json', 'w') as f:
json.dump(r.json(),f)
print('ok')
运行结果如下:
总结
有了图像元数据,我们可以做很多事情,比如:下载图像的原图/缩略图,基于图像拍摄的地理位置将图像可视化到地图上等。