16.2. 属性テーブルの操作
属性テーブルは選択されたレイヤの地物の情報を表示します。各行は(ジオメトリを持つ持たないに関わらず)1つの地物を表し、各列はその地物のある特定の情報を持っています。属性テーブルの地物は検索、選択、移動および編集が可能です。
16.2.1. 序文: 空間情報のあるテーブル、空間情報のないテーブル
QGISでは、空間レイヤと非空間レイヤを読み込むことができます。これには現在、GDALや区切りテキストでサポートされているテーブル、PostgreSQL、MS SQL Server、SpatiaLite、Oracleプロバイダが含まれます。読み込まれたすべてのレイヤは レイヤ パネルに一覧表示されます。レイヤが空間的に有効かどうかによって、マップ上でそのレイヤを操作できるかどうかが決まります。
空間情報を持たないテーブルは、属性テーブルビューを使用して閲覧や編集ができます。さらに、これをフィールドの参照値に使用することも可能です。例えば、空間情報を持たないテーブルの列を使用して、編集モード中の特定のベクタレイヤに追加される属性値や許容される値の範囲を定義することができます。詳しくは、 属性フォームプロパティ セクションの編集ウィジェットを参考にしてください。
16.2.2. 属性テーブルのインタフェースの紹介
ベクタレイヤの属性テーブルを開くには、 レイヤパネル 内でレイヤをクリックしてアクティブにします。次に、メインメニューの メニューから、 を選択します。レイヤを右クリックして、メニューから を選択するか、属性ツールバーの 属性テーブルを開く ボタンをクリックしても開くことができます。ショートカットキーがお好みなら、 F6 を押すと属性テーブルが開きます。 Shift+F6 は、選択した地物でフィルタリングされた属性テーブルを開き、 Ctrl+F6 は表示されている地物のみでフィルタリングされた属性テーブルを開きます。
これにより、レイヤの地物属性を表示するウィンドウが開きます( figure_attributes_table )。 メニューの設定により、属性テーブルはドックウィンドウとして開くか、または通常のウィンドウで開きます。レイヤ内の地物数の合計や、選択中の地物数、フィルタリングされた地物数が属性テーブルのタイトルに表示されます。また、レイヤが空間的に制限されているかどうかも表示します。
属性テーブルウィンドウの上部にあるボタンには以下の機能があります。
アイコン |
ラベル |
目的 |
デフォルトのショートカット |
---|---|---|---|
編集モード切替 |
編集機能を有効にする |
Ctrl+E |
|
マルチエディットモード切替 |
多くの地物の複数のフィールドを更新する |
||
編集内容の保存 |
現在の修正を保存する |
||
テーブルを再読み込み |
|||
地物追加 |
ジオメトリを持っていない地物を新規追加します |
||
選択地物の削除 |
選択された地物をレイヤから削除します |
||
選択行を切り取ってクリップボードへ |
Ctrl+X |
||
選択している行をクリップボードへコピーする |
Ctrl+C |
||
クリップボードから地物を貼り付ける |
コピーされた地物を新規地物として挿入します |
Ctrl+V |
|
式による地物選択 |
|||
すべて選択 |
レイヤ内のすべての地物を選択します |
Ctrl+A |
|
選択部分を反転する |
レイヤ内の現在の選択状態を反転します |
Ctrl+R |
|
レイヤ内の全地物を選択解除 |
現在のレイヤ内のすべての地物の選択を解除します |
Ctrl+Shift+A |
|
フォームによる地物選択/フィルタ |
Ctrl+F |
||
選択を一番上に |
選択した行をテーブルの先頭行に移動します |
||
選択した行の地物にパン |
Ctrl+P |
||
選択した行の地物にズームする |
Ctrl+J |
||
新規フィールド |
データソースに新しいフィールドを追加します |
Ctrl+W |
|
フィールド削除 |
データソースからフィールドを削除します |
||
列の整理 |
属性テーブルにフィールドを表示させたり、隠したりします |
||
フィールド計算機を開く |
多数の地物のフィールドを連続的に更新します |
Ctrl+I |
|
条件付き書式 |
表の書式設定を有効にします |
||
属性テーブルをドッキング |
属性テーブルをウィンドウにドッキング/ドッキング解除します |
||
アクション |
レイヤに関連したアクションをリストします |
注釈
データの形式やお使いのQGISのバージョンでビルドされたGDALライブラリによっては、利用できないツールがあります。
これらのボタンの下には、クイックフィールド計算バー( 編集モード でのみ有効)があり、レイヤ内の地物のすべてまたは一部に計算結果を素早く適用できます。このバーは フィールド計算機 と同様の 式 を使用します( 属性値の編集 参照)。
属性テーブルは、Shift+マウスホイール スクロールに対応しており、縦スクロールから横スクロールに切り替わります。
16.2.2.1. テーブル表示 vs フォーム表示
QGISは属性テーブル内のデータを簡単に操作するための2つの表示モードが用意されています。
テーブル表示 は、複数の地物の値を表形式で表示します。各行は1つの地物を、各列はフィールドを表しています。列のヘッダを右クリックすると テーブルの列表示の設定 ができ、セルを右クリックすると、 地物とのやり取り ができます。
フォーム表示 は、最初のパネルに 地物の表示名 が表示され、クリックした表示名の属性のみを2つ目のパネルに表示します。最初のパネルの上部には、属性( カラムプレビュー )や 式 を使用して「表示名」を指定することができるプルダウンメニューがあります。このプルダウンメニューには、再利用のために最後に使用した10個の式も含まれています。フォーム表示はレイヤのフィールドの設定( 属性フォームプロパティ 参照)を使用します。
最初のパネルの下部にある矢印ボタンを使用して、地物IDでブラウジングができます。2番目のパネルに表示される地物の属性は、矢印ボタンを押すたびに順に更新されます。また、下部にあるボタンを押すことで、マップキャンバスでアクティブな地物を識別したり、アクティブな地物へ画面を移動することもできます。
あるモードから他方のモードへの切り替えは、ダイアログの右下にある対応するアイコンをクリックすることによって行えます。
デフォルトビュー モードを指定することもできます。 「直前の表示形式」、「テーブル表示」または「フォーム表示」にすることができます。
メニューで、属性テーブルのオープン時の16.2.2.2. 列の設定
テーブル表示の場合に列のヘッダを右クリックすると、以下の項目をコントロールするツールにアクセスできます:
列の幅の修正
列の幅は、列見出しを右クリックして、次のいずれかを選択することで設定できます:
幅の設定... 希望する幅の値を入力します。デフォルトでは、現在の値がウィジェットに表示されます
全カラム幅を設定... は、すべてのカラムの幅を同じ値で設定します
自動サイズ は、列に合わせて最適なサイズに変更します。
全カラム幅を自動設定
カラムの幅は、カラムのヘッダの右側の境界をドラッグすることでも変更できます。新しいカラム幅はレイヤに保持され、次に属性テーブルを開いたときにこの幅が復元されます。
列の非表示・整理とアクションの有効化
列のヘッダを右クリックすると、属性テーブルから 列を非表示 とするかどうかを選択できます(「テーブル表示」の場合)。より詳細なコントロールについては、ダイアログのツールバーの 列の整理... ボタンを押すか、列のヘッダの右クリックメニューで 列の整理... を選択します。このダイアログでは、以下のことができます:
表示したい列にチェック、または非表示したい列のチェックを外す:非表示にした列は、自ら復元するまで、属性テーブルダイアログのすべてのインスタンスから消えます。
アイテムをドラッグ&ドロップして、属性テーブル内の列の順序が変更できます。この変更はテーブルの表示のためのものであり、レイヤのデータソースのフィールドの順序は変更されないことに注意してください。
新しい仮想の アクション 列を追加して、各行にドロップダウンボックスを表示したり、利用可能なアクションのボタンリストを表示します。アクションに関する更なる情報については、 アクションプロパティ を参照してください。
列による並べ替え
テーブルは列のヘッダをクリックすることで任意の列でソートできます。小さな矢印はソート順を示しています(下向きは先頭行から値を降順で、上向きは先頭行から値を昇順で並べることを意味します)。列のヘッダのコンテキストメニューの 並べ替え... オプションを使用して式を書くことでも行を並べ替えることができます。例えば、複数の列を使用して行を並べ替えるには concat(col0, col1)
と書きます。
フォーム表示では、地物識別子は プレビュー式で並べ替え オプションを使用してソートできます。
Tip
異なる型の列に基づいた並べ替え
文字列型の列と数値型の列に基づいて属性テーブルを並べ替えようとすると、予期しない結果となることがあります。これは、式 concat("USE", "ID")
が文字列値を返す(つまり 'Borough105' < 'Borough6'
である)ために起こります。この問題を回避するには、例えば、 concat("USE", lpad("ID", 3, 0))
とすると、 'Borough105' > 'Borough006'
を返します。
16.2.2.3. 条件式を使ったテーブルセルの書式設定
条件付き書式設定を使用して、属性テーブル内で特に注目したい地物を強調表示させることができます。カスタム条件式は、地物に関する以下の要素に基づきます:
ジオメトリ(例:マルチパート地物、面積が小さい地物、定義された地図範囲内にある地物などを識別する)
フィールド値(例:しきい値との比較や、空のセルを区別するなど)
テーブル表示の属性ウィンドウの右上にある をクリックして、条件付き書式パネルを有効にできます(フォーム表示では使用できません)。
この新しいパネルでは、 フィールド または 行全体 の書式レンダリングに新ルールを追加することができます。新ルールを追加すると、以下のものを定義するためのフォームが開きます:
ルールの名前
何らかの 式ビルダー 関数を使用した条件式
書式設定:プリセット書式のリストから選択するか、以下のプロパティに基づいて作成できます。
背景色とテキスト色
アイコンを使用するかどうか
太字、イタリック、下線、取り消し線
フォント
16.2.3. 属性テーブルの地物とのやりとり
16.2.3.1. 地物の選択
テーブル表示では、属性テーブルの各行はレイヤ内の個別地物の属性を表します。ある行を選択するとその地物が選択され、同様に、(ジオメトリのあるレイヤの場合は)マップキャンバスで地物を選択すると属性テーブル内の行が選択されます。マップキャンバス(または属性テーブル)で選択された地物の組み合わせが変更された場合、それに応じて属性テーブル(またはマップキャンバス)の選択が更新されます。
行の左端にある行番号をクリックすることで、行を選択することができます。 Ctrl キーを押しながらクリックすると、 複数の行 をマークすることができます。 Shift キーを押しながら行の左側にある複数の行ヘッダをクリックすると、 連続選択 ができます。現在のカーソル位置とクリックした行の間のすべての行が選択されます。属性テーブルのセルをクリックしてカーソル位置を移動しても、行の選択は変わりません。また、メインキャンバス内で選択を変更しても、属性テーブルのカーソル位置は移動しません。
属性テーブルのフォーム表示では、地物はデフォルトで左側パネル内において表示フィールド( 表示名プロパティ 参照)の値によって識別されています。この識別子はパネルの上部にあるドロップダウンリストを使用して、既存のフィールドを選択するか、カスタム式を使用して置き換えることができます。また、ドロップダウンメニューから地物フォームのリストをソートすることもできます。
左側のパネルで値をクリックすると、右側のパネルにその地物の属性が表示されます。地物を選択するには、識別子の左にある四角いシンボルの中をクリックします。デフォルトでは、シンボルが黄色に変わります。テーブル表示と同様、これまでに紹介したキーボードの組み合わせで複数の地物を選択することができます。
マウスで地物を選択するだけでなく、属性テーブルのツールバーにある以下のようなツールを使用して、地物の属性に基づいた自動選択を行うことができます(詳細や使用例については、 自動選択 および次のセクションを参照):
フォームによるフィルタと地物選択 を使って地物を選択することもできます。
16.2.3.2. 地物のフィルタリング
属性テーブルで地物を選択したら、テーブルにこれらのレコードのみを表示したい場合があります。これは、属性テーブルダイアログの左下にあるドロップダウンリストから 選択した地物を表示 アイテムを使用すると簡単にできます。このリストには、次のようなフィルタがあります:
選択した地物を表示 - これは、 レイヤ メニューや 属性ツールバー から 属性テーブルを開く(選択地物) を使用する場合や、キーボードで Shift+F6 を押した場合と同じです
地図上に表示されている地物を表示 - これは、 レイヤ メニューや the 属性ツールバー から 属性テーブルを開く(可視地物) を使用する場合や、キーボードで Ctrl+F6 を押した場合と同じです
編集された地物と新規地物を表示 - これは、 レイヤ メニューや 属性ツールバー から 属性テーブルを開く(編集済み地物) を使用する場合と同じです
属性フィルタ - フィールドの値に基づいたフィルタリングができます:リストからカラムを選択し、値を入力するか選択して、 Enter キーを押すとフィルタリングが実行されます。すると、
num_field = value
の式やstring_field ilike '%value%'
の式にマッチする地物のみが属性テーブルに表示されます。文字列に関しては Case sensitive にチェックを入れることで、大文字小文字を区別するより厳しいマッチングにできます。詳細フィルタ(式) - 式ビルダーダイアログを開きます。ここでは、テーブルの行にマッチさせるための 複雑な式 を作成することができます。例えば、複数のフィールドを使用してテーブルをフィルタできます。OKボタンを押すと、そのフィルタ式がフォームの下部に表示されます。
保存済み式 へのショートカットです。
属性テーブルのフィルタリングによく使用する
これらは フォームによる地物フィルタ でも利用可能です。
注釈
属性テーブルからレコードをフィルタリングしても、レイヤから地物がフィルタリングされるわけではありません。地物はテーブルから一時的に非表示になるだけで、マップキャンバスからはアクセスでき、フィルタを取り除いてもアクセスすることができます。フィルタでレイヤから地物を実際に隠すには、 クエリビルダ を使用してください。
Tip
地図上に表示されている地物を表示
によるデータソースフィルタリングの更新
パフォーマンス上の理由で、属性テーブルに表示される地物がテーブルを開いたときのキャンバス範囲に空間的に制限されている場合(設定方法は データソースオプション を参照)、新しいキャンバス範囲で 地図に表示されている地物を表示 を選択すると、空間的な制限が更新されます。
16.2.3.3. フィルタ式の保存
属性テーブルのフィルタリングに使用した式は、以降の呼び出しのために保存することができます。 属性フィルタ や 詳細フィルタ(式) のエントリを使用すると、使用されている式が属性テーブルダイアログの下部にあるテキストウィジェットに表示されます。テキストボックスの横にある 名前付きで式を保存 を押すと、プロジェクトに式が保存されます。ボタンの横にあるドロップダウンメニューを使用して、自分で式の名前を付けて保存できます( 式を新たに保存... )。保存された式が表示されたら、 ボタンがトリガーされ、そのドロップダウンメニューから 式を編集 (式の名前も編集可)や、 保存済み式の削除 が行えます。
保存済みフィルタ式はプロジェクト内に保存され、属性テーブルの 保存済みフィルタ式 メニューをから利用できます。これは、アクティブなユーザープロファイルの全プロジェクトで共有される ユーザー保存式 とは異なります。
16.2.3.4. フォームによるフィルタと地物選択
フォームによる地物選択/フィルタ をクリックするか、または Ctrl+F を押すと、属性テーブルダイアログをフォーム表示に切り替え、各ウィジェットが検索変数に置き換わります。
ここで説明するこのツールの機能は、 値による地物選択 で説明されているものと同様です。そちらには、すべての演算子と選択モードについての説明があります。
属性テーブルから地物を選択/フィルタする際には、フィルタを定義したり、絞り込んだりできる 地物をフィルタする ボタンがあります。このボタンを押すと 詳細フィルタ(式) オプションがトリガーされ、対応したフィルタ式がフォームの下部にある編集可能なテキストウィジェットに表示されます。
すでにフィルタされた地物がある場合は、 地物をフィルタする ボタンの隣にあるドロップダウンリストを使用してフィルタを絞り込むことができます。オプションは次のとおりです。
フィルタの絞り込み ("AND")
フィルタを拡げる ("OR")
フィルタを削除するには、左下のプルダウンメニューから 全地物を表示 オプションを選択するか、または式をクリアして 適用 ボタンをクリックするか Enter キーを押します。
16.2.4. 地物に関するアクション
ユーザーはコンテキストメニューを使用していくつかの地物操作が可能です:
地物を すべて選択 ( Ctrl+A )
セルの内容をコピーする で、セルの内容をクリップボードにコピーする
地物を選択することなく 地物にズーム
地物を選択することなく 地物にパン
地物をフラッシュ で、マップキャンバス内で強調表示
フォームを開く :そのクリックされた地物にフォーカスした状態で、属性テーブルをフォーム表示に切り替えます
属性データを外部プログラム(Excel、LibreOffice、QGIS、カスタムWebアプリケーションなど)で使用したい場合には、1つまたは複数の行を選択して 選択している行をクリップボードへコピーする ボタンを押すか、 Ctrl+C を押します。
地物のコピー ドロップダウンリストで貼り付け形式を指定できます:
メニューでは、プレーンテキスト(ジオメトリなし)
プレーンテキスト(WKTジオメトリ)
GeoJSON
このコンテキストメニューでアクションのリストを表示することもできます。これは アクションプロパティ を参照してください。
タブから有効にできます。アクションの詳細については16.2.4.1. 選択地物を新規レイヤとして保存する
選択された地物は、OGR がサポートする任意のベクトル形式として保存でき、別の座標参照系 (CRS) に変換することもできます。レイヤ パネルでレイヤのコンテキストメニューから をクリックし、出力データセットの名前、形式、CRSを定義します(セクション 既存のレイヤから新しいレイヤを作成する を参照)。 がチェックされていることが分かります。ダイアログ内でGDALの作成オプションを指定することも可能です。
16.2.5. 属性値の編集
属性値の編集は以下の方法で行うことができます。
新しい値をセルに直接入力します。属性テーブルがテーブル表示でもフォーム表示でも可能です。従って、変更はセルごと、地物ごとに行われます。
フィールド計算機 を使用して、あるフィールド列全体に対して連続して更新を行います。フィールドは既存のものでも、新しく作られたものでもよいですが、更新は複数の地物に対して行われます。これは仮想フィールドを作るためにも使用することができます。
クイックフィールド 計算バー を使用します。上と同じですが既存のフィールドに対してのみ使用できます。
マルチエディット モードを使用します。複数の地物の複数のフィールドを連続して更新します。
16.2.5.1. フィールド計算機を使用する
属性テーブルの フィールド計算機 ボタンを使うと、既存の属性値もしくは定義された関数に基づいて計算を行うことができます。例えば、ジオメトリ地物の長さや面積の計算ができます。計算結果は既存のフィールドの更新や、新しいフィールド(これは 仮想 フィールドも可)への書き込みに使うことができます。
フィールド計算機 は編集をサポートするすべてのレイヤで利用可能です。フィールド計算機のアイコンをクリックすると、ダイアログを開きます( 図 16.72 参照)。レイヤが編集モードでない場合には警告が表示され、フィールド計算機を使用すると、計算が行われる前にレイヤが編集モードに変わります。
式ビルダー ダイアログをベースにしたフィールド計算機ダイアログは、式を定義し、それを既存のもしくは新規作成フィールドに適用するための完璧なインターフェイスを提供します。フィールド計算機ダイアログを使うには、以下について選択する必要があります:
レイヤの全体に計算を適用したいのか、それとも選択した地物のみに適用したいのか
計算によって新しいフィールドを作りたいのか、それとも既存のフィールドを更新したいのか
新しいフィールドを作ることを選んだ場合には、フィールドの名前やフィールド型(整数値、小数点付き数値、日付、テキストなど)を入力する必要があり、必要ならばフィールド長や精度も入力します。例えば、フィールド長が10で精度を3とすると、これは小数点より前に7桁あり、小数部が3桁の数値ということになります。
式 タブを使用している場合のフィールド計算機の動作を簡単な例で説明します。QGISサンプルデータセットから、 railroads
レイヤの長さを km 単位で計算したいとします:
出力する属性(フィールド)の名前 を
length_km
に設定します。フィールド型 として
小数点付き数値(real)
を選択します。フィールド長 を
10
に、 精度 を3
に設定します。ジオメトリ グループにある
$length
をダブルクリックして、ジオメトリの長さをフィールド計算機の式ボックスに追加します(式ボックスの下に最大60文字までの出力のプレビューが表示され、式が組み立てられるとリアルタイムに更新されます)。フィールド計算機の式ボックスで
/ 1000
を入力して式を完成させ、 OK をクリックします。これで、属性テーブルに新しい length_km フィールドが出来ました。
16.2.5.2. 仮想フィールドの作成
仮想フィールドとは、オンザフライで計算される式に基づいたフィールドのことです。式の基礎となるパラメータが変更されると値が自動的に更新されます。式の設定は一度だけでよく、基礎となる値が変更されるたびにフィールドの再計算を行う必要はありません。例えば、地物をデジタイジングするたびに面積を評価する場合や、変更の可能性がある(例: now()
関数を使用する)日付間の期間を自動的に計算する場合などで、仮想フィールドを使用するのが良いでしょう。
注釈
仮想フィールドの使用
仮想フィールドはレイヤの属性として永続的ではありません。つまり、仮想フィールドを作成したプロジェクトファイル内にのみ保存され、そこでのみ利用可能です。
フィールドは作成時にのみ、仮想フィールドに設定することができます。仮想フィールドは、レイヤプロパティダイアログのフィールドタブに紫色の背景で表示され、通常の物理フィールドや結合されたフィールドとは区別できるようになっています。仮想フィールドの式は、「コメント」列の式ボタンを押すことで、後から編集することができます。ボタンを押すと式エディタウィンドウが開き、仮想フィールドの式の修正ができます。
16.2.5.3. クイックフィールド計算バーを使用する
フィールド計算機がいつでも利用可能なのに対して、属性テーブルの上部にあるクイックフィールド計算バーは、レイヤが編集モードにある場合にのみ表示されます。式エンジンのおかげで、クイックフィールド計算バーを使えば既存のフィールドの編集がより素早くできるようになります。
16.2.5.4. 複数のフィールドの編集
これまでのツールとは異なり、マルチエディットモードでは、さまざまな地物の複数の属性を同時に編集できます。レイヤを編集モード切り替えて、以下の操作によりマルチエディット機能にアクセスできます。
注釈
属性テーブルのツールとは異なり、
オプションを選択すると現れる、変更する属性値を入力するためのダイアログはモーダルなダイアログです。したがって、実行前に地物の選択が必要です。複数のフィールドを一度に編集するには:
編集したい地物を選択します。
属性テーブルツールバーから をクリックします。これによりダイアログがフォーム表示に切り替わります。地物の選択はこの段階でも行うことができます。
属性テーブルの右側には、選択した地物のフィールド(と値)が表示されています。新しいウィジェットが各フィールドの横に表示され、現在のマルチエディット状態を表示します。
選択した地物はフィールドに異なる値を有しています。値は空で表示され、各地物は元の値を持っています。ウィジェットのドロップダウンリストから、フィールドの値をリセットすることができます。
フィールドの値が編集され、入力した値を選択した地物すべてに適用しようとする状態です。ダイアログの上部には、変更を適用するか、リセットするかを案内するメッセージが表示されます
これらのウィジェットのいずれかをクリックすると、フィールドの現在の値を設定するか、元の値にリセットできます。つまり、フィールド単位で変更をロールバックできます。
変更したいフィールドを編集します。
上部のメッセージ内の 変更の適用 をクリックするか、または左側パネルの別の地物をクリックします。
選択した地物すべて に変更が適用されます。地物が選択されていない場合、テーブル全体が変更内容で更新されます。変更は単一の編集コマンドとして行われます。したがって、 元に戻す を押すと、選択したすべての地物の属性変更を一度にロールバックします。
注釈
複数編集モードは「自動生成」または「ドラッグ&ドロップ」のフォームでのみ利用可能です( データに合わせてフォームをカスタマイズする 参照)。カスタムUIフォームではサポートされていません。
16.2.6. 1対多または多対多のリレーションの作成
「リレーション」は、データベースでよく使用される技術です。その概念は、異なるレイヤ(テーブル)の地物(行)がお互いに属することができるというものです。
16.2.6.1. 1対Nリレーションの導入
例として、アラスカのすべての地域(ポリゴン)を有するレイヤがあり、名前、地域タイプ、(主キーとして機能する)ユニークIDといった属性を持っているとします。
それから、地域にある空港の情報を持った別のポイントレイヤまたはテーブルがあり、これらの情報も把握したいとします。ほとんどの地域には複数の空港があるため、これらを地域レイヤに追加する場合は、外部キーを使って1対多のリレーションを作成する必要があります。
1対Nリレーションのレイヤ
QGISでは、テーブルとベクタレイヤの間に違いはありません。基本的には、ベクタレイヤとはジオメトリを持っているテーブルのことです。このため、テーブルはベクタレイヤとして追加することができます。 1対Nリレーションのデモンストレーションとして、 regions
シェープファイルと、地域レイヤへの外部キーフィールド( fk_region
)を持つ airports
シェープファイルを読み込んでみましょう。これは、各空港はそれぞれただ1つの地域に属し、各地域は空港をいくつでも持つことができることを意味します(典型的な1対多関係です)。
1対Nリレーションの外部キー
空港の属性テーブルに既にある属性に加えて、外部キーとして動作する別のフィールド fk_region
が必要です(データベースを持っている場合には、このフィールドに制約を定義することになるでしょう)。
このフィールド fk_region には、必ず地域のIDが入ります。これは、空港が属する地域へのポインタのように見ることができます。また、編集用のカスタム編集フォームを設計でき、QGISはその設定を処理します。これはさまざまなプロバイダに対応しており(シェープファイルやCSVファイルでも使うことができます)、しなければならないのは、QGISにテーブル間の関係を伝えることだけです。
1対Nリレーションの定義
まず最初に行うのは、レイヤ間の関係をQGISに知らせることです。これは、 リレーション タブを開き、 リレーションを追加 をクリックします。
で行います。名前 はタイトルとして使用されます。これはわかりやすい文字列で、リレーションが何のために用いられるのかを説明するものであるべきです。ここでは、単に airport_relation と名前を付けましょう。
被参照レイヤ(親) 親レイヤとも呼ばれ、プライマリキーを持っており、参照されるレイヤです。この例では、
regions
レイヤです。参照レイヤの主キーを定義する必要があり、ここではID
を指定します。参照元レイヤ(子) 子レイヤとも呼ばれ、外部キーフィールドを持ったレイヤです。この例では、
airports
レイヤが該当します。参照元レイヤには他のレイヤを指す参照フィールドを指定する必要があり、ここではfk_region
とします。Id は内部的な目的で使用され、ユニークでなければなりません。これは カスタムフォーム を作成するために必要となる場合があります。空のままにしておくと自動でIdを作成しますが、扱いやすいように自分でIdを指定することもできます。
リレーションの強度 は、親子レイヤ間のリレーションの強さを設定します。デフォルトの Association タイプは、親レイヤが子レイヤに 単に リンクされていることを意味します。 一方、 コンポジション タイプでは、親レイヤを複製するときに子レイヤも複製され、親レイヤの地物を削除すると子レイヤの地物も削除されます。これはすべてのレベルにカスケードしていきます(つまり、子レイヤのそのまた子レイヤ...も一緒に削除されます)。
リレーション タブでは、 リレーションを検索 ボタンを押して、読み込んだレイヤの利用可能なリレーションをプロバイダから取得することもできます。この機能はPostgreSQLやSpatiaLiteといったデータプロバイダに保存されたレイヤで使用可能です。
1対Nリレーションのフォーム
これで、QGISはリレーションを把握できました。これはQGISが生成するフォームを改善するために利用されます。デフォルトのフォームのメソッド(自動生成)を変更していないので、改善はフォームに新しいウィジェットが追加されるのみです。それでは、凡例のregionsレイヤを選択して、識別ツールを使ってみましょう。設定によってはフォームが直接開くこともありますが、識別ダイアログのアクションから選択して地物フォームを開く必要があるかもしれません。
見ればわかるとおり、この特定の地域に割り当てられた空港が全てテーブル表示されています。また、いくつかのボタンも用意されています。早速見てみましょう。
ボタンは編集モードを切り替えるためのものです。regionsレイヤの地物の地物フォームを開いていますが、このボタンはairportsレイヤの編集モードを切り替えることに注意してください。ただしこのテーブルは、airportsレイヤの地物を表しています。
ボタンを使用するとマップキャンバス上でairportsレイヤのジオメトリのデジタイズを行うことができ、デフォルトで現在のregionに新しい地物を割り当てます。アイコンはジオメトリタイプによって変わることに注意してください。
ボタンは、airportsレイヤの属性テーブルに新しいレコードを追加します。この新しい地物はデフォルトで現在のregionに割り当てられます。ジオメトリは、 部分を追加 デジタイジングツールを使用して後から追加できます。
ボタンは、子レイヤ内の一つまたは複数の子地物を複製することができます。複製した子地物は後から別の親地物に割り当てることもできますし、属性値を編集することもできます。
シンボルをクリックすると、新しいダイアログが開き、既存の空港を選択して現在の地域に割り当てることができます。これは、誤って違う地域の上に空港を作成してしまった場合に便利です。
シンボルは、選択した空港(複数可)を現在の地域からリンク解除し、効果的に未割り当て状態(外部キーをNULLに設定)にします。
右にある と の2つのボタンは、リレーションのある子地物の テーブル表示とフォーム表示 を切り替えます。
regionsレイヤの地物に ドラッグ&ドロップデザイナー を使用している場合には、どのツールを利用可能か選択できます。新しい地物が追加されたときに新しいフォームを開くかどうかは、 地物追加時のフォームを表示しない オプションで決めることができます。このオプションが正しく動作するためには、NULLでない属性は有効なデフォルト値をとる必要があることに注意してください。
上記の例では、参照元レイヤがジオメトリを持っている(つまり、単なる英数字のテーブルではない)ので、上記の手順では、対応するジオメトリ地物を持たないエントリがレイヤの属性テーブルに作成されます。ジオメトリを追加するには、以下の操作を行います。
airportsテーブルで作業しているのなら、 fk_region
フィールド(リレーションを作成するために使用するフィールド)には、「リレーションの参照」ウィジェットが自動的に設定されます。詳細は リレーションの参照ウィジェット を参照してください。
airportsレイヤのフォームには、 fk_region
フィールドの右側に ボタンがあることがわかります。このボタンをクリックすると、regionsレイヤのフォームが開きます。このウィジェットで、簡単に素早くリンクしている親地物のフォームを開くことができます。
「リレーションの参照」ウィジェットには、親レイヤのフォームを子レイヤに埋め込むオプションもあります。これは、airportsレイヤの fk_region
フィールドを選択して、 埋め込みフォームの表示
オプションにチェックを入れてください。
今、地物フォームダイアログを見ると、regionsのフォームがairportsのフォームの中に組み込まれていて、現在の空港を別の地域に割り当てることができるコンボボックスもあることがわかります。
さらに、airportsレイヤの編集モードを切り替えると、 fk_region
フィールドにオートコンプリート機能も追加されます。入力中に regionsレイヤの id
フィールドの値がすべて表示されることがわかります。ここで、airportsレイヤの メニューの 新しい地物の追加
オプションを選択した場合、 ボタンを使用してregionsレイヤのポリゴンをデジタイズすることができます。
子レイヤは、 値による地物選択 ツールで子レイヤの属性に基づいて親レイヤの地物を選択するために使うこともできます。
図 16.80 では、空港の平均高度が海抜500mより高い地域すべてを選択しています。
フォームには多数のさまざまな集計関数があることがわかります。
16.2.6.2. 多対多(N対M)リレーションの導入
N対Mのリレーションとは、2つのテーブル間の多数対多数の関係のことです。例えば、 airports
レイヤと airlines
レイヤを考えてみましょう。空港には複数の航空会社が乗り入れており、航空会社は複数の空港に乗り入れています。
以下のSQLコードは、 locations という名前のPostgreSQL/PostGISスキーマに、N対Mリレーションに必要な3つのテーブルを作成します。このコードは、PostGISの pgAdmin のような外部ツールを使って実行できます。airportsテーブルには airports
レイヤが、airlinesテーブルには airlines
レイヤが格納されます。どちらのテーブルにも、わかりやすくするためにいくつかのフィールドが使われています。 トリッキー な部分は airports_airlines
テーブルです。このテーブルは、すべての空港に対するすべての航空会社(またはその逆)をリストアップするために必要です。この種のテーブルは ピボットテーブル として知られています。このテーブルの 制約 は、両方とも互いのレイヤにある場合にのみ、空港と航空会社を関連づけられるものとすることを強制します。
CREATE SCHEMA locations;
CREATE TABLE locations.airports
(
id serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
airport_name text NOT NULL,
CONSTRAINT airports_pkey PRIMARY KEY (id)
);
CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);
CREATE TABLE locations.airlines
(
id serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
airline_name text NOT NULL,
CONSTRAINT airlines_pkey PRIMARY KEY (id)
);
CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);
CREATE TABLE locations.airports_airlines
(
id serial NOT NULL,
airport_fk integer NOT NULL,
airline_fk integer NOT NULL,
CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
REFERENCES locations.airports (id)
ON DELETE CASCADE
ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
REFERENCES locations.airlines (id)
ON DELETE CASCADE
ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED
);
PostgreSQLの代わりに、GeoPackageを使うこともできます。この場合には、3つのテーブルは
を使用して手動で作成します。GeoPackageにはスキーマが無いため、 locations の接頭辞は不要です。airports_airlines
テーブルの外部キー制約は、 や では作成することができません。このため、このテーブルは を使用して作成する必要があります。GeoPackageは ADD CONSTRAINT 文をサポートしていないため、 airports_airlines
テーブルは2段階で作成する必要があります。:
を使用して、id
フィールドのみを持つテーブルを準備します。を使用して、以下のSQLコードを入力し実行します:
ALTER TABLE airports_airlines ADD COLUMN airport_fk INTEGER REFERENCES airports (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED; ALTER TABLE airports_airlines ADD COLUMN airline_fk INTEGER REFERENCES airlines (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED;
それから、上で説明したようにQGISで2つの 1対多のリレーション を設定します。
airlines
テーブルとピボットテーブルの間のリレーションairports
テーブルとピボットテーブルとの間の第2のリレーション
これを行うためのより簡単な方法(PostgreSQLのみ)は、 リレーションを検索 を使用することです。QGISは自動的にデータベース内の全てのリレーションを読み込むので、必要な2つのリレーションを選択するだけで設定ができます。最初にQGISプロジェクトに3つのテーブルを読み込むことを忘れないようにしてください。
のairport
や airline
を削除する場合、QGISは airports_airlines
テーブルの関連するレコードを削除しません。この作業は、現在の例のようにピボットテーブルの作成時に正しい 制約 を指定すれば、データベースによって行われます。
注釈
N対Mのリレーションと自動トランザクショングループを組み合わせる
このようなコンテキストで作業する場合は、
でトランザクションモードを有効にする必要があります。 QGISは、すべてのテーブル(航空会社、空港、ピボットテーブル)の行を追加または更新できる必要があります。最後に、 airports
レイヤと airlines
レイヤに対して正しい「要素数」を選択する必要があります。最初のレイヤには airlines (id) オプションを、2番目のレイヤには airports (id) オプションを選択する必要があります。
これで、サブフォーム内で 子地物の追加 や 既存の子地物をリンク を使用してairlineにairportを(そしてairportにairlineを)関連付けることができるようになりました。 airports_airlines
テーブルにはレコードが自動的に挿入されます。
注釈
多対1リレーション 要素数を使用する
N対Mリレーションでピボットテーブルを隠すことが望ましくない場合があります。これは主に、リレーションが確立されたときにのみ値を持つことができる属性がリレーションに存在するというのが理由です。テーブルが(ジオメトリフィールドを持つ)レイヤの場合、ピボットテーブルの外部キーフィールドで 地図上の地物特定 オプション( )を有効にするとよいかもしれません。
注釈
ピボットテーブルの主キー
ピボットテーブルの主キーには複数のフィールドを使用しないでください。QGIS は単一の主キーを想定しているため、 constraint airports_airlines_pkey primary key (airport_fk, airline_fk)
のような制約は機能しません。
16.2.6.3. 多態リレーションの導入
多態リレーションは1-N関係の特殊なケースであり、1つの参照元(ドキュメント)レイヤ内に複数の参照先レイヤの地物が含まれます。これは、参照先レイヤごとに異なる参照元レイヤを必要とする通常のリレーションとは異なっています。参照元(ドキュメント)レイヤに layer_field
カラムを追加することで単一の参照元(ドキュメント)レイヤとすることができ、ここには参照先レイヤを識別する情報を格納します。最も単純な形は、参照元(ドキュメント)レイヤはこのフィールドに参照先レイヤのレイヤ名を入れるだけです。
より正確に言うならば、多態リレーションは、参照元レイヤが同じ通常のリレーションの集合ですが、参照先レイヤは動的に定義されるものです。レイヤの多態リレーションの設定は、テーブル名、レイヤID、レイヤ名など、参照先レイヤのいくつかのプロパティと一致しなければならない式を使用することで解決されます。
公園に行き、そこで見かけたさまざまな種類の植物 plants
や動物 animals
の写真を撮ることを考えてみましょう。それぞれの植物や動物には複数の写真が関連付けられているので、通常の 1:N リレーションで写真を保存する場合、 animal_images
と plant_images
という2つの別々のテーブルが必要です。テーブル2つならば問題とはならないかもしれませんが、キノコや鳥などの写真も別々に撮影したいとしたらどうでしょうか。
多態リレーションは、参照元のすべての地物を同一の documents
テーブルに格納することでこの問題を解決します。各地物の referenced_layer
フィールドには参照先レイヤが、 referenced_fk
フィールドには参照先の地物ID が格納されます。
多態リレーションの定義
最初に、QGISにレイヤ間の多態リレーションについて知らせましょう。これは、 リレーション タブを開き、 リレーションを追加 ボタンの横にある小さな下向き矢印のボタンをクリックします。新しく現れたドロップダウンメニューから、 多態リレーションを追加 オプションを選択します。
から行えます。Id は内部的な目的で使用され、ユニークでなければなりません。これは カスタムフォーム を作成するために必要となる場合があります。空のままにしておくと自動でIdを作成しますが、扱いやすいように自分でIdを指定することもできます。
参照元レイヤ(子) は子レイヤとも呼ばれ、外部キーのフィールドを持っているレイヤです。この例では
documents
レイヤです。このレイヤには他のレイヤを指す参照フィールドを追加する必要があり、これがreferenced_fk
です。レイヤのフィールド は、評価されたレイヤ式の結果を格納する参照元テーブルのフィールドです。これは、この地物がどのレイヤに属するかの参照テーブルです。 この例では、
referenced_layer
フィールドがこれに該当します。レイヤのフィールド式 は、レイヤのユニークな識別子を評価します。これは、レイヤ名
@layer_name
やレイヤのID@layer_id
、レイヤのテーブル名decode_uri(@layer, 'table')
など、レイヤを一意に識別できるものであれば何でも利用できます。リレーションの強度 は、親子レイヤ間に生成されたリレーションの強さを設定します。デフォルトの Association タイプは、親レイヤが子レイヤに 単に リンクされていることを意味します。 一方、 コンポジション タイプでは、親レイヤを複製するときに子レイヤも複製され、親レイヤの地物を削除すると子レイヤの地物も削除されます。これはすべてのレベルにカスケードしていきます(つまり、子レイヤのそのまた子レイヤ...も一緒に削除されます)。
参照先レイヤ は親レイヤとも呼ばれ、主キーを持ち、指し示される側のレイヤです。この例では、
plants
レイヤとanimals
レイヤがこれに該当します。参照先レイヤの主キーをドロップダウンメニューから定義する必要があり、この例ではfid
です。有効な主キーを定義するには、全ての参照先レイヤで同じ名前のフィールドが存在する必要があることに注意してください。そのようなフィールドが存在しない場合には、多態リレーションを保存することができません。
一度追加したら、この多態リレーションは 多態リレーションを編集 メニューエントリから編集ができます。
上記の例では、以下のデータベーススキーマを使用しています:
CREATE SCHEMA park;
CREATE TABLE park.animals
(
fid serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
animal_species text NOT NULL,
CONSTRAINT animals_pkey PRIMARY KEY (fid)
);
CREATE INDEX animals_geom_idx ON park.animals USING gist (geom);
CREATE TABLE park.plants
(
fid serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
plant_species text NOT NULL,
CONSTRAINT plants_pkey PRIMARY KEY (fid)
);
CREATE INDEX plants_geom_idx ON park.plants USING gist (geom);
CREATE TABLE park.documents
(
fid serial NOT NULL,
referenced_layer text NOT NULL,
referenced_fk integer NOT NULL,
image_filename text NOT NULL,
CONSTRAINT documents_pkey PRIMARY KEY (fid)
);
16.2.7. 外部リソースの保存と取得
フィールドは外部ストレージシステムに保存されたリソースを対象とすることもできます。属性フォームは外部ストレージシステムに対するクライアントとして動作するように設定でき、フォームから直接、ユーザーの要求に応じて外部ストレージシステムからリソースを保存・取得することができます。
16.2.7.1. 外部ストレージの設定
外部ストレージを設定するにはまず、最初にベクタレイヤの 属性フォームプロパティ を設定し、 アタッチメント ウィジェットを選択する必要があります。
アタッチメント ウィジェットを選択したら、まずは ストレージタイプ を以下の中から選択します:
ファイルを選択 :ターゲットのURLがある場合に使用します。リソースを選択すると、ストア操作は行われず、属性値は単にURLで更新されます。
単純コピー :リソースのコピーをファイルディスクの指定位置(ローカル、ネットワーク共有ファイルシステムどちらも可)に保存し、属性値はコピーへのパスで更新されます。
WebDAV Storage: リソースは WebDAV プロトコルをサポートするHTTPサーバーにプッシュされ、属性はそのURLで更新されます。Nextcloud や Pydio などのファイルホスティングソフトウェアがこのプロトコルに対応しています。
続いて、 保存URL パラメータを設定する必要があります。これは、新しいリソースを保存する必要がある場合に使用するURLです。これは地物の属性に応じた特定の値を持てるように、 データによって定義された上書きウィジェット を使用して式を設定することもできます。
変数 @selected_file_path を式中で使用すれることができ、ユーザーが(ファイルセレクタを使用して、あるいはドラッグ&ドロップで)選択したファイルの絶対ファイルパスを表すことができます。
注釈
WebDAV 外部ストレージを使用しておりURLが "/" で終わっている場合には、これはフォルダとみなされ、選択したファイルの名前が後ろに追加されて最終的なURLとなります。
外部ストレージシステムが必要とするならば、 認証 に関する設定も行えます。
16.2.7.2. 外部ストレージの利用
設定が完了したら、地物の編集中状態で ... ボタンを押すことで、ローカルファイルを選択できます。 ストレージタイプ に応じてこのファイルは外部ストレージシステムに保存され( ファイルを選択 を選択した場合を除く)、フィールドの値は新しいリソースのURLで更新されます。
注釈
ファイルアタッチメントウィジェット上にファイルをドラッグ&ドロップすることでも、同様の結果が得られます。
キャンセル ボタンを使用すると、保存プロセスが中断します。 統合ドキュメントビューア を使用してビューアの設定を行うことで、外部ストレージシステムからリソースを自動的に取得し、URLの下に表示させることができます。上記の アイコンは、外部ストレージシステムからリソースを取得できないことを示しています。この場合、より詳細な情報が ログメッセージパネル に表示されていることがあります。