python下载谷歌地图瓦片_使用 Python 合并地图瓦片

这篇博客介绍了如何使用Python下载天地图广东地区的瓦片图,并进行合并。通过设置URL规则,批量下载特定区域和级别的瓦片,然后利用PIL库进行图片合并,最终得到合并后的地图图像。
摘要由CSDN通过智能技术生成

前文提到了合并瓦片图,而瓦片图应用比较多的则是瓦片地图。对地图本就感兴趣的我,也想试试合并互联网地图的某个范围内的地图图层。

随着技术的发展,国内的地图服务商相继将地图瓦片更新为矢量瓦片[1],这下想取到相应的瓦片图,我感觉没那么简单。那还是找个相对简单的,还使用栅格瓦片的地图服务网站来试试。

我先想到的是国字号的“天地图”,天地图·广东[2]还在使用栅格瓦片,其地图放大到一定级别时,可以看到水域及建筑物图层等。

广东的天地图比起江浙等省份的还是差一大截,精确度也有待提高。不过观察对比后发现,澄海这边的图层也还是要比高德、百度等地图要细腻一些,如图是莲下镇的一部分,有些大巷子都能体现。

dd79572134ebbdb66950cb7d18ac2339.png

查看请求可知其瓦片图的规则如下:

http://services.tianditugd.com/gdvec2014/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GDVEC2014&STYLE=GDVEC2014&TILEMATRIXSET=Matrix_0&TILEMATRIX=17&TILEROW={row}&TILECOL={col}&FORMAT=image%2Ftile

其中 {row} 和 {col},分别为行和列,也就可以说对应的是 y 和 x。因按链接下载到的文件名不规则,故每张图需另存为有规则的文件名,aria2 很好解决,只需加个参数即可。下面取的是接近澄海区域内,放大级别为 17 的地图瓦片。

#!/usr/bin/env python

output =''

r = 24170

while (r <= 24255):

c = 108020

while (c <= 108100 ):

output += 'http://services.tianditugd.com/gdvec2014/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=GDVEC2014&STYLE=GDVEC2014&TILEMATRIXSET=Matrix_0&TILEMATRIX=17&TILEROW='+str(r)+'&TILECOL='+str(c)+'&FORMAT=image%2Ftile\nout='+str(c)+'_'+str(r)+'.jpg\n'

c += 1

r += 1

file = open('tiles.txt', 'w')

file.write(output)

file.close()

合并时,和上篇差不多,或许是数字比较大,到后面排序乱了,再进行一次排序后正常。代码如下:

#!/usr/bin/env python

import glob

import re

from PIL import Image

files = glob.glob('./*_*.jpg')

files.sort(key=lambda x: tuple(int(i) for i in re.findall('\d+', x)[:2]))

imagefiles = {}

for item in files:

match = re.search(r'\d+', item)

pre = int(match.group())

if not imagefiles.get(pre):

imagefiles[pre] = []

imagefiles[pre].append(item)

imagefiles = sorted(zip(imagefiles.keys(),imagefiles.values()));

total_width = len(imagefiles) * 256

total_height = len(imagefiles[0][1]) * 256

new_image = Image.new('RGB', (total_width, total_height))

x_offset = 0

for item in imagefiles:

y_offset = 0

images = map(Image.open, item[1])

for subitem in images:

new_image.paste(subitem, (x_offset, y_offset))

y_offset += subitem.size[0]

x_offset += images[0].size[0]

new_image.save('merge.jpg', quality = 90)

下面是经缩小后的地图,原图长宽各两万多像素, 40 多兆。

0464b3aa1838a186f18434201e05e656.png

对了,它的底图跟地名图层是分开的,且并非所有底图瓦片都有对应的地名瓦片,等哪时闲了再折腾。

参考资料

本文历史 2018 年 04 月 06 日 完成初稿

使用Python爬取高德地图的XYZ瓦片,可以使用以下步骤进行操作: 1. 导入必要的库和模块,包括`requests`用于发送HTTP请求,`Pillow`用于处理图像数据。 2. 构建请求URL。高德地图的XYZ瓦片URL格式为:`http://wprd03.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}`,其中`{x}`表示瓦片的x坐标,`{y}`表示y坐标,`{z}`表示缩放级别。 3. 使用循环遍历需要下载瓦片的x和y坐标,并发送GET请求获取瓦片数据。可以根据具体情况设定循环范围和缩放级别。 4. 将获取到的瓦片数据保存为图片文件。可以使用`Pillow`库的`Image`模块将数据解码为图片,然后保存到本地文件夹中。 下面是一个简单的Python代码示例: ```python import requests from PIL import Image # 构建请求URL url_template = "http://wprd03.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}" # 设置需要下载瓦片的范围和缩放级别 min_x = 0 max_x = 10 min_y = 0 max_y = 10 zoom_level = 10 # 循环遍历需要下载瓦片 for x in range(min_x, max_x+1): for y in range(min_y, max_y+1): # 构建请求URL url = url_template.format(x=x, y=y, z=zoom_level) # 发送GET请求获取瓦片数据 response = requests.get(url) # 将获取到的瓦片数据保存为图片文件 file_name = f"tile_{zoom_level}_{x}_{y}.png" with open(file_name, "wb") as f: f.write(response.content) print("瓦片下载完成。") ``` 上述代码将会下载高德地图的XYZ瓦片,保存为相应的图片文件,图片文件的命名格式为`tile_{缩放级别}_{x坐标}_{y坐标}.png`。根据实际需求,可以调整代码中的循环范围、URL模板、保存文件的路径等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值