地图下载核心,如何使用Python下载高德地图瓦片并拼接成大图?

您所在的位置:网站首页 电脑如何拼接图片成大长图 地图下载核心,如何使用Python下载高德地图瓦片并拼接成大图?

地图下载核心,如何使用Python下载高德地图瓦片并拼接成大图?

2023-06-19 18:25| 来源: 网络整理| 查看: 265

地图下载核心,如何使用Python下载高德地图瓦片并拼接成大图? WMTS地图瓦片Requst请求影像瓦片与道路瓦片合并行列号的计算根据给定坐标范围下载地图导出图片结果图片展示完整代码:

WMTS地图瓦片

  WMTS (Web Map Tile Service) 是一种提供基于瓦片的地图数据服务的网络协议。它通过将地图数据分割成相同大小的瓦片,并预先生成这些瓦片以供客户端请求,从而提高了地图数据呈现速度和效率。WMTS使用RESTful Web服务和基于HTTP/HTTPS协议进行数据交换,可通过Web浏览器、GIS软件和其他客户端应用程序访问和使用。WMTS广泛用于Web地图、桌面应用程序、移动应用程序等。 它是Open Geospatial Consortium(OGC)发布的开放标准之一。

Requst请求

  下面我们对高德地图瓦片进行分析,瓦片是通过X,Y,Z形式的行列号来请求一张图片的方式获取瓦片数据的,请求返回的数据为一个进制的图片数据,所以我们要建立一个图片请求,并将请求到的图片返回。

在这里插入图片描述

request请求并返回瓦片代码:

def request_tile(self, tile_url): headers = { "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Cookie": "HWWAFSESTIME=1681889500446; HWWAFSESID=53a7d799024cfb3f627" } blank_img = Image.new(mode="RGB", size=(256, 256)) try: r = requests.get(url=tile_url, headers=headers, timeout=20) if r.status_code == 200: #将请求的内容转为图片 img = Image.open(BytesIO(r.content)) return img else: return blank_img except: print("failed") return blank_img 影像瓦片与道路瓦片合并

  在我们使用的示例下载地图数据(高德地图)中,影像数据包括:影像地图、标签地图,两者结合才是我们所看到的影像地图,标签地图与影像地图的请求方式一样,为一张256*256的透明背景PNG。

在这里插入图片描述

下载影像地图的时候,我们要将标签地图叠加在影像地图之上,下面代码中vec_tile_url为影像地图地址,cta_tile_url 为标签地图地址,xyz是瓦片的行列号,我们根据传入的行列号与地图级别对瓦片进行下载并重叠。

def get_tile(self, col, row, zoom): vec_tile_url = "https://webst01.is.autonavi.com/appmaptile?style=6&x={}&y={}&z={}".format( col, row, zoom) cta_tile_url = "https://wprd03.is.autonavi.com/appmaptile?x={}&y={}&z={}&lang=zh_cn&size=1&scl=1&style=8ype=11".format( col, row, zoom) vec_img = self.request_tile(vec_tile_url) cta_img = self.request_tile(cta_tile_url) new_vec_img = Image.new(mode="RGBA", size=(256, 256)) new_vec_img.paste(vec_img, box=(0, 0)) new_cta_img = Image.new(mode="RGBA", size=(256, 256)) new_cta_img.paste(cta_img, box=(0, 0)) merge_img = Image.alpha_composite(new_vec_img, new_cta_img) return merge_img 行列号的计算

  在下面计算瓦片行列号的时候我们传入的参数为经度(l)纬度(b)级别(zoom),由于我们要下载的瓦片数据为墨卡托投影坐标,所以在计算之前我们要先将经纬度坐标通过lonLat2Mercator方法转换为默卡托投影坐标,grithHalf:20037508.3427892(地球周长的一半)。

# 获取杆塔编号 def getTileNum(self, l, b, zoom): num = int(math.pow(2, zoom)) cellsize = self.grithHalf * 2 / num np = self.lonLat2Mercator(l, b) x = math.floor((np.x() + self.grithHalf) / cellsize) x = max(0, x) x = min(x, int(num - 1)) y = math.floor((self.grithHalf - np.y()) / cellsize) y = max(0, y) y = min(y, int(num - 1)) return x, y #经纬度转墨卡托投影 def lonLat2Mercator(self, l, b): if (b > 85.0511287798066): b = 85.0511287798066 if (b 85.0511287798066): b = 85.0511287798066 if (b


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3