Python 之谷歌瓦片地图影像批量下载
Python 之谷歌瓦片地图影像批量下载
最近在写毕业论文,想用谷歌影像作为底图来展示研究区,然后 Google 了很多脚本,结果发现输出的影像都不带空间坐标系,所以就想自己写个小工具,通过输入空间范围就可以实现 Google 地图的下载,并输出为 TIFF 格式,含 WGS 84 空间坐标系。
1、拟解决问题
下载谷歌影像,并输出为带空间坐标系的 TIFF 格式
2、简单说明
通过多线程、多进程的方式实现快速下载
下面只给出主要的思路及代码
文章末尾提供源码链接
3、主要思路及代码
3.1、计算给定空间范围内的瓦片行列号,并返回URL
MAP_URLS = {"Google": "http://mts0.googleapis.com/vt?lyrs={style}&x={x}&y={y}&z={z}","Google China": "http://mt2.google.cn/vt/lyrs={style}&hl=zh-CN&gl=CN&src=app&x={x}&y={y}&z={z}"} def get_url(source, x, y, z, style):#if source == 'Google China':url = MAP_URLS["Google China"].format(x=x, y=y, z=z, style=style)elif source == 'Google':url = MAP_URLS["Google"].format(x=x, y=y, z=z, style=style)else:raise Exception("Unknown Map Source ! ")return urldef get_urls(x1, y1, x2, y2, z, source='google', style='s'):pos1x, pos1y = wgs_to_tile(x1, y1, z)pos2x, pos2y = wgs_to_tile(x2, y2, z)lenx = pos2x - pos1x + 1leny = pos2y - pos1y + 1print("Total tiles number:{x} X {y}".format(x=lenx, y=leny))urls = [get_url(source, i, j, z, style) for j in range(pos1y, pos1y + leny) for i in range(pos1x, pos1x + lenx)]return urls
3.2、根据上一步得到的URL下载瓦片
def download_tiles(urls,multi=10):def makeupdate(s):def up():global COUNTCOUNT+=1print("\rDownLoading...[{0}/{1}]".format(COUNT,s),end='')return upurl_len=len(urls)datas=[None] * url_lenif multi <1 or multi >20 or not isinstance(multi,int):raise Exception("multi of Downloader shuold be int and between 1 to 20.")tasks=[Downloader(i,multi,urls,datas,makeupdate(url_len)) for i in range(multi)]for i in tasks:i.start()for i in tasks:i.join()return datas
3.3、合并瓦片为一张影像
def merge_tiles(datas,x1, y1, x2, y2, z):pos1x, pos1y = wgs_to_tile(x1, y1, z)pos2x, pos2y = wgs_to_tile(x2, y2, z)lenx = pos2x - pos1x + 1leny = pos2y - pos1y + 1outpic = pil.new('RGBA', (lenx * 256, leny * 256))for i, data in enumerate(datas):picio = io.BytesIO(data)small_pic = pil.open(picio)y, x = i // lenx, i % lenxoutpic.paste(small_pic, (x * 256, y * 256))print('\nTiles merge completed')return outpic
3.4、计算所下载瓦片的实际空间范围(我们需要的是瓦片边缘的经纬度信息)
def getExtent(x1, y1, x2, y2, z,source="Google China"):pos1x, pos1y = wgs_to_tile(x1, y1, z)pos2x, pos2y = wgs_to_tile(x2, y2, z)Xframe=pixls_to_mercator({"LT":(pos1x,pos1y),"RT":(pos2x,pos1y),"LB":(pos1x,pos2y),"RB":(pos2x,pos2y),"z":z})for i in ["LT","LB","RT","RB"]:Xframe[i]=mercator_to_wgs(*Xframe[i])if source=="Google":passelif source=="Google China":for i in ["LT","LB","RT","RB"]:Xframe[i]=gcj_to_wgs(*Xframe[i])else:raise Exception("Invalid argument: source.") return Xframe
3.5、最后将结果输出为TIFF格式
def saveTiff(r,g,b,gt,filePath):fname_out = filePathdriver = gdal.GetDriverByName('GTiff')# Create a 3-band datasetdset_output = driver.Create(fname_out, r.shape[1], r.shape[0], 3, gdal.GDT_UInt16)dset_output.SetGeoTransform(gt)try:proj = osr.SpatialReference()proj.ImportFromEPSG(4326)dset_output.SetSpatialRef(proj)except:print("Error: Coordinate system setting failed")dset_output.GetRasterBand(1).WriteArray(r)dset_output.GetRasterBand(2).WriteArray(g)dset_output.GetRasterBand(3).WriteArray(b)dset_output.FlushCache()dset_output = Noneprint("Image Saved")
完成!
您也可以点击这里获取完整的代码
如果对您有用的话,别忘了给点个赞哦_ !
Python 之谷歌瓦片地图影像批量下载相关推荐
- 利用Python在NASA Earthdata Search 上批量下载MODIS数据
1.下载网址:https://search.earthdata.nasa.gov 2.第一步:注册账号,右上角Earthdata Login,如实注册,身份可以选择教育.用途可以选择科研团队,记得添加 ...
- img绝对路径图片显示_使用python爬虫去风景图片网站批量下载图片
使用python爬虫(requests,BeautifulSoup)去风景图片网站批量下载图片 1.写代码背景: 今天闲来无事,想弄点图片放到电脑,方便以后使用,故去百度查找一些风景图片网站,发现图片 ...
- python调用IE浏览器进行数据批量下载小技巧
一.为什么要使用浏览器下载? 使用场景:已经有了大量的数据下载链接信息,这些保存在txt文本中,每一行是一个完整的下载链接地址,很多人首先就会想到,直接使用迅雷批量下载就好了,确实如此,这也是最简单的 ...
- Python+IDM实现百度网盘批量下载
最近发现了一个Tampermonkey脚本,用来下载百度网盘能达到几十MB/s,然而不能批量下载(比如几十集的电视剧),于是借用爬虫知识,利用Python+Selenium批量调用此脚本获得直链,并在 ...
- python爬虫入门:搜索和批量下载图片
目录 python爬虫批量下载图片 前言 一.具体流程 1.使用必应搜索图片 2.实现方法 导入模块 具体代码 二.效果演示 python爬虫批量下载图片 前言 本篇文章以在必应下载硬币图片为例,实现 ...
- 利用Python调用ECMWF欧洲中心API批量下载数据
前段时间由于需要下载ECMWF(欧洲中期天气预报中心)的再分析数据,学习了如何利用Python调用ECMWF欧洲中心API进行批量下载.这种下载ECMWF数据的方法在官网上有非常详细的介绍.我只是对这 ...
- python实战!智能翻页批量下载文件
python爬虫遇到爬取文件内容时,需要一页页的翻页爬取,这样很是麻烦,其实可以获取每个列表信息下的文件名和文件链接,让文件名和文件链接处理为列表,保存后下载,实现智能翻页批量下载文件,本文以以京客隆 ...
- 【ArcGIS遇上Python】ArcGIS Python实现长时间序列遥感影像批量处理--以裁剪为例
任务分析:在采用遥感方法研究植被物候变化时,需要下载长时间序列(本文用到的是30年)GIMMS 3G NDVI数据.原始数据是全球的,预处理过程包括几何校正.裁剪.投影变换.Hants时间序列谐波分析 ...
- Python爬虫项目---从wiley网站批量下载文章
上代码 实现逻辑:是利用pyautogui 自动点击脚本,实现下载 代码: #从https://onlinelibrary.wiley.com/toc/15214095/2019/31/42 自动下载 ...
最新文章
- SD-WAN:MSP连接
- 两个列表之间移动数据
- ie浏览器修复_Win8系统电脑无法打开运行IE浏览器的解决方法
- 让dwz 的表格或者表单显示竖滚动条的代码
- python对字符串数组进行排序、依据字符数_Python进行数据的排序以及字符串的操作...
- 内部服务器如何提供访问服务
- html发送qq邮件消息,Python3实现发送QQ邮件功能(html)_python
- 2020年最好用的手机是哪一款_2020年10款最好用的健康秤
- linux java 环境配置_Linux开发环境配置——java
- 去重 属性_赛尔原创@EMNLP2020|开放域对话系统的属性一致性识别
- C++_SHFileOperation文件夹操作
- 可以将pdf转换成jpg图片格式的方法
- http server response 一览
- 解决引用百度地图点击详情无法定位到相应位置问题
- Android应用开发之PNG、IconFont、SVG图标资源优化详解
- 网易运营微专业_用户运营
- 【FICO系列】SAP FICO模块-财务账期的打开和关闭
- 深度好文 | YOLOv5+DeepSORT多目标跟踪深入解读与测试(含源码)
- IOS屏幕截图---普通截图
- 旗点商学院第八期区块链改革(链改)总裁班即将扬帆起航!
热门文章
- python unix 时间戳转北京时间,python正常时间和unix时间戳相互转换的方法
- 元宇宙产业委和南京建邺区人民政府共话金融创新
- JUC-synchronized
- 安徽工程大学计算机专业分数,2018安徽工程大学录取分数线 历年分数线及专业排名...
- 华南农业大学操作系统课设(模拟磁盘文件系统实现)(JavaFX)(单人课设)
- 单端、伪差分、全差分ADC
- 直播服务器的配置要求
- 如何在office 2019加添加mathtype
- 贴片按键开关_一键控制全屋家居产品?想实现全屋智能,先安装一套智能开关吧...
- append在python里是什么意思_append在python里是什么意思