如何在 QGIS 中下载 OpenStreetMap 数据
Published

要将 OpenStreetMap 数据下载到 QGIS 中,请安装 QuickOSM plugin,打开 Vector > QuickOSM > QuickOSM…,在 Quick query 选项卡中输入类似 building 的键,选择 Canvas Extent,然后点击 Run query。如果要获取整个国家/地区的数据,请从 Geofabrik 下载 .osm.pbf 文件,然后直接拖入 QGIS。
选择哪种方法取决于两件事:区域范围有多大,以及你是否已经知道所需数据的 OpenStreetMap 标签。我在 2026 年 9 月 23 日于 QGIS 3.44.7 中对肯尼亚基苏木市中心逐一测试了下面的每种方法,并为每种方法计时。
简短回答
| 你的区域 | 方法 | 基苏木实测 |
|---|---|---|
| 城镇或你当前打开的地图范围,且你知道标签 | 方法 1:QuickOSM | 5 秒处理 6.3 km² 上的 4,560 栋建筑 |
| 你不知道标签,或想一次性完成样式和保存 | 方法 2:QGIS 中的 AI agent | 3 分 41 秒完成建筑、主干道、样式和 GeoPackage |
| 一个地区或整个国家 | 方法 3:Geofabrik 提取文件 | 下载肯尼亚数据(334 MB)耗时 57 秒,裁剪出基苏木耗时 6 分 28 秒 |
| 想先在地图上测试的查询 | 方法 4:Overpass Turbo,导出 GeoJSON | 几秒内屏幕上显示 417 栋建筑 |
我的默认做法是:城镇规模以内的需求用 QuickOSM,一旦区域大到地区级别就改用 Geofabrik。我会避免的路线是向 Overpass 发送国家规模的查询,接下来的几节会说明原因。
开始之前
OpenStreetMap 将所有数据存储为标签,即键和值的组合:building=yes、highway=primary、amenity=school。每种下载方法都会要求你提供键、值或两者,因此先在 OSM wiki 的 Map features 页面 上查一下标签会很有帮助。仅提供键(building)会返回该键的所有值。
QuickOSM 2.5.3(截至 2026 年 9 月 23 日 plugin 仓库中的当前版本)需要 QGIS 3.34 或更高版本,并且需要联网。走 Geofabrik 路线时,每个国家大约需要几百 MB 的磁盘空间。
网上常见的误解
「QGIS 中的 OpenStreetMap layer 就是数据本身。」 并不是。Browser 面板中 XYZ Tiles 下的 OpenStreetMap 条目是一组根据数据绘制的图片。你无法在上面选择一栋建筑、读取其属性或进行测量。
瓦片使用政策用一句话说清楚了:“OpenStreetMap (OSM) data is free for everyone to use. Our tile servers are not.”它还禁止批量下载瓦片,所以把底图保存到本地也不是绕过这个限制的办法。
「显示 Access blocked 说明你被 OpenStreetMap 屏蔽了。」 “Access blocked”提示是印在地图瓦片上、而不是印在数据上的。关于被屏蔽瓦片的 OSM wiki 页面 给出了最常见的一种:“403r. Access blocked. Referer is required by tile usage policy of OpenStreetMap's volunteer-run servers”。
它表示显示底图的应用程序没有发送 Referer 或 User-Agent 请求头。这与下面的数据服务无关,那些服务是以其他方式失败的。
「Overpass 可以给我整个国家的数据。」 Overpass API wiki 要求公共用户每天不超过 10,000 次查询和 1 GB 流量,并将需要大范围数据的用户指向 Geofabrik 上的区域转储文件。我让 QuickOSM 查询肯尼亚全部建筑时,在大约 32 秒后因超时而失败,这会在方法 4 中说明。
方法 1:QuickOSM,适用于城镇或当前视图
QuickOSM 会将你的查询发送到 Overpass 服务器,并把结果作为 layers 加载进来。当你要的区域正好在屏幕上时,这是最快的途径。
安装 QuickOSM
Plugins > Manage and Install Plugins,搜索 QuickOSM,点击 Install Plugin。首次打开时,它会提醒你 OSM 数据采用 ODbL 许可,并要求标注“© OpenStreetMap contributors”出处。缩放到你的区域
在画布上框出你想下载的城镇或街区。我缩放到了基苏木市中心,大约 3 km × 2 km 的范围。填写 Quick query 选项卡
依次打开Vector > QuickOSM > QuickOSM…,然后选 Quick query。在键的位置输入 building,值留空(此时显示“Query on all values”),并将范围设为 Canvas Extent。其他范围选项还有 In(地名)、Around、Layer Extent 和 Not Spatial。运行查询
点击Run query。基苏木的数据在 5 秒内返回,生成两个 layers:一个是带 58 个属性字段的 4,560 个建筑多边形,另一个是 3 个以点形式绘制的建筑。
Advanced 部分比你想象的更重要。超时默认是 25 秒,对城镇够用,对地区级别则不够。Directory 字段默认是“Save to temporary file”,因此 layers 会落在内存里,在 Layers 面板中带有 scratch-layer 图标,如果你关闭 QGIS 时没有保存,它们就会消失。

