QGIS:地物からリンク先ファイルを相対パスで開く
QGISにて、pdfやExcelデータなどにも地図上からリンクさせたいと探していたところ、アクションを利用することでリンク先のファイルを開くことができると知りました。しかし、残念なことに相対パスには対応していないようです。
QGISのデータ一式を他の人に渡して使ってもらうとき、絶対パスでは個々のPC環境に追従できないので都合が悪いです。
そこで、ネットを探し回ったところstackovernetというFAQサイトで分かりやすい方法を見つけました。「QGISのアクションで相対パスで外部ファイルにリンクするにはどうすればよいですか?」
QGIS3に流用するにあたっての注意点としては、Qt4をQt5に変更することぐらいかと思います。インポート行のPyQt4をPyQt5に書き換えるだけです。私はこれで動きました。
また、相対パスの基準パスはQGISのプロジェクトファイルがあるフォルダでした。レイヤデータのあるフォルダでは無いことに注意。
以下、簡単に手順を示します。
1.まずベクタレイヤを作る際に、パス名を記入するためのテキストフィールドを用意します。これは最初にやるべきことです。詳しい人は別途作ったリストからインポートなどしてもOKです。
2.上記で用意したテキストレイヤのプロパティからアクションを登録する準備をします。
3.アクションを登録します。この設定により、リンク先のファイルを開くことが出来るようになります。
4.アクションを登録すると、アクションリストに表示されます。
5.当該ベクタレイヤをアクティブにすると、アクションが利用できるようになります。
ソースコードも下記に勝手ながら転載しておきます。私がコードを無くしそうですので。しつこいようですが出典はあくまでもstackovernetです、私ではありません。なおPyQt4はPyQt5に変更済みですので、あとは「<the_name_of_culumn_with_relative_path>」と書かれている部分を、相対パスを記入するフィールド名に書き換えるだけで使えるようになります。
相対パスの登録もアクションから実行させたいところです。コーディングは難しくないと思いますので自分で作りたいですが、これから年度末まで繁忙期に突入しますので少しお預けになりそうです。なので当面は「窓の杜:「Shift+右クリック」でファイルのパスをコピーする方法」に頼ることにします。
そういえばPythonで行末にセミコロンを記入するコードは初めてみました。C言語みたい。
import subprocess, os
import os.path;
import subprocess;
from PyQt5.QtGui import *;
filerelpath = "[% <the_name_of_culumn_with_relative_path> %]";
if (filerelpath is not None and len(filerelpath) > 0):
projectpath = qgis.core.QgsProject.instance().fileName();
path = os.path.dirname(str(projectpath)) ;
file = os.path.abspath(os.path.join(path, filerelpath));
if sys.platform.startswith('darwin'):
subprocess.call(('open', file));
elif os.name == 'nt':
os.startfile(file);
elif os.name == 'posix':
subprocess.call(('xdg-open', file));
else:
msg = QMessageBox()
msg.setText('No attachment');
msg.show();