Verwenden Sie raster2pgsql in der Python-Konsole von QGIS?


8

Ich muss GeoTiFF-Dateien in eine PostGIS / PostgreSQL-Datenbank hochladen und bin neu in raster2pgsql.

Wie führe ich einen Befehl raster2pgsql in der Python-Konsole aus?

Geben Sie hier die Bildbeschreibung ein

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

Können Sie weitere Details hinzufügen? Können Sie erwähnen, was Sie versucht haben, welche Fehler aufgetreten sind, sind Sie streng an die Verwendung von QGIS Python gebunden, warum dies nicht über die Befehlszeile ausgeführt werden kann usw.?
cm1

Können Sie weitere Informationen zu dem, was Sie hochladen, bereitstellen? Sind alle Rasterteile Teil desselben Datensatzes, z. B. SRTM 1x1-Grad-Kacheln? Oder müssen sie in separate Tabellen gehen?
Nronnei

Ich muss ein paar hundert GeoTIFFs in die QGIS-Cloud hochladen. Die Kacheln werden aus einer proprietären GIS-Software exportiert. Das Hochladen der TIF-Dateien (40 MB) mit dem QGIS-Cloud-Plugin ist unglaublich langsam.
Eclipsed_by_the_moon

Antworten:


3

+1 für die Antwort von NettaB, wollte aber nur hinzufügen, dass Sie, wenn sich alle Ihre TIFF-Dateien im selben Ordner befinden, dies mit einem einzigen Befehl ausführen können sollten (sei es über die Befehlszeile oder über einen Unterprozess in 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

Dadurch wird eine neue Tabelle mit dem Namen schema.target_table erstellt und die Daten werden in diese Tabelle verschoben . Wenn Sie weitere Informationen zu den zu verwendenden Schaltern benötigen, ist diese Seite hilfreich - und enthält einige Beispiele.

Mit der Python-Implementierung müssen Sie Psycopg nur verwenden, wenn Sie SQL-Abfragen ausführen möchten. Wenn Sie nur die Daten direkt in das Programm laden, benötigen Sie nur das Dienstprogramm raster2pgsql. So kann Ihr Code angepasst werden an:

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

Hier ist ein Skript, das alle TIFF-Raster in einem Ordner durchläuft und für jede Tabelle eine Tabelle mit automatischer Kachelgröße erstellt (basierend auf diesem 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)

Es gibt keine Fehlermeldung, die dieses Skript ausführt, aber es passiert nichts. Ich habe bereits den Pfad des Ordners 'bin' und alle Datenbankparameter überprüft. Der Befehl raster2pgsql funktioniert im Terminal einwandfrei. Haben Sie dieses Skript getestet?
Eclipsed_by_the_moon

Ich habe es mehrmals getestet. Ist die Postgis-Erweiterung in Ihrer Zieldatenbank installiert? Ich habe ein paar Druckbefehle hinzugefügt. Können Sie überprüfen, ob das Skript tiff in Ihrem Ordner findet?
NettaB
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.