地图下载工具

开发地图工具

  • Mobile Atlas Creator (MOBAC)
  • ArcGIS(商用)
  • QGIS(开源,过于庞大)
  • Global Mapper(商用)
  • tile-generator (Mapbox 官方工具)
  • gdal2tiles.py (GDAL 库的一部分)
  • Pillow(python脚本)

数据源

  • 影像数据(没有高度信息)、地形数据(osm格式或者png影像图和灰度图)
  • 数据格式,png(xyz坐标地址请求)、geojson(静态地址)

openstreetmap(简称osm),https://www.openstreetmap.org/

openstreetmap的额外数据,https://download.geofabrik.de/

影像图下载

python 复制代码
import os
import math
import requests
from tqdm import tqdm

# --- 1. 配置区域 ---
# 你可以修改这里的参数来定义下载范围

# 下载的缩放层级 (z)。层级越高,细节越丰富,文件也越多。
# 建议先从较小的层级(如 10-12)开始测试。
ZOOM_LEVELS = [12,13,14,15,16,17,18,19] 

# 定义下载区域的经纬度边界框 (Bounding Box)
# 格式: [min_lng, min_lat, max_lng, max_lat]
# 下面是北京市中心的一个示例范围
BBOX = [114, 30, 115, 31] 

# 瓦片服务器 URL 模板 (OpenStreetMap)
# {s} 是子域名,用于负载均衡 (a, b, c)
# {z} 是层级, {x} 是x坐标, {y} 是y坐标
#TILE_URL_TEMPLATE = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
TILE_URL_TEMPLATE ="https://wprd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}"

# 保存瓦片的根目录
OUTPUT_DIR = "offline_tiles"
# --- 配置结束 ---


def deg2num(lat_deg, lon_deg, zoom):
    """
    将经纬度转换为瓦片坐标 (x, y)
    """
    lat_rad = math.radians(lat_deg)
    n = 2.0 ** zoom
    x_tile = int((lon_deg + 180.0) / 360.0 * n)
    y_tile = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
    return x_tile, y_tile

def download_tiles():
    """
    根据配置下载并保存瓦片
    """
    min_lng, min_lat, max_lng, max_lat = BBOX

    for zoom in ZOOM_LEVELS:
        print(f"\n--- 开始下载层级 {zoom} ---")
        
        # 计算边界框四个角点对应的瓦片坐标
        x_min, y_min = deg2num(max_lat, min_lng, zoom)
        x_max, y_max = deg2num(min_lat, max_lng, zoom)
        
        total_tiles = (x_max - x_min + 1) * (y_max - y_min + 1)
        print(f"层级 {zoom} 需要下载 {total_tiles} 张瓦片...")

        # 使用 tqdm 创建进度条
        pbar = tqdm(total=total_tiles, unit="tile")

        for x in range(x_min, x_max + 1):
            for y in range(y_min, y_max + 1):
                # 构造瓦片的保存路径
                tile_dir = os.path.join(OUTPUT_DIR, str(zoom), str(x))
                os.makedirs(tile_dir, exist_ok=True)
                tile_path = os.path.join(tile_dir, f"{y}.png")

                # 如果文件已存在,则跳过下载
                if os.path.exists(tile_path):
                    pbar.update(1)
                    continue

                # 构造下载 URL
                # 使用随机子域名 {s},这里我们循环使用 a, b, c
                subdomain = "abc"[(x + y) % 3]
                url = TILE_URL_TEMPLATE.format(s=subdomain, z=zoom, x=x, y=y)

                try:
                    # 下载瓦片
                    response = requests.get(url, timeout=10)
                    response.raise_for_status()  # 如果请求失败则抛出异常

                    # 保存瓦片
                    with open(tile_path, 'wb') as f:
                        f.write(response.content)
                    
                except requests.exceptions.RequestException as e:
                    print(f"\n下载失败: {url} -> {e}")
                    # 如果下载失败,可以选择删除空文件或记录日志
                    if os.path.exists(tile_path):
                        os.remove(tile_path)
                
                pbar.update(1)
        
        pbar.close()
        print(f"--- 层级 {zoom} 下载完成 ---")

    print("\n所有指定层级的瓦片下载完毕!")
    print(f"瓦片已保存至: {os.path.abspath(OUTPUT_DIR)}")


if __name__ == "__main__":
    download_tiles()
相关推荐
何以解忧,唯有..7 分钟前
LangChain 模型调用方法总结:invoke、batch、stream 的入参与出参
开发语言·langchain·batch
SamChan9012 分钟前
Python+ReportLab自动生成PDF翻译质量审计报告:从数据到可视化的完整方案
开发语言·python·ai·pdf·wpf
深念Y12 分钟前
Makefile vs go run:Go 项目构建方式对比
java·开发语言·golang·k8s·编译·流水线·cicd
whcyhhh13 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十八2)
大数据·开发语言·python
一晌小贪欢14 分钟前
Python办公18:PDF 转 Word——利用 OCR 技术批量提取不可编辑的文档内容
开发语言·python·pdf·word·excel·数据可视化·python办公
奈斯先生Vector23 分钟前
从“能调用”到“可替换”:Coze 多模型 API 编排层设计指南
linux·运维·人工智能·ubuntu·平面·ios
我命由我1234523 分钟前
Android Camera - 获取当前设备屏幕的旋转角度、保存帧到外部存储的私有空间
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
阮小贰35 分钟前
干支编码的确定性实现:节气切分 + 1000 条溯源断语(附 JS 源码)
开发语言·javascript·ecmascript
DogDaoDao39 分钟前
HarmonyOS 深度解析:从微内核到 ArkTS 工程实战
android·linux·ios·华为·程序员·harmonyos·harmonyos next
一晌小贪欢1 小时前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公