Función para añadir nombre de tablas, columna de geometría y SRID de bases de datos PostGIS en un plugin de QGIS

Si se desea tener combinada la funcionalidad de pgadmin3, la consola de psql y la utilidad de QGIS para cargar base de datos con componente espacial en QGIS, habría que crear un plugin que reuna todas esas características. Esto permitiría realizar todo el trabajo de administración y consulta desde un mismo lugar.

Comenzando con esta labor, he utilizado el módulo psycopg2, en ambiente de PyQGIS, para listar las tablas de una base de datos con componente espacial (PostGIS) acompañadas de su correspondiente columna de geometría y SRID (Spatial Reference System Identifier). Esto permite una primera visión de lo que contiene la base de datos para programar futuras consultas sin tener que cargar abolutamente nada a la Map View de QGIS.

Actualmente, el plugin luce como en la imagen siguiente:

postgis1

En la parte superior izquierda está la utilidad que permite cargar shapefiles a la base de datos mediante el comando ogr2ogr. Por defecto, este comando asume el nombre de wkb_geometry para la columna de geometría por lo que en el plugin se ha sustituido por el default geom; aunque puede ser colocado cualquier otro nombre (como el anterior the_geom). Otro default de ogr2ogr es tomar como nombre de tabla el del propio shapefile; algo que también se puede modificar.

El código que añade el nombre de las tablas, su columna de geometría y el SRID asociado en una base de datos con componente espacial se encuentra a continuación. Se programó como el botón ‘Tables’ (metodo __init__) y su slot asociado tiene el mismo nombre.

.
.
.
    def __init__(self, iface):
.
.
.
        #Tables Button
        tBtn = self.dlg.tablesButton
        tBtn.connect(tBtn, SIGNAL("clicked()"), self.tables)

.
.
.
    def tables(self):
        
        conn = self.connect()
        
        cur = conn.cursor()

        cur.execute("SELECT tablename \
                     FROM pg_tables   \
                     WHERE schemaname = 'public'")
            
        tables = cur.fetchall()
        
        tables = [ row[0] for row in tables if row[0] != "spatial_ref_sys" ]
        
        n = len(tables)
        
        geom = []
        
        for i in range(n):
            cur.execute("SELECT f_geometry_column  FROM geometry_columns  WHERE f_table_name = '" + tables[i] + "'")
            cols = cur.fetchall()

            geom.append(cols)
        
        srid = [ "SELECT ST_SRID(" + geom[i][j][0] + ") FROM " + tables[i] + " LIMIT 1"
                  for i in range(len(geom)) for j in range(len(geom[i]))]
        
        proj = []
        
        for item in srid:
            cur.execute(item)
            r = cur.fetchall()
            proj.append(r[0][0])

        message = "Show me the tables in the database:\n\n"
        
        k = 0
        
        for i,item in enumerate(geom):
            
            l = len(item)
            
            for j in range(l):
                message += tables[i] + " " + item[j][0] + " " + str(proj[k]) + "\n"
                k += 1

        self.dlg.textBrowser.setText(message)
.
.
.

Para probar el código se añadieron a la base de datos varios shapefiles con diferente SRID y columna de geometría. Uno de ellos, polygon8, tiene incluso 2 columnas de geometría con proyecciones diferentes en cada columna.

Después de ejecutado el código se obtiene en la QTextBrowser los valores esperados; tal como se observa, a la izquierda, en la imagen siguiente:

postgis2

La columna de geometría de roadtrl020 se había nombrado como geom_4269 (SRID 4269) y una de las de polygon8 tenía efectivamente el nombre the_geom con el SRID correspondiente a 4326.

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

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