QGIS 将 Shapefile 导入 PostGIS 数据库

一、背景介绍:QGIS、PostgreSQL 和 PostGIS 的关系和用途

在开始动手操作之前,我们先简单了解一下 QGIS、PostgreSQL 和 PostGIS 之间的关系及其用途。

  • QGIS(Quantum GIS):一款开源免费的桌面地理信息系统(GIS)软件。它可以用来可视化和编辑空间数据(如点、线、面矢量数据和栅格影像),支持多种数据格式(如 Shapefile、GeoJSON、GeoPackage 等)和数据库(如 PostgreSQL、SQLite 等)。借助 QGIS,用户能够直观地在地图上查看数据、进行空间分析,以及通过插件扩展更多功能。
  • PostgreSQL:一个功能强大的开源关系型数据库管理系统。在默认情况下,PostgreSQL 处理常规的表格数据,但并不直接支持空间数据类型。
  • PostGIS:PostGIS 是 PostgreSQL 的空间数据库扩展(也可称作“插件”)。安装并在数据库中启用 PostGIS 后,PostgreSQL 就能够存储和查询空间数据。PostGIS提供了GeometryGeography 等空间数据类型,以及丰富的空间函数(例如距离计算、空间相交判断等),使得 PostgreSQL 成为完整的地理空间数据库。

三者的关系简单来说就是:PostgreSQL + PostGIS 提供了后端的空间数据存储和管理,而 QGIS 则是前端的可视化和编辑工具。我们可以使用 QGIS 来连接 PostGIS 数据库,方便地导入、导出和编辑空间数据。例如,我们可以先在 QGIS 中处理 Shapefile 等文件格式的数据,然后将其导入 PostgreSQL 数据库中的 PostGIS 表,以便集中管理、备份以及供多人或应用程序共享使用。

本篇博客将以一个名为 “场所.shp” 的 Shapefile 为例,演示如何使用 QGIS 将该 Shapefile 导入 PostgreSQL 数据库(已启用 PostGIS 扩展)中。过程中我们会涉及 坐标系转换(将数据转换为常用的 WGS84 地理坐标系 EPSG:4326),以及 常见问题 和解决技巧的分享,帮助初学者顺利完成从 Shapefile 到 PostGIS 的入库操作。

二、在 QGIS 中加载 Shapefile 文件

首先,需要在 QGIS 中打开我们要导入的 Shapefile 文件。本例中我们使用 场所.shp 文件。确保您已经安装并启动了 QGIS(本文以 QGIS 3.x 版本为例)。

加载 Shapefile 有多种方法,这里介绍两种简单方式:

  1. 通过数据源管理器加载:在 QGIS 主界面,点击菜单栏的“图层” -> “添加图层” -> “添加矢量图层”。在弹出的对话框中,点击“浏览”选择本地的 Shapefile 文件(.shp格式)。找到场所.shp并选中,随后点击“添加”将其加载到地图。
  2. 拖拽加载:直接将文件资源管理器中的 场所.shp 拖拽到 QGIS 窗口的图形画布或图层面板中,QGIS 也会自动加载该图层。

 

 无论采用哪种方式,成功加载后,您应该可以在 QGIS 的图层面板中看到一个名为“场所”的图层,并在地图画布上看到相应的地理要素。如果 Shapefile 包含属性数据,可以打开属性表查看,每条记录都代表一个“场所”的属性信息。

小提示:Shapefile 通常由多个文件组成(如.shp.shx.dbf, 以及描述坐标系的.prj文件等)。确保这些文件放在同一文件夹下且名称一致,这样 QGIS 才能正确读取空间几何和属性及坐标系信息。如果在加载时 QGIS 提示未找到坐标参考或出现乱码等问题,可能是缺少 .prj 文件(坐标系定义)或编码设置不正确,我们将在后面步骤解决这些问题。

三、查看并转换 Shapefile 的坐标系(CRS)

在将数据导入数据库之前,了解并统一坐标参考系(CRS)是非常重要的一步。坐标系不一致可能导致数据在不同平台上显示位置偏移,或者导入后与其他图层无法叠加。本例中,我们希望将数据使用常见的地理坐标系 WGS 84(EPSG:4326) ,这是一种全球通用的经纬度坐标系。

1. 查看当前坐标系:在 QGIS 中右键点击图层“场所”,选择“属性”(或者直接双击图层名称)。在图层属性窗口中,找到“源”或“信息”选项卡,可以查看该 Shapefile 图层的坐标参考系。如果 Shapefile 带有 .prj 文件,这里会显示坐标系的名称和 EPSG 代码。例如,可能显示为 CGCS2000 / Beijing_54 或 WGS 84 等。如果坐标系显示为“未知坐标系”或与预期不符,需要手动指定。您可以根据数据来源信息确定正确的坐标系,并在 QGIS 中右键图层选择“设置图层 CRS”来赋予正确的 CRS。

