Mapillary街景图像元数据爬取


前言

目前有关街景的研究主要集中于图像本身(提取绿视率、天空开放程度、车道线等),而对图像元数据关注较少。国内两大街景平台中,腾讯已经不再更新街景,百度虽然保持更新,但我们只能爬取街景图像,图像元数据拿不到。国外街景平台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.comhttps://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')

运行结果如下:
在这里插入图片描述


总结

有了图像元数据,我们可以做很多事情,比如:下载图像的原图/缩略图,基于图像拍摄的地理位置将图像可视化到地图上等。

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值