1. 创建相关目录

    mkdir -p /var/www/html/osm/tile-server && cd /var/www/html/osm/tile-server && mkdir osm-data postgres tiles style
    
    tile-server 目录结构
    ├── docker-compose.yml
    ├── postgres/
    ├── osm-data/
    ├── tiles/
    └── style/
  2. 下载中国 OSM 数据

    wget https://download.geofabrik.de/asia/china-latest.osm.pbf -O /var/www/html/osm/china-latest.osm.pbf
    
  3. /var/www/html/osm/tile-server下编写docker-compose.yml内容如下(根据自己机器的配置来调整shm_size

    services:
      postgres:
        image: postgis/postgis:16-3.4
        container_name: tile-postgres
        restart: always
        environment:
          POSTGRES_DB: gis
          POSTGRES_USER: renderer
          POSTGRES_PASSWORD: renderer
        volumes:
          - ./postgres:/var/lib/postgresql/data
        shm_size: 4g
      tile-server:
        image: overv/openstreetmap-tile-server
        container_name: tile-server
        restart: always
        ports:
          - "9080:80"
        volumes:
          - ./osm-data:/data
        environment:
          THREADS: 8
          UPDATES: disabled
    
  4. 抽取需要的目录及文件

    docker create --name osm-tile-server overv/openstreetmap-tile-server
    docker cp osm-tile-server:/data/. ./osm-data/
    docker rm osm-tile-server
    
  5. 导入数据(无法指定数据文件,只认region.osm.pbf,所以我们需要变更导入文件的名称)

    rm -f osm-data/region.osm.pbf && cp ../china-latest.osm.pbf osm-data/region.osm.pbf
    

    开始导入

    docker run --rm -v $(pwd)/osm-data:/data overv/openstreetmap-tile-server import
    
  6. 运行

    docker run -d --name osm-tile-server -p 9080:80 -v $(pwd)/osm-data:/data -v $(pwd)/osm-data/tiles:/var/cache/renderd/tiles --restart unless-stopped overv/openstreetmap-tile-server run
    

    更改目录权限,不然没办法创建缓存

    chmod -R 777 osm-data/tiles
    
  7. 中国区测试

    http://ip:9080/tile/5/26/12.png
  8. 预热数据(如果使用“Vector Tile(矢量瓦片)”这里可以忽略

    Zoom用途瓦片数量
    0-5全国概览
    6-8省级较少
    9-12城市级一般
    13-18街道级巨大

    进入容器

    docker exec -it osm-tile-server bash

    预热 0-12 级的

    nohup render_list -z 0 -Z 12 -a > render.log 2>&1 &

    预热 13-14 级的

    nohup render_list -z 13 -Z 14 -a > render.log 2>&1 &
    
    参数 含义
    -z 最低 zoom
    -Z 最高 zoom
    -a 全部区域