如何加载 Postgres QgsVectorLayer

问题描述

我有一个 QGIS 脚本,我正在尝试加载存储在 Postgres 数据库中的矢量图层。当我打印图层的 isValid() 方法时,我得到了 False。这是我的代码

from qgis.core import *

db_client = 'postgres'
db_host = 'localhost'
db_port = '5432'
db_name = 'database'
db_user = 'user'
db_password = 'pass123'
db_schema = 'public'
tablename = 'Geo_Layer'
geometrycol = 'geom'
tract_number_index = 3

QgsApplication.setPrefixPath('/usr/bin/qgis',True)
qgs = QgsApplication([],False)
qgs.initQgis()

geo_uri = QgsDataSourceUri()
geo_uri.setConnection(db_host,db_port,db_name,db_user,db_password)
geo_uri.setDataSource(db_schema,tablename,geometrycol,'','id')
geo_layer = QgsvectorLayer(geo_uri.uri(False),"Test","postgres")
# Other configurations I have tried
# geo_layer = QgsvectorLayer(geo_uri.uri(),"postgres")
# geo_layer = QgsvectorLayer(geo_uri.uri(),"ogr")
# geo_layer = QgsvectorLayer(geo_uri.uri(False),"ogr")
print(geo_layer.isValid())

qgs.exitQgis()

我提供了我尝试过的其他 QgsvectorLayer 配置。所有打印层无效。

QGIS 版本:3.16.3-汉诺威 Python 版本:3.8.5 Ubuntu 版本:20.04.02 LTS

我已经使用 DBeaver 检查了我的凭据,并且能够连接。

解决方法

当我在 postgis 中的几何列包含多个几何类型时,我曾经遇到过这个问题。在这种情况下,您可以先过滤几何类型的列,然后为每个几何类型构造一个 qgis 层:

for geom in geometry_types:
    uri.setDataSource(schema,table,column,"GeometryType(%s)= '%s'" % (column,geom))
    vlayer = QgsVectorLayer(uri.uri(),layer_name,"postgres")
    print(vlayer.isValid())

您可以使用以下查询检查 postgis 中的几何类型:

SELECT DISTINCT(GeometryType("%s"::geometry)) FROM "%s";""" % (column,table)