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 之谷歌瓦片地图影像批量下载相关推荐

  1. 利用Python在NASA Earthdata Search 上批量下载MODIS数据

    1.下载网址:https://search.earthdata.nasa.gov 2.第一步:注册账号,右上角Earthdata Login,如实注册,身份可以选择教育.用途可以选择科研团队,记得添加 ...

  2. img绝对路径图片显示_使用python爬虫去风景图片网站批量下载图片

    使用python爬虫(requests,BeautifulSoup)去风景图片网站批量下载图片 1.写代码背景: 今天闲来无事,想弄点图片放到电脑,方便以后使用,故去百度查找一些风景图片网站,发现图片 ...

  3. python调用IE浏览器进行数据批量下载小技巧

    一.为什么要使用浏览器下载? 使用场景:已经有了大量的数据下载链接信息,这些保存在txt文本中,每一行是一个完整的下载链接地址,很多人首先就会想到,直接使用迅雷批量下载就好了,确实如此,这也是最简单的 ...

  4. Python+IDM实现百度网盘批量下载

    最近发现了一个Tampermonkey脚本,用来下载百度网盘能达到几十MB/s,然而不能批量下载(比如几十集的电视剧),于是借用爬虫知识,利用Python+Selenium批量调用此脚本获得直链,并在 ...

  5. python爬虫入门:搜索和批量下载图片

    目录 python爬虫批量下载图片 前言 一.具体流程 1.使用必应搜索图片 2.实现方法 导入模块 具体代码 二.效果演示 python爬虫批量下载图片 前言 本篇文章以在必应下载硬币图片为例,实现 ...

  6. 利用Python调用ECMWF欧洲中心API批量下载数据

    前段时间由于需要下载ECMWF(欧洲中期天气预报中心)的再分析数据,学习了如何利用Python调用ECMWF欧洲中心API进行批量下载.这种下载ECMWF数据的方法在官网上有非常详细的介绍.我只是对这 ...

  7. python实战!智能翻页批量下载文件

    python爬虫遇到爬取文件内容时,需要一页页的翻页爬取,这样很是麻烦,其实可以获取每个列表信息下的文件名和文件链接,让文件名和文件链接处理为列表,保存后下载,实现智能翻页批量下载文件,本文以以京客隆 ...

  8. 【ArcGIS遇上Python】ArcGIS Python实现长时间序列遥感影像批量处理--以裁剪为例

    任务分析:在采用遥感方法研究植被物候变化时,需要下载长时间序列(本文用到的是30年)GIMMS 3G NDVI数据.原始数据是全球的,预处理过程包括几何校正.裁剪.投影变换.Hants时间序列谐波分析 ...

  9. Python爬虫项目---从wiley网站批量下载文章

    上代码 实现逻辑:是利用pyautogui 自动点击脚本,实现下载 代码: #从https://onlinelibrary.wiley.com/toc/15214095/2019/31/42 自动下载 ...

最新文章

  1. SD-WAN:MSP连接
  2. 两个列表之间移动数据
  3. ie浏览器修复_Win8系统电脑无法打开运行IE浏览器的解决方法
  4. 让dwz 的表格或者表单显示竖滚动条的代码
  5. python对字符串数组进行排序、依据字符数_Python进行数据的排序以及字符串的操作...
  6. 内部服务器如何提供访问服务
  7. html发送qq邮件消息,Python3实现发送QQ邮件功能(html)_python
  8. 2020年最好用的手机是哪一款_2020年10款最好用的健康秤
  9. linux java 环境配置_Linux开发环境配置——java
  10. 去重 属性_赛尔原创@EMNLP2020|开放域对话系统的属性一致性识别
  11. C++_SHFileOperation文件夹操作
  12. 可以将pdf转换成jpg图片格式的方法
  13. http server response 一览
  14. 解决引用百度地图点击详情无法定位到相应位置问题
  15. Android应用开发之PNG、IconFont、SVG图标资源优化详解
  16. 网易运营微专业_用户运营
  17. 【FICO系列】SAP FICO模块-财务账期的打开和关闭
  18. 深度好文 | YOLOv5+DeepSORT多目标跟踪深入解读与测试(含源码)
  19. IOS屏幕截图---普通截图
  20. 旗点商学院第八期区块链改革(链改)总裁班即将扬帆起航!

热门文章

  1. python unix 时间戳转北京时间,python正常时间和unix时间戳相互转换的方法
  2. 元宇宙产业委和南京建邺区人民政府共话金融创新
  3. JUC-synchronized
  4. 安徽工程大学计算机专业分数,2018安徽工程大学录取分数线 历年分数线及专业排名...
  5. 华南农业大学操作系统课设(模拟磁盘文件系统实现)(JavaFX)(单人课设)
  6. 单端、伪差分、全差分ADC
  7. 直播服务器的配置要求
  8. 如何在office 2019加添加mathtype
  9. 贴片按键开关_一键控制全屋家居产品?想实现全屋智能,先安装一套智能开关吧...
  10. append在python里是什么意思_append在python里是什么意思