10 votos

¿Utilizar raster2pgsql en la consola Python de QGIS?

Tengo que cargar archivos GeoTiFF en una base de datos PostGIS/PostgreSQL y soy nuevo en raster2pgsql.

¿Cómo puedo ejecutar un comando raster2pgsql en la consola de Python?

enter image description here

import psycopg2
import subprocess

db_name = 'enter_qgiscloud_db'
db_host = 'db.qgiscloud.com'
db_user = 'enter_qgiscloud_user'
db_password = 'enter_qgiscloud_pw'

conn = psycopg2.connect( "dbname={0} host={1} user={2} password={3}".format( db_name, db_host, db_user, db_password ) )
cursor = conn.cursor()

cmds = 'raster2pgsql -s 3857 -p -Y -I -C -M C:\qgis_cloud_data\ -F -t auto .tif | psql'
subprocess.call(cmds, shell=True)

cursor.execute(cmds)
conn.commit()

0 votos

¿Puede añadir más detalles? ¿Puedes mencionar lo que has probado, los errores recibidos, si estás estrictamente atado a usar QGIS Python, por qué ejecutar esto en la línea de comandos no es una opción, etc.?

0 votos

¿Puede dar más información sobre lo que está subiendo? ¿Son todos los rásteres parte del mismo conjunto de datos, como mosaicos SRTM de 1x1 grado, por ejemplo? ¿O tienen que ir en tablas separadas?

0 votos

Tengo que subir unos cientos de GeoTIFF en la nube de QGIS. Los mosaicos se exportan desde un software SIG propio. Subir los archivos .tif (40 MB) usando el plugin de la nube de QGIS es increíblemente lento.

6voto

Bui The Hoa Puntos 1168

Aquí hay un script que itera sobre todos los rasters tiff en una carpeta y crea una tabla con el tamaño de mosaico automático para cada uno (basado en esto enlace ):

import psycopg2
import subprocess 
import sys, os

input_path = " C:\\qgis_cloud_data\\"
#Change to the location of pgsql bin folder
os.environ['PATH'] = r';C:\pgsql\9.6\bin'
os.environ['PGHOST'] = 'localhost'
os.environ['PGPORT'] = '9008'
os.environ['PGUSER'] = 'postgres'
os.environ['PGPASSWORD'] = 'dbpass'
os.environ['PGDATABASE'] = 'dbname'

for raster in os.listdir(input_path):
    if raster.endswith(".tif"):
       name = raster.split(".tif")[0]
       # Print the foound tiff name
       print(name)     
       raster = os.path.join(input_path, raster)                    
       # Print the full path of the tiff raster
       print(raster)
       rastername = str(name)
       rasterlayer = rastername.lower()
       conn = psycopg2.connect(database="dbname", user="postgres", host="localhost", password="dbpass", port=9008)
       cursor = conn.cursor()
       cmds = 'raster2pgsql -s 3857 -t auto "' + raster + '" |psql'
       subprocess.call(cmds, shell=True)

0 votos

No hay ningún mensaje de error al ejecutar este script, pero no ocurre nada. Ya he comprobado la ruta de la carpeta 'bin' y todos los parámetros de la base de datos. El comando raster2pgsql funciona bien la terminal. ¿Has probado este script?

0 votos

Lo he probado varias veces, ¿la extensión postgis está instalada en tu db de destino? He añadido un par de comandos de impresión, ¿podría comprobar si el script encuentra tiff en su carpeta?

4voto

Luke Puntos 2163

+1 por la respuesta de NettaB, pero sólo quería añadir que si todos tus archivos tiff están en la misma carpeta deberías ser capaz de lograr esto usando un solo comando (ya sea desde la línea de comandos o a través de un subproceso en Python):

# Set environment variables for database connection
set PGHOST=db.qgiscloud.com
set PGPORT=5432
set PGUSER=enter_qgiscloud_user
set PGPASSWORD=enter_qgiscloud_pw
set PGDATABASE=enter_qgiscloud_db

# Call the raster2pqsql utility
raster2pgsql -s 3857 -C -F -t auto C:/qgis_cloud_data/*.tif schema.target_table | psql

Esto creará una nueva tabla llamada esquema.tabla_destino y empujar los datos en él. Si necesitas más información sobre los interruptores a utilizar, esto página es útil, e incluye algunos ejemplos.

Con la implementación de Python no necesitas usar Psycopg a menos que planees ejecutar consultas SQL - si sólo vas a cargar los datos directamente sólo necesitas la utilidad raster2pgsql. Así que su código puede ser adaptado a:

import os
import subprocess

db_name = 'enter_qgiscloud_db'
db_host = 'db.qgiscloud.com'
db_user = 'enter_qgiscloud_user'
db_password = 'enter_qgiscloud_pw'

# Set pg password environment variable - others can be included in the statement
os.environ['PGPASSWORD'] = db_password 

# Build command string
cmd = 'raster2pgsql -s 3857 -C -F -t auto C:/qgis_cloud_data/*.tif schema.target_table | psql -U {} -d {} -h {} -p 5432'.format(db_user,db_name,db_host)

# Execute
subprocess.call(cmd, shell=True)

0 votos

Gracias por la respuesta. A partir de diciembre de 2021, el enlace de tu respuesta va al 404. ¿Y qué hace el auto en el código? He incluido auto y aparece un error diciendo que no se puede leer el archivo raster: auto.

0voto

user144004 Puntos 6

Para aquellos que tienen el mismo problema en Ubuntu, Aquí está la solución que funcionó para mí, gracias a @NettaB 's solution :

import psycopg2
import subprocess
import os

input_path = "/home/projects/outputs/"
#Change to the location of pgsql bin folder
os.environ['PATH'] = r'/usr/bin'       # path to the raster2pgsql file
os.environ['PGHOST'] = 'localhost'     # localhost server 
os.environ['PGPORT'] = '5432'          # port (default is this)
os.environ['PGUSER'] = 'postgres'      # postgres username
os.environ['PGPASSWORD'] = '1234'      # my password
os.environ['PGDATABASE'] = 'p3'        # my database's name

for raster in os.listdir(input_path):
    print(raster)
    if raster.endswith(".tif"):
       name = raster.split(".tif")[0]
       # Print the found tiff name
       print(name)
       raster = os.path.join(input_path, raster)
       # Print the full path of the tiff raster
       print(raster)
       rastername = str(name)
       rasterlayer = rastername.lower()
       conn = psycopg2.connect(database="p3", user="postgres", host="localhost", password="1234", port=5432)
       cursor = conn.cursor()
       cmds = 'raster2pgsql -s 3857 -t auto "' + raster + '" |psql'
       subprocess.call(cmds, shell=True)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X