ベクターレイヤーの特別な種類は、QGISを開くことができる他のベクター、任意の数のレイヤーの上にSQL言語を使用して、高度なクエリの結果としてのレイヤーを定義できます。これらのレイヤーは仮想レイヤーと呼ばれています。それら自体はデータを持たず、他のレイヤーへのビューとして見ることができます。
Layer メニューまたは対応するツールバーから 仮想レイヤーの追加 をクリックして、仮想レイヤ作成ダイアログを開きます。
ダイアログでは、SQLクエリを指定できます。クエリでは、、既存のベクトルレイヤーの名前(またはID)だけでなくこれらのレイヤーのフィールド名を使用できます。
For example, if you have a layer called regions, you can create a new virtual layer with an SQL query like SELECT * FROM regions WHERE id < 100. The SQL query will be executed, whatever the underlying provider of the regions layer is and even if this provider does not directly support SQL queries.
結合と複雑なクエリも、結合されるレイヤーの名前を直接に使用して簡単に作成できます。
基本となるエンジンは動作するSQLiteのとSpatialiteを使用しています。
それはSQLiteのローカルインストールが理解するSQLをすべて使用できることを意味します。
SQLiteからの関数とSpatialiteからの空間関数も仮想レイヤのクエリで使用できます。例えば、属性のみのレイヤーからポイントレイヤを作成することは、以下のようなクエリを使用して行うことができます: SELECT id, MakePoint(x, y, 4326) as geometry FROM coordinates
QGIS表現の関数 も仮想レイヤのクエリで使用できます。
レイヤーのジオメトリ列を参照するには、名前 geometry を使用します。
純粋なSQLクエリに反して、仮想レイヤクエリのすべてのフィールドは名前を付ける必要があります。それらが演算や関数呼び出しの結果である場合、列に名前を付けるために、 as キーワードを使用することを忘れないでください。
デフォルトのパラメータを設定すると、仮想レイヤエンジンは1つが存在している場合はジオメトリ列の種類を含むクエリの異なる列の種類を検出するために最善を尽くします。
これは、可能な場合、クエリをイントロスペクトすることによって、または、最後にクエリ(LIMIT 1)の最初の行をフェッチすることによって行われます。レイヤーを作成するためだけに結果の最初の行をフェッチすることは、パフォーマンス上の理由で望ましくない場合があります。
作成ダイアログではいろいろなパラメータを指定できます:
一意識別子列 :このオプションでは、クエリーのどのフィールドが、QGISが行識別子として使用できる一意の整数値を表すかを指定することを可能にします。デフォルトでは、自動インクリメントの整数値が使用されます。一意の識別子列を指定すると、idで行の選択を高速化できます。
ジオメトリなし :このオプションは、任意のジオメトリフィールドを無視するように仮想レイヤを強制します。得られるレイヤーは、属性のみのレイヤーです。
ジオメトリ列:このオプションでは、レイヤーのジオメトリとして使用される列の名前を指定できます。
ジオメトリタイプ:このオプションでは、仮想レイヤのジオメトリのタイプを指定できます。
仮想レイヤエンジンは、クエリの各列のタイプを決定しようとします。それが失敗した場合、クエリの最初の行は、列の型を決定するためにフェッチされます。
特定の種類の列は、いくつかの特別なコメントを使用してクエリで直接指定できます。
構文は次のようです: /*:type*/。それはちょうど列の名前の後に配置する必要があります。 type は、整数の int 、浮動小数点数ための real または text のいずれかであり得ます。
例えば: SELECT id+1 as nid /*:int*/ FROM table
/*gtype:srid*/``ジオメトリタイプは ( ``point ジオメトリカラムの種類と座標参照系はまた、次の構文 gtype との特別なコメントのおかげで設定できます、 linestring 、 polygon 、 multipoint 、 multilinestring または multipolygon )と座標参照系のEPSGコードを表す整数を srid 。
仮想レイヤを介してレイヤーを要求するとき、このソースレイヤーのインデックスは次のように使用されるであろう。
= 述語は、レイヤーの主キー列で使用される場合、基礎となるデータプロバイダは、特定のID(FilterFid)を要求します
他の述部の( ``> `` `` <= `` ``!= ``など)または主キーなしで列に、式から構築された要求は、基礎となるベクトルデータプロバイダを要求するために使用されます。それは彼らが存在する場合、インデックスは、データベース・プロバイダーで使用できることを意味します。
具体的な構文が、リクエストに空間述語を処理し、空間インデックスの使用をトリガするために存在しています: _search_frame_ という名前の隠し列は各仮想レイヤーに存在します。この列がバウンディングボックスに等しいかどうかを比較できます。例: select * from vtab where _search_frame_=BuildMbr(-2.10,49.38,-1.3,49.99,4326)
ST_Intersects のような空間バイナリ述語は、この空間インデックス構文と併せて使用されると大幅に高速化されます。