一、引言
在地理信息系统(GIS)相关的开发和应用中,天地图的瓦片数据是非常有用的资源。通过 Python,我们可以方便地编写程序来爬取天地图的瓦片数据,并将其保存和合并。本文将详细介绍如何使用 Python 实现这一功能。
二、实现思路
整个程序的实现主要分为以下几个步骤:
- 经纬度与瓦片编号的转换:将 WGS84 经纬度转换为瓦片编号,以及反向转换。
- 瓦片下载:根据瓦片编号,构造请求 URL,下载瓦片数据。
- 多线程下载:使用多线程技术,提高下载效率。
- 瓦片合并:将下载的瓦片合并为 GeoTIFF 文件。
三、代码实现
import math
import os
import requests
import random
import time
import threading
from queue import Queue
import rasterio
from rasterio.merge import merge
from rasterio.crs import CRS
from rasterio.transform import Affine
import numpy as np
# 天地图API密钥
TIANDITU_KEY = "<填写密钥,从天地图官网注册后可获取自己的访问密钥>"
# 定义WGS84经纬度转瓦片编号的函数
def lonlat_to_tile(lon, lat, zoom):
n = 2.0**zoom
xtile = int((lon + 180.0) / 360.0 * n)
lat_rad = math.radians(lat)
ytile = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
return xtile, ytile
# 定义下载瓦片的函数
def download_tile(zoom, x, y, save_path, tk=TIANDITU_KEY):
t = random.randint(0, 7)
url = f"https://t{t}.tianditu.gov.cn/img_w/wmts?tk={tk}&Service=WMTS&Request=GetTile&Version=1.0.0&Style=Default&Format=tiles&serviceMode=KVP&layer=img&TileMatrixSet=w&TileMatrix={zoom}&TileRow={y}&TileCol={x}"
headers = {
"User-