¿Usa raster2pgsql en la consola Python de QGIS?

8

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

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

ingrese la descripción de la imagen aquí

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()
eclipsado_por_la_luna
fuente
¿Puedes agregar más detalles? ¿Puede mencionar lo que ha intentado, los errores recibidos, está estrictamente relacionado con el uso de QGIS Python, por qué ejecutar esto en la línea de comandos no es una opción, etc.?
cm1
¿Puede proporcionar más información sobre lo que está cargando? ¿Todas las tramas son parte del mismo conjunto de datos, como los mosaicos SRTM 1x1 grado, por ejemplo? ¿O necesitan ir a tablas separadas?
nronnei
Tengo que subir unos cientos de GeoTIFF en la nube QGIS. Los mosaicos se exportan desde un software GIS patentado. Cargar los archivos .tif (40 MB) con el complemento de nube QGIS es increíblemente lento.
eclipsed_by_the_moon

Respuestas:

3

+1 para la respuesta de NettaB, pero solo quería agregar que si todos sus archivos tiff están en la misma carpeta, debería poder lograr esto usando un solo comando (ya sea desde la línea de comandos o mediante 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 schema.target_table e insertará los datos en ella. Si necesita más información sobre los interruptores para usar, esta página es útil e incluye algunos ejemplos.

Con la implementación de Python, no necesita usar Psycopg a menos que planee ejecutar consultas SQL; si solo carga los datos directamente, solo necesita la utilidad raster2pgsql. Entonces su código se puede adaptar 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)
Ali
fuente
4

Aquí hay una secuencia de comandos que itera en todos los rásteres tiff en una carpeta y crea una tabla con tamaño de mosaico automático para cada uno (basado en este 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)
NettaB
fuente
No hay ningún mensaje de error al ejecutar este script, pero no sucede nada. Ya he verificado la ruta de la carpeta 'bin' y todos los parámetros de la base de datos. El comando raster2pgsql funciona bien en el terminal. ¿Has probado este script?
eclipsed_by_the_moon
Lo he probado varias veces, ¿la extensión postgis está instalada en su base de datos de destino? He agregado un par de comandos de impresión, ¿podría verificar si el script encuentra tiff en su carpeta?
NettaB