Menggunakan raster2pgsql di Python console QGIS?

8

Saya harus mengunggah file GeoTiFF ke dalam database PostGIS / PostgreSQL dan saya baru mengenal raster2pgsql.

Bagaimana cara menjalankan perintah raster2pgsql di konsol Python?

masukkan deskripsi gambar di sini

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
sumber
Bisakah Anda menambahkan lebih detail? Bisakah Anda menyebutkan apa yang telah Anda coba, kesalahan yang diterima, apakah Anda benar-benar terikat menggunakan QGIS Python, mengapa menjalankan ini pada baris perintah bukan pilihan, dll?
cm1
Bisakah Anda memberikan lebih banyak informasi tentang apa yang Anda unggah? Apakah semua bagian raster dari dataset yang sama, seperti ubin derajat SRTM 1x1, misalnya? Atau apakah mereka perlu masuk ke tabel terpisah?
nronnei
Saya sudah mengunggah beberapa ratus GeoTIFF di cloud QGIS. Ubin diekspor dari perangkat lunak GIS berpemilik. Mengunggah file .tif (40 MB) menggunakan plugin cloud QGIS sangat lambat.
eclipsed_by_the_moon

Jawaban:

3

+1 untuk jawaban NettaB tetapi hanya ingin menambahkan bahwa jika semua file tiff Anda berada di folder yang sama, Anda harus dapat menyelesaikan ini menggunakan perintah tunggal (baik itu dari baris perintah atau melalui subproses dengan 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

Ini akan membuat tabel baru bernama schema.target_table dan mendorong data ke dalamnya. Jika Anda memerlukan lebih banyak info tentang sakelar untuk digunakan, halaman ini bermanfaat - dan termasuk beberapa contoh.

Dengan implementasi Python Anda tidak perlu menggunakan Psycopg kecuali Anda berencana untuk mengeksekusi query SQL - jika Anda hanya memuat data secara langsung, Anda hanya perlu utilitas raster2pgsql. Jadi kode Anda dapat disesuaikan dengan:

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
sumber
4

Berikut ini adalah skrip yang melakukan iterasi pada semua raster tiff di folder dan membuat tabel dengan ukuran ubin otomatis untuk masing-masing (berdasarkan tautan ini ):

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
sumber
Tidak ada pesan kesalahan yang menjalankan skrip ini, tetapi tidak ada yang terjadi. Saya sudah memeriksa path folder 'bin' dan semua parameter database. Perintah raster2pgsql berfungsi dengan baik terminal. Sudahkah Anda menguji skrip ini?
eclipsed_by_the_moon
Saya sudah mengujinya beberapa kali, apakah ekstensi postgis dipasang di target db Anda? Saya telah menambahkan beberapa perintah cetak, dapatkah Anda memeriksa apakah skrip menemukan tiff di folder Anda?
NettaB