Usando raster2pgsql no console Python do QGIS?

8

Tenho que fazer upload de arquivos GeoTiFF em um banco de dados PostGIS / PostgreSQL e sou novo no raster2pgsql.

Como executo um comando raster2pgsql no console do Python?

insira a descrição da imagem aqui

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()
eclipsed_by_the_moon
fonte
Você pode adicionar mais detalhes? Você pode mencionar o que tentou, erros recebidos, está estritamente vinculado ao uso do QGIS Python, por que executar isso na linha de comando não é uma opção etc.?
Cm1
Você pode fornecer mais informações sobre o que está enviando? Todas as rasters são partes do mesmo conjunto de dados, como blocos SRTM 1x1 graus, por exemplo? Ou eles precisam entrar em tabelas separadas?
nronnei
Eu tenho que carregar algumas centenas de GeoTIFFs na nuvem QGIS. Os blocos são exportados de um software GIS proprietário. O upload dos arquivos .tif (40 MB) usando o plug-in de nuvem QGIS é incrivelmente lento.
eclipsed_by_the_moon

Respostas:

3

+1 para a resposta do NettaB, mas apenas gostaria de acrescentar que, se todos os seus arquivos tiff estiverem na mesma pasta, você poderá fazer isso usando um único comando (seja na linha de comando ou via subprocesso em 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

Isso criará uma nova tabela denominada schema.target_table e enviará os dados para ela. Se você precisar de mais informações sobre os comutadores a usar, esta página é útil - e inclui alguns exemplos.

Com a implementação do Python, você não precisa usar o Psycopg, a menos que planeje executar consultas SQL - se estiver apenas carregando os dados diretamente, precisará do utilitário raster2pgsql. Portanto, seu código pode ser adaptado para:

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)
Todos
fonte
4

Aqui está um script que itera em todos os rasters de tiff em uma pasta e cria uma tabela com tamanho de bloco automático para cada um (com base neste link ):

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
fonte
Não há mensagem de erro executando esse script, mas nada acontece. Eu já verifiquei o caminho da pasta 'bin' e todos os parâmetros do banco de dados. O comando raster2pgsql funciona bem no terminal. Você já testou esse script?
eclipsed_by_the_moon
Eu testei várias vezes, a extensão postgis está instalada no seu banco de dados de destino? Adicionei alguns comandos de impressão. Você pode verificar se o script encontra uma tiff na sua pasta?
NettaB 26/06