要保留这些数据,请右键点击该 layer,选择 Make Permanent…,然后指定一个 GeoPackage 路径。基苏木的建筑生成了一个 1.5 MB 的文件。你也可以在运行前在 Advanced 中设置一个目录,QuickOSM 会直接写入 GeoPackage(默认)、GeoJSON、Shapefile 或 KML。

我没想到这里的标签如此简陋。基苏木的 4,560 栋建筑中有 4,453 栋(98%)只带有 building=yes。按“建筑类型”设置样式的结果就是一种颜色加 107 个例外。标签的详细程度只取决于当地制图者记录到什么程度,所以在承诺按类型出图之前,先检查一下各类值数量。
适合使用的情况: 区域是城镇或更小,并且你知道所需的键。
应该跳过的情况: 区域是地区或国家,或者查询需要组合多个标签,而 Quick query 表单不支持这种组合方式。
方法 2:在 QGIS 中对 AI agent 说一句话
我们自己就开发了这样一个工具,AI Agent,它是 QGIS 内的一个聊天面板,可以在你打开的项目中执行各种操作。本节介绍的是我们自己的工具。
它适合那些不知道标签、或者希望一次性完成整条流程(获取、裁剪、样式化、保存)的读者。在一个空项目里,我缩放到与之前相同的基苏木视图,然后输入:
从 OpenStreetMap 加载肯尼亚基苏木市中心的建筑和主要道路,按占地面积给建筑着色,并将两个 layers 保存到 GeoPackage 中。
它花了 3 分 41 秒、执行了 39 个操作。它对基苏木进行了地理编码,在 6.2 km² 的视图范围内查询了 OpenStreetMap 中的建筑以及标签为 motorway 至 tertiary 的道路,将两者裁剪到该视图,并在 UTM 36S 分区中计算了 area_m2 字段,从而得到真实的平方米面积。接着它应用了五级渐变样式,在写入文件前询问了一次,然后把两个 layers 写入了项目旁边的 Kisumu central OSM.gpkg 中。

这些 layers 是 GeoPackage 中的普通 QGIS layers,因此和 QuickOSM 生成的 layers 一样可以直接沿用到你项目的其余部分。只查一个视图中的一个标签时,QuickOSM 的 5 秒更胜一筹。agent 需要几分钟是因为它还要裁剪、添加面积字段、设置样式并保存。
第二条消息演示了其他所有方法都无法一次性完成的事。我让它加载同一视图的 Overture Maps 建筑,并统计 OpenStreetMap 没有的那些。它在 2 分 41 秒内加载了 7,318 栋 Overture 建筑并按 ID 进行匹配:4,572 栋来自 OpenStreetMap,2,367 栋来自 Google Open Buildings,379 栋来自 Microsoft 的机器学习足迹。
也就是说,仅通过 OSM 下载基苏木市中心的数据会漏掉 2,746 栋建筑,占总数量的 38%。

