QGISのPythonコンソールでraster2pgsqlを使用していますか?


8

GeoTiFFファイルをPostGIS / PostgreSQLデータベースにアップロードする必要があり、raster2pgsqlは初めてです。

Pythonコンソールでraster2pgsqlコマンドを実行するにはどうすればよいですか?

ここに画像の説明を入力してください

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

詳細を追加できますか?試行した結果、受け取ったエラー、QGIS Pythonの使用に厳密に関係しているのか、これをコマンドラインで実行するオプションがないのか、などについて教えてください。
cm1

アップロードしているものについて、もう少し情報を提供できますか?たとえば、SRTM 1x1度タイルなど、すべてのラスターパーツは同じデータセットの一部ですか?または、別のテーブルに移動する必要がありますか?
nronnei 2017年

QGISクラウドに数百のGeoTIFFをアップロードする必要があります。タイルは、独自のGISソフトウェアからエクスポートされます。QGISクラウドプラグインを使用した.tifファイル(40 MB)のアップロードは非常に遅いです。
eclipsed_by_the_moon 2017年

回答:


3

NettaBの答えの+1ですが、すべてのtiffファイルが同じフォルダーにある場合は、単一のコマンドを使用してこれを実行できるはずです(コマンドラインから、または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

これにより、schema.target_tableという名前の新しいテーブルが作成され、データがそのテーブルにプッシュされます。使用するスイッチについてさらに情報が必要な場合は、このページが役立ちます-いくつかの例が含まれています。

Python実装では、SQLクエリを実行する予定がない限り、Psycopgを使用する必要はありません。データを直接ロードするだけの場合は、raster2pgsqlユーティリティが必要です。したがって、コードを次のように適合させることができます。

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

これは、フォルダー内のすべてのtiffラスターを反復処理し、それぞれの自動タイルサイズ(このリンクに基づく)でテーブルを作成するスクリプトです。

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)

このスクリプトを実行してもエラーメッセージは表示されませんが、何も起こりません。'bin'フォルダーのパスとすべてのデータベースパラメーターを確認しました。raster2pgsqlコマンドはターミナルで正常に動作します。このスクリプトをテストしましたか?
eclipsed_by_the_moon 2017年

何度かテストしましたが、postgis拡張機能はターゲットdbにインストールされていますか?いくつかの印刷コマンドを追加しました。スクリプトがフォルダーにtiffを見つけたかどうかを確認できますか?
NettaB 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.