2. 转换坐标系到 WGS84 (EPSG:4326) :如果原始坐标系不是 WGS84,我们可以通过 QGIS 将其转换并保存为新的图层。最简单的方法是使用 QGIS 的导出功能:

  • 右键点击“场所”图层,选择“导出” -> “保存要素为... ”。将在弹出“另存为”对话框中对图层进行导出设置。
  • 在格式下拉菜单中选择 ESRI Shapefile(保持 Shapefile 格式)。在文件名处指定一个新文件名,例如 场所_WGS84.shp,以区别于原始文件。
  • **坐标参考系统(CRS)**一栏,点击选择目标坐标系。在弹出的坐标系选择窗口中,可以通过过滤搜索“WGS 84”或者直接输入 EPSG 编号“4326”。选中 EPSG:4326 – WGS 84 作为导出数据的目标坐标系。
  • 其他选项可保持默认,然后点击 “确定” 执行导出。

完成后,新导出的 场所_WGS84.shp 将会自动加载到 QGIS 中作为一个新图层。此时,我们就得到了一个使用 WGS84 坐标系的 Shapefile 图层。您可以再次查看其属性确认坐标系已经变为 EPSG:4326。接下来,我们会将这个转换好坐标系的图层导入到 PostGIS 数据库中。

说明:如果原始 Shapefile 已经是 WGS84 坐标系(EPSG:4326),则无需执行上述转换步骤,可直接使用原始图层进行后续导入。但了解如何检查 CRS 仍然非常重要。如果跳过转换,后续在导入时也可直接指定源和目标SRID一致为原始值。

四、配置 QGIS 与 PostgreSQL/PostGIS 数据库连接

在将 Shapefile 数据导入数据库之前,需要让 QGIS 连接上我们的 PostgreSQL 数据库,并确保该数据库中已经启用了 PostGIS 插件(扩展)。

1. 确认数据库启用 PostGIS:首先,在 PostgreSQL 数据库中安装并启用 PostGIS。通常您需要在目标数据库中执行 CREATE EXTENSION postgis; 来安装 PostGIS 扩展(若您的数据库服务尚未安装 PostGIS,可以通过包管理器或二进制安装,具体步骤本文不展开)。确保使用 QGIS 连接的目标数据库已经具备 PostGIS 功能,否则后续无法创建几何字段。

2. 新建 PostGIS 数据库连接:在 QGIS 主界面,点击菜单栏的“数据库” -> “DB管理器” 打开数据库管理器窗口。也可以在左侧“Browser(浏览)”面板中找到 PostGIS,右键选择“新建连接”。将会弹出“新建 PostGIS连接”对话框,需要填写数据库连接的相关参数:

  • 名称:为这次连接取一个名称(任意,便于识别,如“本地PostGIS”)。
  • 主机:数据库服务器地址,如果是本机安装的 PostgreSQL,可填 localhost 或 127.0.0.1
  • 端口:PostgreSQL 默认端口是 5432,如果您改动过请填写相应端口。
  • 数据库:填写要连接的数据库名称。
  • 用户名密码:填入连接数据库所需的账号凭证。确保该用户有在目标数据库中创建表的权限。

填好后可以点击“测试连接”按钮,若参数正确会提示连接成功。然后点击“确定”保存连接。:QGIS 新建PostGIS数据库连接界面

3. 检查连接:在 QGIS 的 DB管理器或浏览面板中,应该已经能看到刚刚保存的数据库连接名称。展开该连接,会列出其中的模式(Schema)和已有的表。如果没有看到内容,尝试双击连接名称以打开。如果仍有问题,请检查前述参数或数据库服务状态。

注意:确保连接的数据库已经启用 PostGIS 扩展(可在模式列表中看到 public.geometry_columns 等 PostGIS 系统表,或者通过SQL查询 SELECT postgis_full_version(); 测试)。如果未启用,需使用具有超级用户权限的账号登录数据库执行 CREATE EXTENSION postgis; 然后重新连接。

五、将 Shapefile 图层导出到 PostgreSQL/PostGIS 表

连接成功后,我们就可以通过 QGIS 将矢量图层导入数据库,创建一个 PostGIS 表来存储这些空间数据。接下来以我们之前加载的 场所_WGS84 图层为例,演示导入步骤。在 QGIS 中有多种入库方法,这里使用 DB管理器 提供的导入功能,界面友好且可配置选项较多:

  1. 打开 DB管理器 窗口(如果之前未打开的话,可通过“数据库”->“DB管理器”打开)。在左侧列表中找到我们刚建立的数据库连接,展开相应模式(schema),选中准备导入的目标模式名称(如public)。然后点击界面上的“导入图层或文件”按钮(有时显示为“Import Layer”)。这将弹出“导入矢量图层”对话框。

 2. 在导入对话框中,按照提示填写各项参数:

 

