ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

QT搭建离线地图

QT搭建离线地图 摘要:本文介绍如何基于福建省 OSM 开源地图数据(fujian-260330.osm.pbf)在 Qt 中实现离线地图显示。文章首先解析 .osm.pbf 文件格式与数据内容,随后给出整体技术方案:使用 tilemaker 将 PBF 源数据转换为 MBTiles 矢量瓦片,再通过 Qt 应用读取并渲染。文中详细讲解了 tilemaker 的 config-openmaptiles.json 配置、MBTiles 数据结构、MVT 矢量瓦片解析流程,以及从经纬度到屏幕坐标的完整坐标转换过程,涵盖世界像素坐标、瓦片坐标、屏幕坐标等核心概念。效果展示fujian-260330.osm.pbf 文件详解一、文件名含义fujian:代表福建省范围260330:大概率是2026 年 03 月 30 日的 OSM 地图数据快照版本osm.pbf:开源地图二进制矢量数据格式二、文件本质这是OpenStreetMap(OSM 开源世界地图)的福建省全域矢量地图二进制压缩数据包。 OSM 是全球开源、免费可商用的地图项目,.osm.pbf是 OSM 官方主推的存储格式:基于 Google Protobuf 二进制压缩,比原始 XML 格式(.osm)体积小 50% 以上、读写速度快数倍,专门用来存储海量地理矢量数据。三、里面包含哪些地理数据文件内存储福建全省所有开源地图要素,主要分为三类:点要素:POI 兴趣点(商铺、学校、医院、加油站、公交站、红绿灯等)线要素:高速 / 国道 / 城市道路、铁路、地铁、河流、管线等路网水系面要素:建筑楼栋、小区、湖泊、山体、农田、行政区边界、公园绿地等地块信息Qt离线显示1、用开源工具tilemaker将pbf地图文件转换成MBTiles 矢量瓦片2、根据可视窗口大小计算世界像素坐标范围,然后再除于256转成瓦片坐标范围3、遍历这些要显示的瓦片:根据中心经纬度计算中心世界像素坐标(wx,wy)然后计算屏幕左上角原点中心像素坐标(wx-width/2,wy-height/2)根据瓦片坐标从MBTiles数据库中查询pbf数据使用PBFDecoder读取pbf数据再使用MVTDecoder解析数据最后就可以进行几何渲染,然后计算屏幕坐标,画在对应的位置上。fujian-260330.osm.pbf地图文件.osm.pbf 是 OpenStreetMap 的原始矢量数据(节点、道路、建筑、水系等),不能直接显示。需要解决三个问题:1. 数据解析 — 读懂 PBF 里的 OSM 数据2. 地图渲染 — 把数据画成地图(道路多宽、水系什么颜色……)3. 瓦片管理 — 地图按瓦片加载,支持缩放和平移方案 A:预生成 MBTiles 瓦片 + Qt 原生渲染 ⭐推荐.osm.pbf → [外部工具一次转换] → .mbtiles (SQLite, 里面是预渲染好的 PNG 瓦片)↓Qt 应用: 从 SQLite 读 PNG → QPainter 贴到屏幕上- 预处理: 用 tilemaker、planetiler 等工具,把 .osm.pbf 一次性转成 .mbtiles(一个 SQLite 文件,里面按 z/x/y存着瓦片图片)- Qt 端: 自己写一个 QWidget,做墨卡托投影计算,按需从 SQLite 取瓦片,用 QPainter::drawPixmap 贴图- 优点: 纯 Qt/C++,无外部依赖,性能好,真正离线- 缺点: 需要手写瓦片加载、缓存、平移/缩放手势- 适合: 你从零搭建、想要完全掌控output.mbtiles 里面存的是矢量瓦片(MVT protobuf),不是图片所以 tilemaker 生成的是矢量瓦片,而 GraphicsMap 需要栅格瓦片(图片)。有两条路A、写一个 Python 脚本,读取现有的 output.mbtiles(矢量),渲染成 256×256 PNG 瓦片,输出新的fujian.mbtiles(栅格),GraphicsMap 直接加载。input: output.mbtiles (矢量瓦片)output: fujian.mbtiles (栅格瓦片)pbf-》output.mbtiles (矢量瓦片)-》output: fujian.mbtiles (栅格瓦片)矢量瓦片和栅格瓦片的区别是?在 WebGIS、OpenLayers、Leaflet、Mapbox 等地图开发中,栅格瓦片(Raster Tile)和矢量瓦片(Vector Tile)是两种主流地图瓦片技术。栅格瓦片(Raster Tile)把地图提前切成很多 PNG/JPG 图片。地图显示时就是把很多图片拼起来。整体流水线从数据库里的二进制数据,一步步变成屏幕上可见的地图整体流水线 SQLite (.mbtiles) │ ▼ ① MBTilesReader ─── 从数据库读 gzip 压缩的 PBF 二进制 │ ▼ ② zlib inflate ─── gzip 解压 → 原始 PBF 字节 │ ▼ ③ MVTDecoder ─── 解析 PBF 二进制 → 结构化几何数据 │ ▼ ④ TileRenderer ─── 几何数据 + Style配色 → QImage (256×256) │ ▼ ⑤ MapWi
返回列表