长文预警,预计阅读时间40分钟。完整代码见文中说明。
本文为《通过深度学习了解建筑年代和风格》论文复现的第三部分——获取阿姆斯特丹高质量街景图像的上篇,主要讲了如何获取利用谷歌街景地图自动化获取用于深度学习的阿姆斯特丹的高质量街景图像,此数据集将用于进行建筑年代的模型训练[1]。
街景图示意
我们会从上文 Part2.下载和预处理建筑足迹数据集[2] 获取到的阿姆斯特丹的163210条建筑足迹数据开始,获取用于下载街景图像的谷歌街景网址128876条url,在下一篇文章[3]我们会通过获取的url通过selenium进行街景图像的采集并分享我下载的完整的街景图像。
目录:
阅读前必看知识点
- 1 方法一,超额收费:通过谷歌街景API获取街景图像
- 2 方法二,完全免费:通过selenium实现批量街景图像的采集
- 3 详解谷歌街景网页URL中的三个重要参数:
- 1)纬度和经度 lat, lng
- 2)相机指向的方向或方向 heading θ
- 3)全景ID
- 4 获取街景采集点 Point S 和 heading θ的思路
- 5 获取阿姆斯特丹的道路矢量数据
- 2.1 方法一:用geopandas和shapely处理建筑并获取中心点
- 1) 简化建筑物
- 2)使用Shapely获取建筑各边的中心点
- 2.2 方法二:用ArcGIS Pro和ArcPy处理建筑并获取中心点
- 1)简化建筑物
- 2) 获取建筑各边中心点
- 3.1 使用geopandas找到街景点(方法1)
- 1)读取阿姆斯特丹矢量道路数据
- 2)对建筑做缓冲区
- 3)裁剪道路数据
- 4)使用shapely的nearest_point找出最近的两个点
- 5)使用向量相乘的原理计算两个点间的角度heading θ
- 6)我们绘制出相应的点来验证是否计算正确
- 3.2 使用使用ArcGIS Pro进行邻近分析,找到街景点和角度(方法2)
- 1)投影到同一个UTM坐标
- 2)找到建筑立面的中心点并进行邻近分析
- 3)查询multipoint中的角度并进行角度转换
- 3)简化和整合代码
- 1)通过streetview获取经纬度、朝向
- 2)组合url
- 3)整合并简化代码
- 额外阅读
- 写在最后
街景图像就是把建筑环境虚拟化展现出来,已经成为了现实世界体验和感知的一个替代品。
阅读前必看知识点
在阅读本文前需要了解的知识点,大部分都能在菜鸟教程找到,你也可以去相应的官方网站查找更多信息、
- Python的基本知识[4],函数isinstance[5]的使用
- 向量的点积(dot product)的概念[6]
- numpy的基本知识[7],dot(向量点积)、norm(范数)、arccos(反余弦)、degrees(弧度转换为度数)等部分函数的使用
- pandas的基本知识[8]
- geopandas包如何处理gdb、gpkg等文件地理数据库[9]
- Geodataframe和GeoSeries的属性查看,切片和索引,apply函数的使用,[10]
- shapely包中的几何对象[11]:Point[12]、MultiPoint[13]、Polygon[14]、MultiPolygon[15]
- matplotlib基本绘图方法[16]
- Arcpy的基本知识[17],要素属性表的查询和更新游标[18],Arcpy中的几何对象MultiPoint[19]
- OSMnx[20]包的介绍,如何下载openstreet map上的矢量数据
一、从街景图像的获取开始思考
1 方法一,超额收费:通过谷歌街景API获取街景图像
论文作者使用谷歌API去获取的街景图像,这是收费的,大约7美元一千张照片。如果我们去谷歌的开发平台绑定信用卡,可以获得每月200美元的额度,但是也只能能获取大约3万张照片,而我们的项目预估仅仅阿姆斯特丹一个城市就需要7万张照片。无奈我“囊中羞涩”,只能去使用一种免费的方法——selenium
库实现浏览器自动化截图,去获取建筑立面的图像。
如果你恰好有经费,更推荐使用此方法下载街景图片,速度会比方法二快很多,它的代码主要使用streetview
库获取pano_id
变量后,使用get_streetview()
函数下载:
from streetview import get_streetview
import os
# 下载街景图片
image = get_streetview(
pano_id=pano_id, # 使用streetview包查询到的,后文会说
api_key=GOOGLE_MAPS_API_KEY, # 在https://console.cloud.google.com/获取你的api
)
image.save("image.jpg", "jpeg")
2 方法二,完全免费:通过selenium实现批量街景图像的采集
Selenium[21] 是一个强大的工具,用于控制 web 浏览器通过程序进行自动化操作。它的 Python 版本(Selenium WebDriver)允许你使用 Python 编写程序来做例如打开网页、填充表单、点击按钮等常见浏览器操作。
对于数据采集,使用selenium意味着只要能用浏览器打开的网页,使用selenium都能抓取到数据,即使涉及到了验证码都能处理。而且,你可以使用selenium去大麦抢演唱会票(ClassmateLin / dm-ticket[22])。我们这次用到的就是它的截屏功能:
桌面下谷歌街景图像网页的截屏
为了获取不同建筑的照片,我们通过更改街景网页地址中的相关参数,来改变位置、转换角度等功能,就像你自己拿着一个摄像机