要約:一昨日(プロジェクトファイルを事前に準備)より便利な方法の基本形が、昨年末のメーリングリストHow load Postgis layer from command line?に出てました。それに複数レイヤ対応を加え、起動用バッチファイルの中に組み込んでみました。↓
qgis_load_postgis.batSelectRawtextBitbucket
@echo off

:: setttings for PostGIS Layer and a temporary file
set con=PG:host=localhost dbname=udig user=postgres password=****

set lab_1=pubs
set sql_1=SELECT * FROM "201506".bc_pubs
set srs_1=3005

set lab_2=border
set sql_2=SELECT * FROM "201506".bc_border
set srs_2=4326

set lab_3=voting_areas
set sql_3=SELECT * FROM "201506".bc_voting_areas
set srs_3=3005

set len=3
set vrt=%~dp0tmp.vrt

:: loop in pseudo array
setlocal enableDelayedExpansion
echo ^<OGRVRTDataSource^> > %vrt%
for /L %%i in (1, 1, %len%) do (
    echo ^<OGRVRTLayer name="!lab_%%i!"^> >> %vrt%
    echo ^<SrcDataSource^>%con%^</SrcDataSource^> >> %vrt%
    echo ^<SrcSQL^>!sql_%%i!^</SrcSQL^> >> %vrt%
    echo ^<LayerSRS^>epsg:!srs_%%i!^</LayerSRS^> >> %vrt%
    echo ^</OGRVRTLayer^> >> %vrt%
)
echo ^</OGRVRTDataSource^> >> %vrt%

:: start QGIS
D:
cd \AppsPortable\QGIS-Portable-CH\bin
call o4w_env.bat
path %OSGEO4W_ROOT%\apps\qgis\bin
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis
set conf=--configpath %OSGEO4W_ROOT%\.qgis2
start "" /B %OSGEO4W_ROOT%\bin\qgis-bin.exe %conf% %vrt%


短い説明
探せば見つかるものです。OGR Virtual Formatというのがあるらしく、その形式でPostGISへの接続文字列とクエリなどを書いてvrtファイルに保存し、QGIS起動時にロードするだけ。プロジェクトファイル不要で、PostGISデータが自動的に表示されます。さらに上のバッチではvrtファイルの動的生成を組み込みました。

以下Windows 7 32bit + Portable QGIS Swiss Edition (2.8.2)でのテスト例。バッチファイル中にQGISの絶対パスを入れたので、どこに置いても単独で使えます。↓



↓ バッチ起動でvrtファイルが読み込まれ、レイヤ選択ダイアログが出ます。地物数とジオメトリタイプが表示されていれば、この時点で適切にPostGISデータにアクセスできている証拠。Ctrl+A、続いてリターンで全レイヤを読み込みます。このダイアログもスキップできれば、もっといいのですが。



↓ テスト結果の例。色とかは未設定なのでQGISが適当に決め、起動するたびに少しずつ違いました。デフォルトを固定するオプションがどこかにあるかも。バッチファイルと同じ場所にvrtファイルができます(二つ目の画像)。



テストに使ったデータ
昨日紹介したuDigのサンプルDBを、ローカルのデータベースにコピーしたもの。下の5つのテーブルのうち、今回のバッチファイルでは3つ読み込みました。バッチに記述したレイヤ(PostGISへのクエリ)の順序が、そのままQGISレイヤの上からの位置になって便利。


そのほか
バッチファイル中では、PostGISレイヤの複数記述をなるべく簡単にするため配列もどきを使用(普通の配列は使えない)。またvrtファイルはXML形式なので<>があり、バッチファイル中では^でエスケープ。とまぁWindowsコマンドプロンプト特有の手間がありましたが、一度バッチを作ってしまえば後々楽です。

vrtファイルはSrcSQL要素にクエリを書くので、行や列を限定したり、演算や他のテーブルと結合する等のクエリも書けるかも。そうなると更に実用的なので、いずれ試します。