Python笔记八:简单瓦片下载工具pyMap
这是一个简单的实例,去实现地图下载工具。如今又很多瓦片的下载工具,但是都是收费的,感觉奇怪的是既然是盗版还要收费。我决心用python写一个简单瓦片地图下载器,将瓦片下载拼接成对应的图片。
经供参考,不要从事商业用途,后果自负。
依赖
- python3.5
- requests 负责下载功能
- pillow 负责图片拼接
- tqdm 负责进度条
安装
安装python3.5
安装对应的第三方库
pip install -r requirement.txt
原理
两个主要函数分别是process_latlng
和process_tilenum
。前者使用经纬度进行处理,如osm,mapbox,天地图等。其中将经纬度转换成为瓦片编号,然后使用后者的方法。后者采用瓦片编号去下载瓦片。
由于有些地图系统的瓦片编号,经加密后十分怪异,如百度地图。
下载瓦片则是采用request
获取下载到指定的文件夹。
最后将瓦片地图进行拼接,运用pillow
的在指定位置粘贴的方法,得到最后的成果。
output_im = Image.new("RGB", (size_x, size_y))
for x in trange(left, right + 1):
for y in trange(top, bottom + 1):
path = './tiles/%i/%i/%i' % (zoom, x, y)
target_im = Image.open(path)
output_im.paste(target_im, (256 * (x - left), 256 * (y - top)))
用法
使用前,将对应的经纬度查看对应左上和右下的坐标。
运用命令行
python pyMap.py 22.456671 113.889962 22.345576 114.212686 13 output/sample.png
- 参数1: 西北角纬度
- 参数2: 西北角经度
- 参数3: 东南角纬度
- 参数4: 东南角经度
- 参数5: 比例尺级别
- 参数6: 输出路径(默认'output/mosaic.png')
hard code test function
请自修修改,下面是通过经纬度下载数据。
def test():
process_latlng(22.4566710000, 113.8899620000, 22.3455760000, 114.2126860000, 13)
或者通过瓦片编号下载数据。
def test():
process_tilenum(1566, 1788, 1976, 2149, 9, "output/overlay.png")
考虑到谷歌地图
由于谷歌地图的数据最清晰,我想爬谷歌的数据,但是谷歌地图需要翻墙,而requests不能直接翻墙。所以我参考了lantern访问中文维基百科及selenium爬取维基百科语料。
源码github地址在此,记得点星:
https://github.com/brandonxiang/pyMap_GFW
通过selenium控制浏览器截图,但是网速的限制导致成功率下降,给后期处理带来巨大麻烦。该项目已弃用,如果有更好方法请评论留言。
最后
结合所有的内容,网页版本为Python 笔记八(续):瓦片下载器网页版pyMap-webapp