Connecting QGIS to Postgres and PostGIS(中文翻译)
说明
- 保留 IT 专有名词(QGIS、Postgres、PostgreSQL、PostGIS、SRID、SQL、view、layer、DB Manager 等)为英文。
- 维持原页面的标题层级、段落、列表、图片与代码块结构;链接与图片均按原文保留。
- 个别术语在首次出现处给出中文释义,后续保持英文术语。
QGIS(Quantum Geographic Information System)是用于制图的开源图形界面。QGIS 支持多种文件类型,并且对与 Postgres 和 PostGIS 的集成具有很好的支持。本文演示如何将 QGIS 连接到 Postgres 数据库,以及让二者协同工作的基础操作。
Connecting QGIS to Postgres
将 QGIS 连接到 Postgres 与连接其他 GUI 或应用程序类似:你需要数据库的 host、login、password 信息。无论是本地连接还是远程连接(如 Crunchy Bridge),流程相同。首次连接时,在 Browser 面板的 PostgreSQL 下选择 Add New Connection 进行配置。

默认情况下,QGIS 会将你的密码以明文形式存储在文件中。如果你只是在本地数据库上尝试,而且里面没有敏感数据,这也许问题不大。但若你连接的是共享给许多用户的生产数据库,最好选择更高等级的密码保护。在 PostgreSQL connections 对话框中,你可以为密码添加 Configurations:创建 master password、保存数据库凭据,凭据将被加密,只有通过 master password 才会解密。
Using QGIS to load data
QGIS 是将空间数据导入 Postgres/PostGIS 的好工具。你可以使用 QGIS 支持的任意文件类型,包括向量类型的 shapefiles(shp)、GeoJSON,甚至本机上的 csv 文件。要将数据加载进 QGIS,先到菜单 Layer → Add Layer,然后按照你所拥有的数据类型进行选择。

这里的示例使用了 Kansas 州的县级行政区图。此类地图经常可以从政府机构公开下载。
将图层加载进来后,你可以开启标签(labels)显示,以叠加几何体对应的文字标签。

现在数据已在 QGIS 中,我们可以将其保存到 Postgres 数据库,以便之后继续使用。在工具栏点击 DB Manager 图标,然后选择 Import Layer。

这里有若干设置,例如选择 primary key、源与目标 SRID。QGIS 也会建议在你的 geometry 列上添加索引,并且可以为你在数据库中创建该索引。
Loading data from PostGIS into QGIS
QGIS 是双向工作的。如果你已经在数据库中有可用的数据集,就可以直接把它作为数据源。在这种场景中,同样从菜单 Layer → Add Layer 开始。你需要指定要连接的数据库连接(或在此新增一个连接)。随后你可以浏览数据库中的所有表,并选择要添加到地图视图中的表作为图层。

关于将文件加载到 PostGIS 的整体概览,参见我们的博客文章:PostGIS file loading。
File loading troubleshooting
取决于你拿到的文件,QGIS 可能会对其不太“满意”,你可能会在文件旁看到警告图标。QGIS 主要在提示以下问题:
-
There’s no spatial reference id
处理地理空间数据时,Spatial Reference ID(空间参考 ID,SRID)非常关键。如果没有更好的选项,可以默认使用 4326。
查看是否设置了 SRID:SELECT ST_SRID(geom) FROM my_table_name LIMIT 1;更新 SRID:
SELECT UpdateGeometrySRID('my_table_name','geom',4326); -
There’s no geometry column
假设你确实有 points/lines/polygon 数据,但目前存储在错误的数据类型中,你可以新增一个 geometry 列,并把你的数据写入该列:ALTER TABLE my_table_name ADD COLUMN geom geometry(Point, 4326); UPDATE my_table_name SET geom = ST_SetSRID(ST_MakePoint(my_column, my_column), 4326); -
There’s no primary key
关系型数据库依赖 primary key 将相关数据关联在一起。如果已经有 id 列,只需为其创建 primary key 索引:alter table my_table add primary key (id_column);如果并没有这样一个唯一列,你可能需要对数据做更多清理工作。
Writing and Saving SQL
QGIS 的一个很酷的特性是:你可以直接对 Postgres 数据库编写 SQL,并将结果以空间几何的形式可视化。你也可以保存查询以便后续复用,甚至可以基于查询结果在 QGIS 中创建 layer。
下面是一个示例查询:我把先前导入的 Kansas 县界几何和另一个数据源(分县人口数据)进行 join。查询中我只选择几何列,并通过加载选项,让 QGIS 将该查询结果直接添加为一个图层。

QGIS 还允许你将查询保存为 “view”。这是数据库中的一个术语,表示把查询的结果保存为一个可复用的“虚拟表”。在 QGIS 项目中,你也可以将 view 作为图层加载。关于 view 的使用可以参考这篇文章:Postgres Subquery Powertools。如果你在 QGIS 地图中仅使用一小部分数据,而在数据库中保存的是更大的数据集,使用 views 会是很好的实践。
下面这张图是我基于 4 个不同的查询图层(每个图层对应不同的人口密度区间)制作的地图示例。

别忘了:QGIS 的工作方式是叠加的 stacked layers,因此你的 SQL 查询图层需要放在 base map 之上,否则将不可见。
Saving QGIS projects in Postgres
你也可以把 QGIS 项目保存在 Postgres 数据库中。该选项位于菜单 Project → Save to。这对于需要团队成员共享项目,或者不希望将 QGIS 项目保存在本地的场景很有用。

这里有一段来自 PostGIS Day 2020、关于本主题更全面的视频:QGIS and PostGIS。
- 你可以使用 QGIS 将 shapefiles 等多种文件类型加载到 Postgres
- 你可以使用 QGIS 直接基于已有的 Postgres/PostGIS 数据源创建地图
- 你可以在 QGIS 中对 Postgres 数据编写查询,并将结果显示为几何图层
- 你可以在 QGIS 中编写 join 查询,将几何字段与其他属性数据或数据库中的其他表做关联
- 你可以将所有 QGIS 项目工作保存在 Postgres 数据库中,便于共享与集中管理
3129

被折叠的 条评论
为什么被折叠?



