Vous utilisez raster2pgsql dans la console Python de QGIS?


8

Je dois télécharger des fichiers GeoTiFF dans une base de données PostGIS / PostgreSQL et je suis nouveau sur raster2pgsql.

Comment exécuter une commande raster2pgsql dans la console Python?

entrez la description de l'image ici

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()

Pouvez-vous ajouter plus de détails? Pouvez-vous mentionner ce que vous avez essayé, les erreurs reçues, êtes-vous strictement lié à l'utilisation de QGIS Python, pourquoi l'exécuter sur la ligne de commande n'est pas une option, etc.?
cm1

Pouvez-vous fournir plus d'informations sur ce que vous téléchargez? Tous les rasters font-ils partie du même ensemble de données, comme les tuiles SRTM 1x1 degrés, par exemple? Ou doivent-ils entrer dans des tableaux séparés?
nronnei

Je dois télécharger quelques centaines de GeoTIFF dans le cloud QGIS. Les tuiles sont exportées à partir d'un logiciel SIG propriétaire. Le téléchargement des fichiers .tif (40 Mo) à l'aide du plugin cloud QGIS est incroyablement lent.
eclipsed_by_the_moon

Réponses:


3

+1 pour la réponse de NettaB, mais je voulais juste ajouter que si tous vos fichiers tiff sont dans le même dossier, vous devriez pouvoir accomplir cela en utilisant une seule commande (que ce soit à partir de la ligne de commande ou via un sous-processus 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

Cela va créer une nouvelle table nommée schema.target_table et y pousser les données. Si vous avez besoin de plus d'informations sur les commutateurs à utiliser, cette page est utile - et comprend quelques exemples.

Avec l'implémentation Python, vous n'avez pas besoin d'utiliser Psycopg sauf si vous prévoyez d'exécuter des requêtes SQL - si vous chargez simplement les données directement, vous n'avez besoin que de l'utilitaire raster2pgsql. Ainsi, votre code peut être adapté à:

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)

4

Voici un script qui itère sur tous les rasters tiff d'un dossier et crée un tableau avec une taille de tuile automatique pour chacun (basé sur ce lien ):

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)

Il n'y a aucun message d'erreur lors de l'exécution de ce script, mais rien ne se produit. J'ai déjà vérifié le chemin du dossier «bin» et tous les paramètres de la base de données. La commande raster2pgsql fonctionne correctement sur le terminal. Avez-vous testé ce script?
eclipsed_by_the_moon

Je l'ai testé plusieurs fois, l'extension postgis est-elle installée dans votre base de données cible? J'ai ajouté quelques commandes d'impression, pourriez-vous vérifier si le script trouve tiff dans votre dossier?
NettaB
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.