Conexión a una base de datos PostgreSQL, con extensión PostGis, mediante PyQGIS

En el post pasado se consideró la conexión a una base de datos PostgreSQL, con extensión PostGis, mediante script en la Python Console de QGIS y usando el módulo psycopg2. En este post se tratará la conexión desde la óptica de PyQGIS (basada en la sugerencia del comentario de Luigi Pirelli).

Para ello se utilizarán los objetos de la clase QgsDataSourceURI y las recomendaciones de la documentación testing de QGIS. Como vamos a aprovechar para probar varios métodos colocaremos la salida del plugin ‘Get Pattern’ para dicha clase; que apenas tiene 65 elementos.

datasource1

Un script funcional, basado en la documentación y equivalente al del post pasado, es el siguiente:

uri = QgsDataSourceURI()

# set host name, port, database name, username and password
uri.setConnection("localhost", 
                  "5432", 
                  "utah", 
                  "curso_pyqgis", 
                  "pyqgis")

## set database schema, table name, geometry column
uri.setDataSource("public", "polygon8", "geom")

vlayer = QgsVectorLayer(uri.uri(), "polygon8", "postgres")

QgsMapLayerRegistry.instance().addMapLayer(vlayer)

Ejecutado en la Python Console de QGIS produce el resultado de la imagen a continuación:

datasource2

La información del provider (Layer Properties) señala lo siguiente:

PostgreSQL/PostGIS provider
PostgreSQL 9.4.5 on i686-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 32-bit
PostGIS 2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1

Por otra parte, con base en los métodos arrojados por el plugin ‘Get Pattern’, se hizo una selección significativa de métodos y sus resultados se imprimieron a través de la Python Console; tal como se señala a continuación:

>>>uri.connectionInfo()
u"dbname='utah' host=localhost port=5432 user='curso_pyqgis' password='pyqgis'"
>>>uri.database()
u'utah'
>>>uri.encodedUri()
PyQt4.QtCore.QByteArray()
>>>uri.geometryColumn()
u'geom'
>>>uri.host()
u'localhost'
>>>uri.password()
u'pyqgis'
>>>uri.port()
u'5432'
>>>uri.quotedTablename()
u'"public"."polygon8"'
>>>uri.schema()
u'public'
>>>uri.table()
u'polygon8'
>>>uri.uri()
u'dbname=\'utah\' host=localhost port=5432 user=\'curso_pyqgis\' password=\'pyqgis\' table="public"."polygon8" (geom) sql='
>>>uri.useEstimatedMetadata()
False
>>>uri.username()
u'curso_pyqgis'
>>>uri.wkbType()
0

Esta selección permite intuir los métodos para automatizar procesos y hacer consultas y selección de features basadas en ellas; tema de posts futuros.

Esta entrada fue publicada en Postgres+postgis, PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

3 respuestas a Conexión a una base de datos PostgreSQL, con extensión PostGis, mediante PyQGIS

  1. Estimado José Guerrero: Soy consciente de que mi consulta está algo lejos del tópico, pero no sé a quien más recurrir. Estoy tratando de utilizar Grass7 con PostGIS topology, todo en Windows, la BD no es localhost, y tengo serios problemas tratando de hacer que funcione.

    db.connect -p
    driver: pg
    database: host=172.26.67.64,dbname=test
    schema: beta2
    group: sig

    db.login driver=pg database=host=172.26.67.64,dbname=test

    db.test test=test1 #corre el test OK
    db.droptable -f table=beta2.grass_test1 # borrar la tabla que generó el test1

    v.external.out -p
    conninfo: 172.26.67.64,dbname=test
    format: PostgreSQL
    dsn: PG:172.26.67.64,dbname=test

    Cuando, usando el módulo del digitalizador, quiero generar una capa de punto con un atributo
    genera el punto en la BD, pero nunca me pide definir el attributo ni cargar el valor del attributo

    Alguna sugerencia, consejo??
    si pudiera pasarme algún string de conexión que tenga funcionando, puedo seguir probando a partir de allí, Realmente agradecería cualquier cosa con la que pueda ayudarme.

    Desde ya, muchas gracias
    Cordiales saludos
    JC

    • Te refieres al módulo del digitalizador de GRASS?

      • Exacto, concretamente al comando v.external.out del Grass7.
        Entiendo que me permite ‘cargar’ lo que digitalizo directo a la Base de Datos…
        Cuando ‘abro’ un nuevo layer desde el módulo de digitalización, da un mensaje de error
        “no puede listar tablas de la BD”, lo que no entiendo, ya que el layer que estoy queriendo hacer va a ser una nueva tabla, cierto? como pretende listarla, si todavía no la hice ???

        hay algo que se me está escapando, pero no lo veo

        Podrás ayudarme?, gracias
        JC

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s