暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PyQGIS基础【5、数据库连接(Postgresql)】

3175
 引言 


目标:QGIS 的数据库连接。 
含 Postgresql Geometry 字段添加、手动连接和Python脚本连接两部分教程。

本文使用的QGIS版本为 QGIS 3.16.7

阅读本文前建议先阅读以下文章。
PyQGIS系列笔记:
PyQGIS入门【1、瓦片地图加载】
PyQGIS入门【2、加载csv文件中的经纬度坐标数据】
PyQGIS入门【3、多边形图层制作与实践】
PyQGIS实践【1、渲染5G扇区图层】
PyQGIS基础【4、图层元素样式修改】



01
在 Postgresql 中创建 Geometry 类型列并添加数据


1、Postgresql 创建表,表中含Geometry 类型列

CREATE TABLE public.qgis
(
id integer,
long double precision,
lat double precision,
geom geometry,
CONSTRAINT qgis _pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
CREATE INDEX idx_qgis
ON public.qgis USING gist (geom)
TABLESPACE pg_default;

运行结果:


2、添加数据

INSERT INTO public.qgis(id, long, lat, geom) values
(3,112.452403,23.054209,ST_GeomFromText(
'POLYGON((112.453609 23.056194,
                112.452403 23.054209,
                112.461019 23.047046,
                112.453609 23.056194))', 4326))

运行结果:

注:
Geometry 类型封装:
① 函数:ST_GeomFromText()
② 经度和纬度中间为空格,经纬度组之间用逗号,多边形类型的首尾经纬度应为同一个。
③ 封装效果见运行结果

      

02

QGIS 手动连接 Postgresql



1、添加矢量图层并选择 PostgreSQL
      图层 → 添加图层 → 添加矢量图层
① 点击新建可新建数据库连接
② 点击连接可连接当前数据库
③ 双击数据库中的 Geometry 类型 
④ 点击添加即可添加多边形图层


2、添加数据库连接
① 填写连接信息
② 测试连接
③ 输入用户名、密码
④ 连接成功




3、添加图层效果
      我们可以看到,通过该图层的源为 Postgresql 。




03

通过 Python 进行数据库连接



1、整体流程
① 定义一个 url
uri = QgsDataSourceUri()
② 设置连接属性
uri.setConnection(db_host,db_port,db_name,db_user,db_password)
③ 配置数据库信息
uri.setDataSource(schema, table, geom_column)
其中:schema 为模式,table 为表名,geom_column 为 Geometry 类型的列。
④ 添加图层
vlayer = QgsVectorLayer(uri.uri(), display_name, 'postgres')

2、代码演示

uri = QgsDataSourceUri()
db_host = 'localhost'
db_name = 'mydb'
db_user = 'postgres'
db_password = '25800852'
db_port = '5432'
# 设置host name, port, database name, username and password
uri.setConnection(db_host,db_port,db_name,db_user,db_password)
schema = 'public'
table = 'qgis'
geom_column = 'geom'
#设置schema, table, geom_column
uri.setDataSource(schema, table, geom_column)

display_name = '数据库数据测试图层'
vlayer = QgsVectorLayer(uri.uri(), display_name, 'postgres')
QgsProject.instance().addMapLayer(vlayer)

运行效果:




03

最后


如果你觉得文章还不错,请 点赞、在看、分享、关注 ,下期内容很快更新。

文章转载自辛律的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论