Sử dụng raster2pgsql trong bảng điều khiển Python của QGIS?


8

Tôi phải tải các tệp GeoTiFF vào cơ sở dữ liệu PostGIS / PostgreSQL và tôi chưa quen với raster2pgsql.

Làm cách nào để chạy lệnh raster2pgsql trong bảng điều khiển Python?

nhập mô tả hình ảnh ở đây

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

Bạn có thể thêm chi tiết? Bạn có thể đề cập đến những gì bạn đã thử, các lỗi đã nhận, bạn có bị ràng buộc chặt chẽ với việc sử dụng PythonIS không, tại sao việc chạy này trên dòng lệnh không phải là một tùy chọn, v.v.?
cm1

Bạn có thể cung cấp thêm một số thông tin về những gì bạn đang tải lên? Có phải tất cả các phần raster của cùng một tập dữ liệu, chẳng hạn như gạch độ SR1 1x1, chẳng hạn? Hay họ cần phải đi vào các bảng riêng biệt?
nronnei

Tôi đã tải lên vài trăm GeoTIFF trong đám mây QGIS. Các gạch được xuất khẩu từ một phần mềm GIS độc quyền. Tải lên các tệp .tif (40 MB) bằng cách sử dụng plugin đám mây QGIS cực kỳ chậm.
lu

Câu trả lời:


3

+1 cho câu trả lời của NettaB nhưng chỉ muốn thêm rằng nếu tất cả các tệp tiff của bạn nằm trong cùng một thư mục, bạn sẽ có thể thực hiện việc này bằng một lệnh duy nhất (có thể từ dòng lệnh hoặc thông qua quy trình con trong 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

Điều này sẽ tạo một bảng mới có tên là lược.target_table và đẩy dữ liệu vào đó. Nếu bạn cần thêm một số thông tin về các công tắc để sử dụng, trang này rất hữu ích - và bao gồm một số ví dụ.

Với triển khai Python, bạn không cần sử dụng Psycopg trừ khi bạn có kế hoạch thực hiện các truy vấn SQL - nếu bạn chỉ tải dữ liệu ngay trong bạn thì chỉ cần tiện ích raster2pgsql. Vì vậy, mã của bạn có thể được điều chỉnh để:

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

Đây là một tập lệnh lặp lại trên tất cả các trình quét tiff trong một thư mục và tạo một bảng có kích thước ô tự động cho mỗi (dựa trên liên kết này ):

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)

Không có thông báo lỗi chạy tập lệnh này, nhưng không có gì xảy ra. Tôi đã kiểm tra đường dẫn của thư mục 'bin' và tất cả các tham số cơ sở dữ liệu. Lệnh raster2pgsql hoạt động tốt thiết bị đầu cuối. Bạn đã thử kịch bản này chưa?
lu

Tôi đã thử nghiệm nó nhiều lần, tiện ích mở rộng postgis có được cài đặt trong db mục tiêu của bạn không? Tôi đã thêm một vài lệnh in, bạn có thể kiểm tra xem tập lệnh có tìm thấy tiff trong thư mục của bạn không?
NettaB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.