适合使用的情况: 区域是城镇或你当前打开的地图范围,并且你希望数据不仅被加载,还要被样式化、裁剪或比较。
应该跳过的情况: 你需要地区或国家范围的数据。它适用于城镇规模,大范围的请求更容易超时,那种情况下 Geofabrik 提取文件是更快的途径。
方法 3:Geofabrik 提取文件,适用于地区或国家
Geofabrik 按大洲、国家(部分国家还细分到地区)发布免费的 OpenStreetMap 提取文件。这种方式不涉及任何查询:你下载的文件已经包含了所有对象。
选择地区
找到你的国家。2026 年 9 月 23 日的肯尼亚页面提供了 334 MB 的kenya-latest.osm.pbf、939 MB 的 kenya-latest-free.shp.zip 和 965 MB 的 kenya-latest-free.gpkg.zip。这里的 .pbf 下载耗时 57 秒。将 .pbf 拖入 QGIS
QGIS 会打开“Select Items to Add”对话框,显示五个 layers:points、lines、multilinestrings、multipolygons 和 other_relations。建筑、土地利用和大多数面都位于 multipolygons 中。过滤出你需要的要素
右键点击该 layer,选择Filter…,输入 "building" IS NOT NULL。building、amenity、landuse 等常见键都有自己的列。其余所有数据都在 other_tags 中。裁剪出你的区域并保存
整个国家绘制起来很慢。用下面的命令把你要的区域裁剪一次,然后基于这个文件工作。
不要直接使用国家文件。QGIS 每次绘制或统计时都会从头到尾读取 .osm.pbf,与缩放级别无关。在我的笔记本电脑上,直接从肯尼亚文件绘制基苏木视图第一次花了 19 分钟(当时还有一个任务在读取同一文件),第二次通过时统计该视图中的建筑花了 2 分 42 秒。用 QGIS 自带的 GDAL 工具 ogr2ogr 裁剪一次:
ogr2ogr -f GPKG kisumu.gpkg kenya-latest.osm.pbf multipolygons -spat 34.745 -0.1114 34.772 -0.0926 -where "building IS NOT NULL"
这一步耗时 6 分 28 秒,生成一个包含 4,576 栋建筑的 1.3 MB GeoPackage,QGIS 会像处理任何小型 layer 一样处理它。-spat 后面的四个数字依次是西、南、东、北(单位:度)。
shapefile 和 GeoPackage 的 zip 包更容易打开,每个主题一个 layer,但 格式说明 列出了免费版缺少的内容:其中包括建筑高度和楼层数。.pbf 则会保留所有标签。
适合使用的情况: 区域是地区或国家,或者你会反复查询同一区域。
应该跳过的情况: 你只需要某个街区的一个标签。为 6 km² 的数据下载 334 MB 是最慢的方式。
方法 4:Overpass Turbo,适用于想先在地图上查看的查询
Overpass Turbo 是一个网页工具,你可以在这里编写 Overpass 查询,在当前地图视图上运行,并在下载任何数据之前查看结果。它是构建 QuickOSM 表单无法表达的查询的地方。
下面这三行代码会查询当前地图视图中的所有建筑:
[out:json][timeout:25];
way["building"]({{bbox}});
out geom;
编写查询
将其粘贴到左侧的编辑器中,或者使用Wizard 按钮构建一个查询。在你的视图上运行
将地图缩放到你的区域并点击Run。在基苏木市中心 zoom 17 的视图上,它绘制了 417 栋建筑。导出为 GeoJSON
依次点击Export、GeoJSON、download。同一对话框还提供 GPX、KML 和原始 OSM 数据。把 .geojson 文件拖入 QGIS。
超时问题也正是出在这里,因为 QuickOSM 和 Overpass Turbo 连接的是同一批服务器。根据 Overpass QL 文档,[timeout:] 默认为 180 秒,[maxsize:] 默认为 512 MB 服务器内存。超出其中任何一个限制的查询都会被终止。QuickOSM 默认发送 25 秒。当我让它查询肯尼亚全部建筑时,大约 32 秒后得到的答复是:
Overpass error: Query timed out in "area-query" at line 5 after 30 seconds.
公共服务器还会限制请求频率。为了挑选本文要写的城镇,我在约 20 秒的快速循环中直接查询,第五次请求返回了 429 Too Many Requests,第六次返回 504 Gateway Timeout。wiki 对 429 的建议是暂停 30 秒再发送下一个请求。调高 [timeout:] 对接近完成、只差一点的查询有帮助;对国家规模的查询来说,它只会让你在得到同样结果之前等得更久。
适合使用的情况: 你正在编写自定义查询,想在加载数据之前先在地图上查看结果。
应该跳过的情况: 区域很大,或者你要反复下载同样的数据。请使用方法 3。
发布时请为 OpenStreetMap 署名
OpenStreetMap 数据采用开放数据库许可证。版权页面 要求你在任何使用场景中做两件事:为 OpenStreetMap 署名,并明确说明数据采用 ODbL 许可,链接到 openstreetmap.org/copyright 即可满足这一点。署名指南 接受“© OpenStreetMap contributors”这种形式,并希望将其放在地图旁边或读者预期能看到署名的地方。
地图图片或 PDF 属于加工成果,署个名就够了。而以数据形式分享的 layer(例如你修正过的建筑 GeoPackage)则必须继续遵循 ODbL。同一页面还说:“If you alter or build upon our data, you may distribute the result only under the same licence.”在 QGIS 打印布局中,在地图角落放一个带署名的文本项,即可满足第一种情况。
需要记住的要点
- 按区域大小选择方法:城镇或当前视图用 QuickOSM(基苏木 4,560 栋建筑仅需 5 秒),想一条消息搞定裁剪、样式和保存时用 AI agent,地区或国家用 Geofabrik
.pbf,测试自定义查询用 Overpass Turbo。 - QGIS 中的 OpenStreetMap 底图是根据数据绘制出来的图片,而“Access blocked”是关于这些图片的提示,与数据无关。
- QuickOSM 的结果默认是临时 layers,直到你使用
Make Permanent…或在 Advanced 中设置目录。 - 命名恰好相反:Overpass 查询在大范围上会失败:QuickOSM 默认超时 25 秒,服务器用 429 限制请求频率,国家级数据应使用 Geofabrik 提取文件。
- OpenStreetMap 的覆盖并不均匀:在基苏木市中心,Overpass 返回了 4,572 栋建筑,而融合了 Google 和 Microsoft 足迹的 Overture 则有 7,318 栋。
常见问题
如何获取我所在城镇的 OSM 建筑或道路?
在 QGIS 中缩放到该城镇,打开 Vector > QuickOSM > QuickOSM…,在键中输入 building(道路则输入 highway),设置 Canvas Extent 并运行查询。对于道路,可以添加一个值,例如 primary;也可以留空,以获取所有道路类别,包括人行道。最后用 Make Permanent… 保存结果。
QuickOSM、Geofabrik 还是 Overpass:该选哪个?
知道标签、且范围是城镇或更小时用 QuickOSM。地区或国家范围、或者你会反复使用该区域时用 Geofabrik。想先在地图上编写并测试查询时用 Overpass Turbo。QuickOSM 和 Overpass Turbo 使用同一批 Overpass 服务器,因此限制也相同。
为什么我的 Overpass 查询会超时或提示 access blocked?
超时表示查询超过了 [timeout:](QuickOSM 中为 25 秒,Overpass 默认为 180 秒)或内存限制,所以请缩小区域范围,或改用 Geofabrik 提取文件。429 Too Many Requests 表示你在短时间内发送了太多请求,等 30 秒即可。“Access blocked”是印在底图瓦片上、而不是 Overpass 数据上的,它来自瓦片服务器的 Referer 和 User-Agent 规则。
如何保存 QuickOSM 创建的临时 layer?
在 Layers 面板中右键点击该 layer,选择 Make Permanent…,选择 GeoPackage 和一个文件路径。下次想跳过这一步,就在运行查询前在 QuickOSM 的 Advanced 部分设置 Directory,它会直接写入文件。
发布地图时 ODbL 许可有什么要求?
在地图旁边为 OpenStreetMap 署名,例如“© OpenStreetMap contributors”,并明确说明数据采用 ODbL 许可,通常用指向 openstreetmap.org/copyright 的链接即可。如果分享的是数据本身,无论是否修改,都必须继续遵循 ODbL。
OSM 的建筑覆盖是否完整?
并非所有地方都完整。2023 年发表在 Nature Communications 上的一项研究估计,全球城市中心 OSM 建筑的平均完整度为 24%,其中欧洲和中亚为 71%,南亚为 9%。在基苏木市中心,Overture 收录的建筑中有 38% 不在 OSM 中。
在依赖统计数量之前,先与其他数据源对比,或者像 在 QGIS 中检测建筑足迹 一文那样从影像中检测缺失的建筑。什么是建筑足迹 一文讲了各数据集之间的差异。
拿到数据之后,AI Agent 指南 展示了用一句话还能对它做些什么。如果你的下一个 layer 是影像而不是矢量数据,在 QGIS 中下载 Sentinel-2 和 对扫描地图进行地理配准 是两篇配套教程,添加底图 则介绍了本文开头提到的图片 layer。
中,请安装 QuickOSM plugin,打开 

