news 2026/4/18 10:50:44

使用Nginx基于下载的全球瓦片数据本地搭建瓦片底图服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Nginx基于下载的全球瓦片数据本地搭建瓦片底图服务

如何你已经有了 按 level(zoom)分类的 JPG或PNG 格式的瓦片数据需要发布瓦片数据
✅ 首选:Nginx /Apache 静态服务器直发
✅ 大规模:TileServer / MBTiles / 对象存储

为什么不用Geoserver?
GeoServer 不适合“管理已经切好的 XYZ/JPG 瓦片” GeoServer 的设计前提是:
原始空间数据 → 动态 / 缓存切片. 而不是: 已切好的瓦片 → 再发布

Nginx(其次 Apache)静态发布就是效率最高、最简单、最稳定的方案,而且这是行业共识,不是“经验之谈”。
静态瓦片请求的理想路径是:
HTTP 请求
→ 内核 sendfile
→ 文件系统页缓存
→ 网卡
❌ 没有 Python / Java
❌ 没有渲染
❌ 没有数据库
❌ 没有坐标计算
👉 IO 直通 = 性能极限

Nginx 的三大杀手级优势

  1. 事件驱动(epoll)
  • 单进程可扛数万并发
  • 非阻塞 IO
  1. sendfile + mmap
  • 文件直接从内核到网卡
  • 零拷贝
  1. 文件系统缓存命中率极高
  • 热瓦片 = 内存直出
  • QPS 几乎只看网卡带宽

一、最终目标

访问方式:
http://127.0.0.1/tiles/{z}/{x}/{y}.jpg
特点:
⚡ 极限性能
📦 零依赖
🔒 可加 HTTPS / 鉴权
🧱 可扩展 CDN

二、准备工作

1. 安装 Nginx

sudo apt update sudo apt install -y nginx

检查:

nginx -v

2. 准备瓦片目录(非常重要)

推荐目录结构

/data/tiles/ └── 0/ └── 0/ └── 0.jpg

即:
/data/tiles/{z}/{x}/{y}.jpg

📌 注意:
目录名必须是数字
文件名只包含 y.jpg

3. 权限设置(很多人卡在这里)

sudo chown -R www-data:www-data /data/tiles sudo chmod -R 755 /data/tiles

三、Nginx 核心配置

1. 新建站点配置

sudo nano /etc/nginx/sites-available/tiles.conf

2.tiles.conf内容

