Importación en PostGIS de capas vectoriales mediante psycopg2 en ambiente de PyQGIS

En un post pasado se consideró la importación en PostGIS de shapefiles mediante ogr2ogr en un script de Python. Sin embargo, este comando ampliamente usado puede ser prescindido empleando exclusivamente el módulo psycopg2 de Python.

Un enfoque en este sentido se observa en esta respuesta en gis.stackexchange.com donde se emplea el módulo shapely para generar una geometría que va a ser introducida en una tabla arbitraria de una base de datos. A pesar de que shapely es también ampliamente usada y no niego sus bondades, especialmente para los que tenemos Linux, es especialmente engorrosa su instalación en Windows y por eso trato, en lo posible, de no emplearla en mis scripts.

Si analizan el código producido por shapely se darán cuenta que el formato de la geometría que se le pasa a la base de datos es el mismo que se produciría a través de la clase QgsGeometry de PyQGIS, empleando un encoding hexadecimal del resultado generado por su método ‘asWkb’, cuando se hace un recuento de features en cualquier vector layer. Por esta razón, en PyQGIS, se podría prescindir totalmente de shapely y el script a continuación lo ejemplifica.

import psycopg2

try:

    conn = psycopg2.connect(dbname='utah', 
                            host='localhost',
                            port=5432, 
                            user='curso_pyqgis',
                            password='pyqgis')

except:
    print "I am unable to connect to the database"

cur = conn.cursor()

layer = iface.activeLayer()
feats = [feat for feat in layer.getFeatures()]
ls = feats[0].geometry().asWkb().encode('hex')

# Send it to PostGIS
cur.execute('CREATE TABLE my_lines(geom geometry, name text)')
cur.execute(
    'INSERT INTO my_lines(geom, name)'
    'VALUES (ST_SetSRID(%(geom)s::geometry, %(srid)s), %(name)s)',
    {'geom': ls, 'srid': 32612, 'name': 'First Line'})

conn.commit()  # save data

El script se emplea para introducir está geometría:

postgis1

en la tabla ‘my_lines’ y cuyos rasgos, en ambiente de PyQGIS, han sido tomados de un archivo vectorial también en formato PostGIS.

La ejecución del script, en la Python Console de QGIS, produce los resultados esperados; tal como se evidencia en la consulta siguiente a través de la consola de postgresql:

SELECT name, ST_AsText(geom) FROM my_lines;
    name    |                        st_astext                         
------------+----------------------------------------------------------
 First Line | LINESTRING(369916 4426383,407110 4440958,462960 4419621)
(1 row)
Esta entrada fue publicada en Postgres+postgis, PyQGIS, 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