下载瓦片的python脚本

更新时间: 2025-07-07 11:51:18

# 前端调用脚本并传参

前端给python脚本传的参数,第一个是每个层级需要下载的瓦片范围,第二个是下载的文件夹目录

async function runPython(list) {
    try {
        const args = [JSON.stringify(list), folderPath.value]
        result.value = await window.api.runPythonSteam(args)
    } catch (error) {
        result.value = { error: String(error) }
    }
  }
1
2
3
4
5
6
7
8

# python脚本

# 接收参数

import sys
import os
import json
import requests

def main():
    # 获取参数
    # sys.argv是一个列表,包含了运行Python脚本时命令行输入的所有参数  
    # sys.argv[0]是脚本本身的文件名  
    # sys.argv[1:]表示从第1个参数开始到最后,也就是去掉脚本名后的所有参数  
    args = sys.argv[1:]
    
    # 地图层级和下载范围
    levelAndRange = json.loads(args[0])

    # 下载文件夹地址  
    folderPath = args[1].replace('\\','/')

if __name__ == "__main__":
    main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 统计下载瓦片的总数

# 总数
totalImgSize = 0
# 成功数量 
successImgSize = 0
# 百分比  
percent = 0
for item in levelAndRange:
    totalImgSize += ((item['maxX'] + 1) - (item['minX'])) * ((item['maxY'] + 1) - (item['minY']))  
1
2
3
4
5
6
7
8

# 下载瓦片

# 第一层循环地图层级
for item in levelAndRange:
    z = item['level']
    # 第二层循环X的范围  
    for x in range(item['minX'], item['maxX'] + 1):
        # 第三层循环Y的范围  
        for y in range(item['minY'], item['maxY'] + 1):
            # 这是分析百度地图js代码和实践后得到的地址  
            url = f"https://maponline0.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=1&from=jsapi3_0"
            # 请求瓦片  
            response = requests.get(url)
            if response.status_code == 200:
                # 创建文件夹
                os.makedirs(f"{folderPath}/{z}", exist_ok=True)
                # 写入瓦片  
                with open(f"{folderPath}/{z}/{x}_{y}.png", "wb") as f:
                    f.write(response.content)
                    # 计算百分比  
                    successImgSize += 1
                    percent = round((successImgSize / totalImgSize) * 100, 2)
                    # print的内容都会传给前端  
                    print(json.dumps({"status":'success', "path": f"{folderPath}/{z}/{x}_{y}.png","x":x, "y":y, "z":z, "percent": percent}), flush=True)   
            else:
                print(json.dumps({"status":'error', "path": f"{folderPath}/{z}/{x}_{y}.png","x":x, "y":y, "z":z, "percent": percent }), flush=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

然后前端就可以根据这个返回知道当前下载到哪个瓦片,进度如何