- **文件或图层**:选择要导入的数据源。如果先前已经将 Shapefile 加载到 QGIS,点击下拉框会看到当前项目中的图层列表,直接选择“场所_WGS84”图层即可;或者点击“...”(浏览)按钮,从文件系统选择未加载的 Shapefile 文件路径。 - **目标表**:指定导入后在数据库中的表位置和名称。包括 **目标模式**(如选择`public`)和 **表名称**。您可以沿用 Shapefile 的名字,例如输入表名为“**场所**”。如果使用中文表名,数据库将以带引号的标识符创建该表;或者您也可以改用拼音/英文名(如`places`)以避免后续SQL引用麻烦。**注意**表名不能与已存在的表重复,除非选中了替换选项。 - 其他选项(根据需要进行设置): - **主键**:选择一个字段作为新表的主键。如果 Shapefile 中有唯一标识字段,可在此下拉选择它;否则也可留空,让数据库自动生成一个默认的连续 id(QGIS 在不指定时通常会创建一个名为 `gid` 的自增主键列)。 - **几何字段名称**:默认是`geom`,表示空间几何列的名称。一般保持默认即可。 - **源 SRID 和目标 SRID**:这里显示源数据的坐标系 EPSG 编码,以及目标表希望使用的 SRID。对于我们转换后的 `场所_WGS84` 图层,源 SRID 应该是 4326;目标 SRID 也选择 4326(表示导入后在数据库中按 WGS84 存储)。如果您的源数据不是 4326,这里可以指定正确的源 SRID,并将目标 SRID设置为期望的值,QGIS 将在导入过程中帮你转换坐标。务必确保源SRID填写正确,否则可能出现位置偏差。 - **编码**:属性数据的文本编码,默认是 UTF-8。若 Shapefile 属性包含中文且在之前加载时出现乱码,可尝试在此选择相应编码(例如老旧 Shapefile 可能使用 GBK/GB2312 编码)。 - **如果表已存在,是否替换**:如目标表重名可选择覆盖它。谨慎使用,以免误删数据。 - **用单部件要素代替多部件**:若勾选,导入时会将 MultiPolygon/MultiLine 等多部件几何拆分为多个单独记录。一般保持不勾选,除非有特殊需要将多部件拆开。 - **字段名称转为小写**:勾选后,将自动把属性字段的名称转换为小写形式。这是推荐选项,因为 PostgreSQL 对大小写敏感,小写字段名使用和查询更方便(避免产生带引号的字段名)。 - **创建空间索引**:建议勾选。导入后将在几何列上创建空间索引,有利于提升后续空间查询的性能。

  1. 确认各项设置无误后,点击 OK(确定) 开始导入。QGIS 将执行将数据写入数据库的过程。根据数据量大小,耗时从几秒到几分钟不等。导入完成后若没有报错信息,表示操作成功。此时在 DB管理器的左侧数据库树中,可以看到新创建的表名称出现在目标模式下。

技巧:除了使用 DB管理器,“右键图层导出”也是一种快捷方法。在图层面板中右键 Shapefile 图层,选择“导出”->“保存为…”,在格式中选“PostGIS”,然后选择目标数据库连接和填表名也可完成导入。这种方式背后也是调用相同机制,但缺少部分高级选项配置。如果您需要精细控制导入细节,DB管理器的导入界面更直观。

六、验证导入成功(查看 PostGIS 表数据)

将 Shapefile 导入 PostGIS 数据库后,我们需要验证数据是否正确写入。可以通过 QGIS 自身的功能或数据库查询来进行验证:

  • 在 QGIS 中验证:如果刚才通过 DB管理器导入,导入完成后新表通常不会自动加载到地图上。我们可以手动将其加载进行查看。展开 QGIS 浏览面板中该数据库连接下的模式,找到刚刚导入的表(例如“场所”),右键选择“添加到画布”。这样 QGIS 会将数据库中的该表作为图层加载,您可以在地图上看到与原 Shapefile 相同的要素点/线/面。同时,可以打开其属性表,检查记录数是否与原 Shapefile 一致,属性内容是否完整无误。如果全部正常,说明导入成功。
  • 通过数据库管理器或 SQL 查询验证:在 QGIS 的 DB管理器中,您也可以直接执行 SQL 来检查数据。例如,点击上方的SQL图标打开 SQL窗口,运行类似 SELECT COUNT(*) FROM public."场所"; 的语句(如果表名有大写或中文请加引号),看返回的数量是否符合预期。此外,可以查询几何字段的空间参考 SELECT ST_SRID(geom) FROM public."场所" LIMIT 1; 来确认 SRID 是否正确为 4326,或查询几何类型 SELECT ST_GeometryType(geom) FROM public."场所" LIMIT 1; 验证几何类型(应匹配原始数据类型,如 POINT、LINESTRING、POLYGON 等)。这些查询也可在独立的数据库客户端如 PgAdmin 中执行。通过这些检查,可以进一步确保数据内容和空间信息完整无误。

 如果以上查看都正常,那么恭喜您,已经成功地将 Shapefile 数据发布到了 PostgreSQL/PostGIS 数据库中!现在这些数据就可以被其他 GIS 应用或后端服务使用,并享受到数据库集中管理和安全备份的好处。