server { listen 80 default_server; listen [::]:80 default_server; # 瓦片根目录 #root /data; # 静态瓦片发布 location /tiles/ { alias /data/tiles/; autoindex on; # 直接命中磁盘文件 try_files $uri =404; # 缓存 1 年(瓦片不可变) expires 365d; add_header Cache-Control "public, immutable"; # 允许跨域 add_header Access-Control-Allow-Origin *; # 关闭访问日志(减少 IO) access_log off; } # 防止误访问根目录 location / { return 404; } }

3. 启用站点

sudo ln -s /etc/nginx/sites-available/tiles.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx

四、系统级性能开关(必须)

编辑主配置:

sudo nano /etc/nginx/nginx.conf

确保这些是 on:

sendfile on; tcp_nopush on; tcp_nodelay on; aio threads;

五、验证是否正常(3 步)
1️⃣ 浏览器访问一个瓦片

http://127.0.0.1/tiles/1/0/0.jpg

✔ 能显示图片 = 成功
2️⃣ 用 curl 看缓存头
curl -I http:///127.0.0.1/tiles/1/0/1.jpg
应看到:
Cache-Control: public, immutable
Expires: …
3️⃣ Leaflet 测试
index.html

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <title>Leaflet 双 TileLayer(低分 + ROI 高分)</title> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /> <style> html, body, #map { width: 100%; height: 100%; margin: 0; padding: 0; } </style> </head> <body> <div id="map"></div> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <script> /* ========================= 1️⃣ 地图初始化 ========================= */ const map = L.map('map', { center: [35, 105], // 中国附近 zoom: 4, minZoom: 1, maxZoom: 18 }); /* ========================= 2️⃣ 瓦片 URL ========================= */ const TILE_URL = 'http://127.0.0.1/tiles/{z}/{x}/{y}.jpg'; /* ========================= 3️⃣ 低分全球底图(z ≤ 5) ========================= */ const lowResLayer = L.tileLayer(TILE_URL, { tms: true, // ⚠️ 你的是 TMS minZoom: 1, maxZoom: 18, maxNativeZoom: 5, // 🔑 全球真实瓦片只到 5 attribution: 'Low Resolution Tiles' }); /* ========================= 4️⃣ 高分 ROI 图层(z ≥ 6) ========================= */ const highResLayer = L.tileLayer(TILE_URL, { tms: true, // 同样是 TMS minZoom: 6, // 🔑 6 级开始才请求 maxZoom: 18, opacity: 1.0, attribution: 'High Resolution ROI Tiles' }); /* ========================= 5️⃣ 叠加顺序(关键) ========================= */ // ⚠️ 先加低分,再加高分 lowResLayer.addTo(map); highResLayer.addTo(map); /* ========================= 6️⃣ 调试:点击查看当前级别 ========================= */ map.on('click', (e) => { console.log( `lat=${e.latlng.lat.toFixed(6)}, ` + `lon=${e.latlng.lng.toFixed(6)}, ` + `zoom=${map.getZoom()}` ); }); </script> </body> </html>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 2:33:11

搜索引擎排名内幕:前端也能撬动SEO流量密码

搜索引擎排名内幕&#xff1a;前端也能撬动SEO流量密码搜索引擎排名内幕&#xff1a;前端也能撬动SEO流量密码咱写前端的&#xff0c;凭啥不能抢 SEO 的饭碗&#xff1f;搜索引擎到底看啥&#xff1f;别被“算法”俩字吓尿内容质量与语义结构&#xff1a;别让爬虫看了一堆 div …

作者头像 李华
网站建设 2026/4/18 3:42:23

接口自动化测试覆盖率

一、接口覆盖率统计&#xff1a;3大核心维度 ▶ 1. 代码级覆盖率&#xff08;最严谨&#xff09; 原理&#xff1a;通过代码插桩&#xff0c;统计接口对应的业务代码执行情况 工具&#xff1a; Java&#xff1a;Jacoco Jenkins Python&#xff1a;Coverage.py Pytest 优…

作者头像 李华
网站建设 2026/4/17 4:31:11

Jenkins+Docker+Git实现自动化CI/CD

在如今的互联网时代&#xff0c;随着软件开发复杂度的不断提高&#xff0c;软件开发和发布管理也越来越重要。目前已经形成一套标准的流程&#xff0c;最重要的组成部分就是持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;及持续部署、交付&#xff08;…

作者头像 李华
网站建设 2026/4/16 23:40:40

EasyGBS算法算力平台:园区全域智能安防监控体系方案设计

在数字化浪潮席卷各行各业的今天&#xff0c;园区的安防需求变得日益复杂&#xff0c;传统园区安防系统正面临前所未有的挑战与机遇。如何将分散的视频资源整合为统一的智能安防网络?如何让监控系统从“看得见”到“看得懂”&#xff1f;作为一款视频监控平台&#xff0c;Easy…

作者头像 李华
网站建设 2026/4/17 8:41:21

互联网大厂Java面试场景:从基础到微服务架构的循序渐进考察

互联网大厂Java面试场景&#xff1a;从基础到微服务架构的循序渐进考察 第一轮&#xff1a;基础知识考察 场景&#xff1a;电商平台的后台开发 面试官&#xff1a;超好吃&#xff0c;你好。我们先从基础知识开始吧。你对Java的垃圾回收机制了解吗&#xff1f;可以谈谈Java中的G…

作者头像 李华