前のレッスンでは既定のアクションを見てきました。今度はあなた独自のアクションを定義します。アクションは地物をクリックしたときに起きるものです。それは地図に多くの特別な機能を追加できます。たとえば、オブジェクトに関する追加情報を取得することができます。アクションを割り当てることで地図に全く新しい次元を追加できます!
このレッスンの目標: カスタムアクションを追加する方法を学びます。
以前作成した school_property レイヤを使用します。コース資料にはあなたがデジタイズした3つの地所のそれぞれの写真が含まれます。私たちが次にやろうとしていることはそれぞれの地所とその画像を関連付けることです。それでは、地所をクリックした時にその画像を開くアクションを作成しましょう。
school_property レイヤにはまだ画像と地所を関連付ける方法がありません。まずこの目的のためのフィールドを作成します。
レイヤプロパティ ダイアログを開きます。
フィールド タブをクリックします。
編集モードに切り替えます:
新しい列を追加します:
下記の値を入力します:
フィールドを作成した後、新しいフィールドの横にある 行編集 ボタンをクリックします。
そこで ファイル名 を設定します:
レイヤプロパティ ダイアログの OK をクリックします。
地物情報表示 ツールを使用して school_property レイヤの3つの地物のいずれかをクリックします。
編集モードのままなので、ダイアログがアクティブになり、このようになるはずです:
参照ボタンをクリックします (image フィールドの横の ...)。
画像のパスを選択します。画像は exercise_data/school_property_photos/ にあり、関連付けられるべき地物と同じ名前が付けられています。
OK をクリックします。
この方法ですべての画像と地物を正しく関連付けます。
編集内容を保存し、編集モードを終了します。
school_property レイヤの アクション フォームを開きます。
アクションプロパティ パネルで 名称 フィールドに 画像表示 と入力します:
次に何をすべきかはオペレーティングシステムによって異なりますので、次で適切なコースを選択して下さい:
タイプ ドロップダウンリストをクリックし、 開く を選択します。
Gnome Image Viewer を使用する場合は Action に eog と入力します。 ImageMagick を使用する場合は display と入力します。コマンドの後に空白を1つ入れることを覚えておいて下さい!
タイプ ドロップダウンリストをクリックし、 Mac を選択します。
アクション に open と入力します。コマンドの後に空白を1つ入れることを覚えておいて下さい!
あなたは画像を開きたい。そしてQGISは画像の場所を知っている。あとは アクション に画像がどこにあるかを知らせるだけです。
リストから image を選択します:
フィールドを挿入 ボタンをクリックします。QGISは アクション フィールドに [% "image" %] の句を追加します。
アクションリストへの追加 ボタンをクリックします。
レイヤプロパティ ダイアログの OK をクリックします。
さて新しいアクションをテストしましょう:
私たちは地図を見ていて農場がある地域についてもっと知りたくなったとしましょう。その地域について何も知らず、それについての一般的な情報を見つけたいとします。あなたが今コンピュータを使用しているならば、あなたの最初の衝動はおそらく地域の名前をGoogleで検索することでしょう。では、QGISにそれを自動的にさせてみましょう!
landuse レイヤの属性テーブルを開きます。
name フィールドを使ってそれぞれの土地利用地域をGoogleで検索するようにします。
属性テーブルを閉じます。
レイヤプロパティ の アクション に戻ります。
アクションプロパティ ‣ 名称 フィールドに Google検索 と入力します。
次に何をすべきかはオペレーティングシステムによって異なりますので、次で適切なコースを選択して下さい:
タイプ で 開く を選択します。これはWindowsにInternet Explorer等の既定のブラウザーでインターネットアドレスを開かせます。
アクション に xdg-open と入力します。これはUbuntuにChromeやFirefox等の既定のブラウザーでインターネットアドレスを開かせます。
アクション に open と入力します。これはMacOSにSafari等の既定のブラウザーでインターネットアドレスを開かせます。
上でどのコマンドを使った場合でも次に、開くべきインターネットアドレスを知らせなければいけません。Googleを訪問させて語句を自動的に検索させます。
通常 Googleを使用するときは Googleの検索バーに検索語句を入力します。しかしこの場合はコンピュータにこれをさせます。Googleで何か検索をするには(検索バーを直接使わない場合)、インターネットブラウザにアドレス http://www.google.com/search?q=SEARCH_PHRASE を与えます。ここで SEARCH_PHRASE はあなたが検索したい何かです。私たちはまだ検索する語句を知らないのではじめの部分(検索語句はない)だけ入力します。
アクション フィールドに http://www.google.com/search?q= と入力します。コマンドが入力されている場合はコマンドの後にスペースを追加してください!
QGISでクリックされた地物の name の値をブラウザで Google検索するようにしましょう。
名称 フィールドを選択します。
フィールドを挿入 をクリックします:
これはQGISに次の句を追加させます:
これが意味することはQGISがブラウザを開き、それにアドレス http://www.google.com/search?q=[% "name" %] を送ることです。しかし、 [% "name" %] はQGISに検索語句として name フィールドの内容を使わせます。
たとえば、クリックした土地利用地域の名前が Marloth Nature Reserve である場合、QGISはブラウザに http://www.google.com/search?q=Marloth%20Nature%20Reserve を送ります。すると、ブラウザは Googleを訪問し、”Marloth Nature Reserve”を検索するでしょう。
もしまだ出来ていないなら、上で説明したように設定して下さい。
アクションリストへの追加 ボタンをクリックします。新しいアクションが上のリストに表示されます。
レイヤプロパティ ダイアログの OK をクリックします。
では新しいアクションをためします。
レイヤリスト で landuse レイヤをアクティブにして、 地物アクションの実行 ボタンをクリックします。
地図上の任意の土地利用地域をクリックします。ブラウザーが起動し、自動的に、地域の name の値として記録されている町の Google検索が開始されます。
ノート
アクションがうまく動作しない場合は、すべてが正しく入力されたことをチェックしてください。タイプミスはこの種の作業でよくあることです!
これまで外部のブラウザでWebページを開く方法を見てきました。このアプローチには不可知な依存関係を追加するという点で若干の欠点があります。エンドユーザが自分のシステムでアクションを実行するのに必要なソフトウェアを持っているでしょうか? これまで見てきたように、どのOSを使っているかわからなければ同じようなアクションのための同じような基本コマンドでさえあるとは限りません。OSのバージョンによってはブラウザを開く上記コマンドがまったく動作しないかもしれません。これは克服できない問題である可能性があります。
しかし、QGISは信じられないほど強力で汎用性の高いQt4ライブラリの上にあります。さらにQGISのアクションには任意でトークン化された(すなわち、フィールドの属性の内容にもとづいた変数情報を使用する)Pythonコマンドが使えます!
ではPythonアクションを使用してWebページを表示する方法を説明します。それは外部のブラウザでサイトを開くのと大体同じ考えですが、Qt4のQWebViewクラス(webkitベースのHTMLウィジェット)を使用してポップアップウィンドウにコンテンツを表示するのでユーザのシステムにはブラウザは必要ありません。
今回はGoogleの代わりにWikipediaを使ってみましょう。そうするとリクエストのURLは次のようになります:
http://wikipedia.org/wiki/SEARCH_PHRASE
レイヤアクションを作成するには:
レイヤプロパティ ダイアログを開いて アクション タブへ向かいます。
次のアクションのプロパティを使って新しいアクションを設定します。
Action (all on one line): from PyQt4.QtCore import QUrl; from PyQt4.QtWebKit import QWebView; myWV = QWebView(None); myWV.load(QUrl('http://wikipedia.org/wiki/[% "name" %]')); myWV.show()
ここでは:
すべてのPythonのコードはコマンドがセミコロンで区切られて1行になっています(通常Pythonのコマンドは改行で区切ります)。
[% "name" %] はアクションが呼び出される時に実際の属性値と置き換えられます(これまでのように)。
コードは単に新しい QWebView インスタンスを作成し、そのURLを設定し、ユーザーのデスクトップ上のウィンドウとして表示させる show() を呼び出します。
これはいくぶん不自然な例であることに注意してください。Pythonでは意味的に重要なインデントが使われますので、セミコロンで区切ることは記述の最良の方法ではありません。ですから現実の世界では、Pythonモジュールからロジックをインポートして、引数にフィールド属性をとる関数を呼び出す可能性が高いと思います。
同様にしてユーザのシステムに特定のイメージビューアがあることを要求せずに画像を表示するアプローチを使用できるでしょう。
今しがた作成したWikipediaアクションを使用してWikipediaのページを読み込む上記の方法を試して下さい。
アクションを使えば地図に特別な機能を与えることができます。それはQGISで同じ地図を見るエンドユーザに役立ちます。Pythonだけでなく任意のオペレーティングシステムのシェルコマンドも使用することができます。あなたが具体化できる機能に関して不可能はありません!
あなたはあらゆる種類のベクタデータ作成を行いました。問題を解決するためにこのデータを分析する方法を学びます。それは次のモジュールのトピックです。