跳转到内容
AI Agent
QGIS
Tutorial

如何在 QGIS 中下载 OpenStreetMap 数据

Published

肯尼亚基苏木市中心一分为二:左侧是 OpenStreetMap 底图,右侧是相同街道的已加载数据,建筑按占地面积着色,并显示主要道路。
肯尼亚基苏木市中心。左侧是 OpenStreetMap 底图:一张图片。右侧是同一个地方,却是可以选择、测量和保存的数据:4,572 栋建筑和 128 条主要道路。

要将 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:QuickOSM5 秒处理 6.3 km² 上的 4,560 栋建筑
你不知道标签,或想一次性完成样式和保存方法 2:QGIS 中的 AI agent3 分 41 秒完成建筑、主干道、样式和 GeoPackage
一个地区或整个国家方法 3:Geofabrik 提取文件下载肯尼亚数据(334 MB)耗时 57 秒,裁剪出基苏木耗时 6 分 28 秒
想先在地图上测试的查询方法 4:Overpass Turbo,导出 GeoJSON几秒内屏幕上显示 417 栋建筑

我的默认做法是:城镇规模以内的需求用 QuickOSM,一旦区域大到地区级别就改用 Geofabrik。我会避免的路线是向 Overpass 发送国家规模的查询,接下来的几节会说明原因。

开始之前

OpenStreetMap 将所有数据存储为标签,即键和值的组合:building=yeshighway=primaryamenity=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(地名)、AroundLayer ExtentNot Spatial

运行查询

点击 Run query。基苏木的数据在 5 秒内返回,生成两个 layers:一个是带 58 个属性字段的 4,560 个建筑多边形,另一个是 3 个以点形式绘制的建筑。
QuickOSM 的 Quick query 选项卡,键为 building,值为空,已选择 Canvas Extent,Advanced 部分已展开,显示 25 秒超时和 Save to temporary file。
Quick query 选项卡,Advanced 已展开。请看底部:默认是 25 秒超时和「Save to temporary file」。

Advanced 部分比你想象的更重要。超时默认是 25 秒,对城镇够用,对地区级别则不够。Directory 字段默认是“Save to temporary file”,因此 layers 会落在内存里,在 Layers 面板中带有 scratch-layer 图标,如果你关闭 QGIS 时没有保存,它们就会消失。

QGIS 中显示基苏木市中心 OpenStreetMap 底图上的 4,560 栋红色 OpenStreetMap 建筑,Layers 面板中有两个名为 building 的 layer,并带有临时 layer 图标。
底图上的 QuickOSM 结果。两个名为 building 的 layer 名称右侧带有临时图标:此时还没有任何内容写入磁盘。

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

QGIS 的 layer 右键菜单,其中包含 Make Permanent,旁边是设置为 GeoPackage 的 Save Scratch Layer 对话框,layer 名称为 buildings。
Make Permanent 会打开 Save Scratch Layer 对话框,默认格式为 GeoPackage。QuickOSM 还在同一菜单中添加了「Reload the query in a new file」选项。

我没想到这里的标签如此简陋。基苏木的 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 中。

QGIS 中基苏木市中心的建筑按占地面积从黄色渐变到深红色,主要道路为蓝色,Layers 面板显示五个面积分级,AI Agent 面板列出了保存的 1.5 MB GeoPackage。
面板旁边的结果:4,572 栋建筑分为五个面积分级,最大达 17,026 m²,128 条主要道路线段,以及它保存的 1.5 MB GeoPackage。

这些 layers 是 GeoPackage 中的普通 QGIS layers,因此和 QuickOSM 生成的 layers 一样可以直接沿用到你项目的其余部分。只查一个视图中的一个标签时,QuickOSM 的 5 秒更胜一筹。agent 需要几分钟是因为它还要裁剪、添加面积字段、设置样式并保存。

在 QGIS 中免费试用 AI Agent

第二条消息演示了其他所有方法都无法一次性完成的事。我让它加载同一视图的 Overture Maps 建筑,并统计 OpenStreetMap 没有的那些。它在 2 分 41 秒内加载了 7,318 栋 Overture 建筑并按 ID 进行匹配:4,572 栋来自 OpenStreetMap,2,367 栋来自 Google Open Buildings,379 栋来自 Microsoft 的机器学习足迹。

也就是说,仅通过 OSM 下载基苏木市中心的数据会漏掉 2,746 栋建筑,占总数量的 38%。

QGIS 中基苏木市中心的 Overture 建筑按来源着色,黄色表示 OpenStreetMap,紫色表示 Google Open Buildings,青色表示 Microsoft ML Buildings,AI Agent 的答复统计出 2,746 栋不在 OpenStreetMap 中的建筑。
同一视图上的 Overture 数据,按来源着色。紫色(Google)和青色(Microsoft)是 OpenStreetMap 还没有的建筑。

适合使用的情况: 区域是城镇或你当前打开的地图范围,并且你希望数据不仅被加载,还要被样式化、裁剪或比较。

应该跳过的情况: 你需要地区或国家范围的数据。它适用于城镇规模,大范围的请求更容易超时,那种情况下 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:pointslinesmultilinestringsmultipolygonsother_relations。建筑、土地利用和大多数面都位于 multipolygons 中。

过滤出你需要的要素

右键点击该 layer,选择 Filter…,输入 "building" IS NOT NULLbuildingamenitylanduse 等常见键都有自己的列。其余所有数据都在 other_tags 中。

裁剪出你的区域并保存

整个国家绘制起来很慢。用下面的命令把你要的区域裁剪一次,然后基于这个文件工作。
kenya-latest.osm.pbf 的 QGIS Select Items to Add 对话框,列出了 lines、multilinestrings、multipolygons、other_relations 和 points,其中 multipolygons 已被选中。
Geofabrik .pbf 内的五个 layers。建筑请选择 multipolygons。

不要直接使用国家文件。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

依次点击 ExportGeoJSONdownload。同一对话框还提供 GPX、KML 和原始 OSM 数据。把 .geojson 文件拖入 QGIS。
Overpass Turbo 左侧是三行建筑查询,右侧是基苏木市中心,建筑轮廓以蓝色高亮显示。状态栏显示 417 ways loaded。
左侧是查询,右侧是结果。右下角的计数器显示返回的内容:417 ways、417 个多边形。

超时问题也正是出在这里,因为 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。

在 QGIS 中免费试用 AI Agent