七、经验分享:常见坑及解决方案

在实际操作过程中,可能会遇到一些常见的问题或“小坑”。下面总结几个初学者经常碰到的问题及相应的解决办法:

  • 坐标系不匹配:如果导入后发现数据在地图上位置不对(偏移错位)或者无法与其他图层叠加,通常是坐标系出了问题。例如,原始 Shapefile 的投影坐标未转换却当作地理坐标导入,导致坐标数值被误当作经纬度。解决方案:务必在导入前确认 Shapefile 的原始坐标系,并在 QGIS 中正确设置源 SRID 和目标 SRID。如果不确定坐标系,需向数据提供方咨询或通过已知控制点校对。必要时使用 QGIS 先行转换坐标系到统一的 CRS(如 WGS84),再进行导入。导入时源/目标 SRID 要对应正确,避免张冠李戴。如果已经导入错误,可删除表后重新按照正确SRID导入。
  • 数据库权限不足:在点击导入后弹出错误,提示无权创建表或写入数据。这通常是所使用的数据库用户权限不够。解决方案:确保使用拥有目标模式下 CREATE 权限 的用户连接数据库。默认情况下,PostgreSQL 的 public 模式对所有用户开放创建表权限,但如果 DBA 修改过权限或者要导入到自定义模式,需要赋予相应权限。可以让数据库管理员 grant 权限,或者临时使用超级用户导入。导入完成后也可再调整表的所有者。此外,若数据库设置禁止远程连接或密码错误,也会造成连接问题,需要检查 PG_HBA 配置和账户密码是否正确。
  • PostGIS 扩展未安装:如果数据库尚未启用 PostGIS 扩展,那么在创建几何字段时会报错(因为数据库不识别 geometry 类型)。解决方案:使用具有超级权限的账户登录数据库,执行 CREATE EXTENSION postgis; 来安装 PostGIS(只需执行一次即可)。确认扩展启用后重新进行导入。
  • 字段名称或类型不兼容:Shapefile 的属性字段有时会在导入时遇到小问题。例如,Shapefile 字段名可能含有大写字母、空格或中文,这些在 PostgreSQL 中作为列名需要用引号引用,使用不便;或者字段名长度超过数据库限制(PostgreSQL 列名最长63字符,老式 Shapefile 名称不超过10字符一般不超限,但新格式可能较长)。解决方案:在导入选项中勾选“字段名称转为小写”,这样能统一字段名为小写字母,避免大小写敏感问题。如果字段名含空格或特殊字符,QGIS 通常会自动替换为下划线或移除不支持字符,但保险起见,您可在导入前于 QGIS 中重命名字段为规范名称。对于中文字段名,导入后在数据库中会以中文列名存在,查询时需用双引号括起字段名或者改用别名,建议在可能情况下改为英文字段名以提高兼容性。至于字段类型,QGIS 会自动将 Shapefile 的类型映射为 PostgreSQL 合适的类型(例如文本->varchar,数字->numeric或integer),一般不会有大问题。如果遇到某字段导入失败,检查是否有数据库不支持的特殊类型数据,可尝试先在 QGIS 中删除或修改该字段类型再导入。
  • 中文字符编码问题:如果 Shapefile 属性包含中文,导入后可能出现乱码。这通常是由于 Shapefile 的 .dbf 文件使用了不同的编码而 QGIS 导入时用了错误的解码方式。解决方案:在导入对话框中选择正确的 编码。例如,如果原始数据使用 GBK/GB2312 编码(常见于国内数据),将编码从默认 UTF-8 改为 GBK 再导入。或者在加载 Shapefile 到 QGIS 时就指定相应编码(QGIS 添加矢量层时有编码选项)。导入数据库后也可通过更新字段内容来纠正,但那较繁琐,所以尽量在导入时处理好编码。导入完成后,用客户端查看数据库中的中文是否正常显示,确保编码正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值