跳转到内容
AI Agent
QGIS
Tutorial

QGIS 下载 OSM 数据:QuickOSM、Geofabrik 和 Overpass 教程

发布于

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

要将 OpenStreetMap 数据下载到 QGIS 中,请安装 QuickOSM 插件,打开 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 智能体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 日 插件仓库中的当前版本)需要 QGIS 3.34 或更高版本,并且需要联网。走 Geofabrik 路线时,每个国家大约需要几百 MB 的磁盘空间。

网上常见的误解

“QGIS 中的 OpenStreetMap 图层就是数据本身。” 并不是。浏览器面板中 XYZ 切片下的 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 服务器,并把结果作为图层加载进来。当您要的区域正好在屏幕上时,这是最快的途径。

安装 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 秒内返回,生成两个图层:一个是带 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”,因此图层会落在内存里,在图层面板中带有临时图层图标,如果您关闭 QGIS 时没有保存,它们就会消失。

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

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

QGIS 的图层右键菜单,其中包含 Make Permanent,旁边是设置为 GeoPackage 的 Save Scratch 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 智能体 说一句话

我们自己就开发了这样一个工具,AI Agent,它是 QGIS 内的一个聊天面板,可以在您打开的项目中执行各种操作。本节介绍的是我们自己的工具。

它适合那些不知道标签、或者希望一次性完成整条流程(获取、裁剪、样式化、保存)的读者。在一个空项目里,我缩放到与之前相同的基苏木视图,然后输入:

从 OpenStreetMap 加载肯尼亚基苏木市中心的建筑和主要道路,按占地面积给建筑着色,并将两个图层保存到 GeoPackage 中。

它花了 3 分 41 秒、执行了 39 个操作。它对基苏木进行了地理编码,在 6.2 km² 的视图范围内查询了 OpenStreetMap 中的建筑以及标签为 motorway 至 tertiary 的道路,将两者裁剪到该视图,并在 UTM 36S 分区中计算了 area_m2 字段,从而得到真实的平方米面积。接着它应用了五级渐变样式,在写入文件前询问了一次,然后把两个图层写入了项目旁边的 Kisumu central OSM.gpkg 中。

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

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

在新的 QGIS 项目中的一次更简短的请求:21 秒加载 851 栋建筑和 52 条道路,占地面积中位数为 177 m²。Get the free QGIS pluginFree plan, no credit card.

第二条消息演示了其他所有方法都无法一次性完成的事。我让它加载同一视图的 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”对话框,显示五个图层:points、lines、multilinestrings、multipolygons 和 other_relations。建筑、土地利用和大多数面都位于 multipolygons 中。

过滤出您需要的要素

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

裁剪出您的区域并保存

整个国家绘制起来很慢。用下面的命令把您要的区域裁剪一次,然后基于这个文件工作。
kenya-latest.osm.pbf 的 QGIS Select Items to Add 对话框,列出了 lines、multilinestrings、multipolygons、other_relations 和 points,其中 multipolygons 已被选中。
Geofabrik .pbf 内的五个图层。建筑请选择 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 会像处理任何小型图层一样处理它。-spat 后面的四个数字依次是西、南、东、北(单位:度)。

Shapefile 和 GeoPackage 的 zip 包更容易打开,每个主题一个图层,但 格式说明 列出了免费版缺少的内容:其中包括建筑高度和楼层数。.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。
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 属于加工成果,署个名就够了。而以数据形式分享的图层(例如您修正过的建筑 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 智能体,地区或国家用 Geofabrik .pbf,测试自定义查询用 Overpass Turbo。
  • QGIS 中的 OpenStreetMap 底图是根据数据绘制出来的图片,而“Access blocked”是关于这些图片的提示,与数据无关。
  • QuickOSM 的结果默认是临时图层,直到您使用 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 创建的临时图层?

在图层面板中右键点击该图层,选择 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 指南 展示了用一句话还能对它做些什么。如果您的下一个图层是影像而不是矢量数据,在 QGIS 中下载 Sentinel-2 和 对扫描地图进行地理配准 是两篇配套教程,添加底图 则介绍了本文开头提到的图片图层。数据加载后,QGIS 中的空间连接可以把它挂到您自己的区域上,例如每所学校所在的区。

在 QGIS 里,说一句就能完成

AI Agent 会在你自己的 QGIS 项目中,完成你描述的任务。免费使用,无需绑卡。

免费试用 AI Agent
由以下作者撰写Yvann Barbot
·7 min read