重要

翻訳は あなたが参加できる コミュニティの取り組みです。このページは現在 99.21% 翻訳されています。

9.1.

レイヤのデータと組み込みの関数やユーザー定義の関数に基づいた は、属性値やジオメトリ、変数を操作する強力な方法です。ジオメトリのスタイル、ラベルの内容や位置、ダイアグラムの値、レイアウトアイテムの高さ、地物の一部の選択、仮想フィールドの作成などを動的に変更することができます。

注釈

式の作成に使えるデフォルトの関数や変数のリストは、詳細な情報や例付きで 関数のリスト にあります。

9.1.1. 式文字列ビルダー

式を組み立てるための主要なダイアログである 式文字列ビルダー は、QGISの多くの部分から使用することができますが、特に以下のような時に使うことができます。

式ビルダーダイアログからは、以下のタブにアクセス可能です。

  • タブは、定義済み関数 のリストを利用して、使用する式の作成や確認ができます。

  • 関数エディタタブ は、カスタムの関数を作成することで、関数リストの拡張ができます。

9.1.1.1. インターフェイス

タブには関数やレイヤのフィールド、値を使用して式を作成するためのメインのインターフェイスがあります。これには、以下のウィジェットが含まれます:

../../../_images/function_list.png

図 9.1 式タブ

  • 式を入力したり張り付けたりするための式エディタ領域。以下のような自動補完を利用でき、式の入力を短縮できます:

    • 入力したテキストに応じた変数名、関数名、フィールド名が下に表示されます。 Up 矢印キーと Down 矢印キーを使って項目間を移動することができます。式に挿入するには Tab キーを押すか、挿入したい項目を単にクリックします。

    • 関数を入力している間、関数のパラメータが表示されます。

    また、QGISは式が正しいかをチェックし、エラーを以下の方法で強調表示します:

    • アンダーライン :未定義の関数や、間違ったあるいは無効な引数

    • マーカー :単一の場所でのその他エラー(対応していない括弧、不要な文字など)

    Tip

    コメントで式をドキュメンテーションする

    複雑な式を使用する場合には、思い出しやすいように複数行コメントやインラインコメントとしてテキストを追加するのがよいでしょう。

    /*
    Labels each region with its highest (in altitude) airport(s)
    and altitude, eg 'AMBLER : 264m' for the 'Northwest Artic' region
    */
    with_variable(
      'airport_alti', -- stores the highest altitude of the region
      aggregate(
        'airports',
        'max',
        "ELEV", -- the field containing the altitude
        -- and limit the airports to the region they are within
        filter := within( @geometry, geometry( @parent ) )
      ),
        aggregate( -- finds airports at the same altitude in the region
          'airports',
          'concatenate',
          "NAME",
          filter := within( @geometry, geometry( @parent ) )
            and "ELEV" = @airport_alti
        )
        || ' : ' || @airport_alti || 'm'
        -- using || allows regions without airports to be skipped
    )
    
  • 式エディタの上部には、以下のようなツールセットがあります:

  • 式エディタの下部には、以下のものがあります:

    • 式を構築するのに役立つ基本的な演算子のセット

    • データで地物のプロパティを決める際に、出力の期待されるフォーマットの表示

    • デフォルトでレイヤの最初の地物で評価された、式のライブ プレビュー (最大60文字) 。60文字を超える出力プレビューテキストを表示するには、テキストにカーソルを合わせ、出力プレビュー全体を含むツールチップのポップアップを表示します。出力プレビューテキストをクリップボードにコピーするには、出力プレビューテキストを右クリックして、editCopy 式の値をコピー を選択します。

      レイヤの他の地物は、 地物 コンボボックスを使って閲覧・評価することができます(値はレイヤの 表示名 プロパティから取得されます)。

      エラーとなった場合には、エラーが表示され、ハイパーリンクからエラーの詳細情報にアクセスできます。

  • 関数セレクタには、関数や変数、フィールドなどのグループ化されたリストが表示されます。検索ボックスを利用して、リストをフィルタし特定の関数やフィールドを素早く見つけることができます。アイテムをダブルクリックすると、そのアイテムが式エディタに追加されます。

  • ヘルプパネルには、関数セレクタで選択したアイテムに対するヘルプが表示されます。

    Tip

    式内で関数名にカーソルを乗せて Ctrl+Click すると、ダイアログでその関数のヘルプが表示されます。

    関数セレクタでフィールドを選択している場合には、フィールドの値ウィジェットが表示され、以下のように地物の属性値の取得に役立ちます。

    • 特定のフィールド値を検索する

    • 全ユニーク または 10個のサンプル 値のリストを表示する。これはフィールドの右クリックからも利用できます。

      フィールドが他のレイヤや値のセットにマッピングされている場合、すなわち、 フィールド編集ウィジェットリレーションの参照値のリレーション または バリューマップ タイプの場合には、(参照されたレイヤ、テーブル、リストから)マッピングされたフィールドの値をすべてリストすることができます。さらに、このリストをフィルタリングして、現在のフィールドで checkbox 使用中の値のみ表示 することもできます。

    ウィジェット内でフィールド値をダブルクリックすると、式エディタに値が追加されます。

    Tip

    関数のヘルプやフィールドの値が表示される右側パネルは、ダイアログ内でたたむ(非表示にする)ことができます。 値を表示ヘルプを表示 ボタンを押すと、非表示状態から表示状態に戻すことができます。

9.1.1.2. 式の作成

QGISの式は、地物の選択や値の設定に使われます。QGISで式を作成するには、以下のいくつかのルールに従います。

  1. ダイアログでコンテキストを定義する: SQLに慣れているならば、 select features from layer where condition や、 update layer set field = new_value where condition といった形式のクエリを知っているでしょう。QGIS式もこれらの情報すべてを必要としますが、式ビルダーダイアログを開くためのツールが、必要な情報の一部を提供します。例えば、あるレイヤ( buildings )が、あるフィールド( height )を持っているとします:

    • expressionSelect式による地物選択 ツールを押すことは、 "select features from buildings" を意味します。式テキストウィジェットに入力する必要がある情報は condition のみです。つまり、 "height" > 20 と入力すれば、高さが20よりも大きい建物を選択します。

    • この地物選択を行った状態で、 calculateField フィールド計算機 ボタンを押して 既存のフィールドを更新する で "height" を選択することは、コマンド "update buildings set height = ??? where height > 20" を入力したのと同じです。この場合に、残りで入力する必要のあるものは、 新しい値 だけです。つまり、式エディタのテキストボックスに単に 50 と入力すれば、上で選択した buildings レイヤの height フィールドがこの値に設定されます。

  2. 引用符に注意 :シングルクォートはリテラルを返します。このため、シングルクォートに挟まれたテキスト( '145' )は文字列として解釈されます。ダブルクォートはそのテキストの値を返すので、フィールドにはダブルクォートを使用してください( "myfield" )。フィールドは引用符なしでも使用できます( myfield )。数値には引用符は不要です( 3.16 )。

    注釈

    関数は通常、フィールド名を表す文字列を引数にとります。次のようにしてください:

    attribute( @atlas_feature, 'height' ) -- returns the value stored in the "height" attribute of the current atlas feature
    

    以下のようにしてはいけません:

    attribute( @atlas_feature, "height" ) -- fetches the value of the attribute named "height" (e.g. 100), and use that value as a field
                                          -- from which to return the atlas feature value. Probably wrong as a field named "100" may not exist.
    

Tip

名前付きパラメータを使用して式を読みやすくする

いくつかの関数は多数のパラメータを設定する必要があります。式エンジンは名前付きパラメータの使用をサポートしています。つまり、暗号めいた式 clamp( 1, 2, 9) と書く代わりに、 clamp( min:=1, value:=2, max:=9) を使うことができます。引数を入れ替え、例えば clamp( value:=2, max:=9, min:=1) とすることもできます。名前付きパラメータを使うことで、式の関数の引数が何を指しているのかを明確にすることができ、後で式を理解しようとするときに役立ちます。

9.1.1.3. 式の使用例

  • フィールド計算機を使用して、既存の "total_pop" と "area_km2" フィールドを用いた "pop_density" フィールドの計算:

    "total_pop" / "area_km2"
    
  • 面積に基づいた地物のラベル付けやカテゴリ分け:

    CASE WHEN $area > 10 000 THEN 'Larger' ELSE 'Smaller' END
    
  • "pop_density" の値に応じた ”density_level” フィールドのカテゴリ更新:

    CASE WHEN "pop_density" < 50 THEN 'Low population density'
         WHEN "pop_density" >= 50 and "pop_density" < 150 THEN 'Medium population density'
         WHEN "pop_density" >= 150 THEN 'High population density'
    END
    
  • すべての地物に対して、住宅の平均価格が平方メートル当たり10000€より小さいか大きいかに応じたカテゴリ値スタイルを適用:

    "price_m2" > 10000
    
  • 「式による地物選択...」ツールを使用して、“High population density” に相当し、加えて平方メートルあたりの住宅の平均価格が10000€よりも高いエリアの地物をすべて選択:

    "density_level" = 'High population density' and "price_m2" > 10000
    

    この式は、どの地物をラベル付けするか、あるいはどの地物を地図に表示するかを定義するためにも使用できます。

  • "lands"レイヤから自然地帯と重なる地物を選択:

    overlay_intersects( layer:='lands', filter:="zone_type"='Natural' )
    
  • 各地物ごとにそれが含んでいる建物の数を数える:

    array_length( overlay_contains( layer:='buildings', expression:=@id ) )
    
  • ジオメトリジェネレータを使用した、レイヤの様々なシンボル(タイプ)の作成:

    point_on_surface( @geometry )
    
  • ポイント地物に対して、ジオメトリの周囲に閉じた輪を生成( make_line 関数を利用):

    make_line(
      -- using an array of points placed around the original
      array_foreach(
        -- list of angles for placing the projected points (every 90°)
        array:=generate_series( 0, 360, 90 ),
        -- translate the point 20 units in the given direction (angle)
        expression:=project( @geometry, distance:=20, azimuth:=radians( @element ) )
      )
    )
    
  • 印刷レイアウトのラベルにおいて、レイアウトの "Map 1" アイテム内にある "airports" 地物の名前を表示:

    with_variable( 'extent',
                   map_get( item_variables( 'Map 1' ), 'map_extent' ),
                   aggregate( 'airports', 'concatenate', "NAME",
                              intersects( @geometry, @extent ), ' ,'
                            )
                 )
    

9.1.1.4. 式の保存

式エディタフレームの上部にある fileSave 現在の式をユーザー保存式に追加 ボタンを使用すると、簡単にアクセスしたい重要な式を保存することができます。この式は中央のパネルの ユーザー式 グループから利用することができます。ユーザー保存式は ユーザープロファイル<userprofile>/QGIS/QGIS3.ini ファイル)内に保存され、あらゆるプロジェクトで現在のユーザープロファイルを使用すれば、すべての式ダイアログで利用可能です。

式エディタフレームの上部にあるツール群を使用して、ユーザー式の管理ができます:

  • fileSave現在の式をユーザー保存式に追加 :式をユーザープロファイル内に保存します。ラベルとヘルプ文を追加して、識別しやすくできます。

  • symbologyEdit ユーザー保存式から選択した式を編集 は、式やヘルプ文、ラベルを編集できます。

  • deleteSelected 選択した式をユーザー保存式から削除

  • sharingImport ユーザー式をインポート は、 .json ファイルからユーザー式をアクティブなユーザープロファイルのフォルダ内にインポートします。

  • sharingExport ユーザー式をエクスポート は、ユーザー式を .json ファイルとしてエクスポートします。ユーザープロファイル QGIS3.ini ファイル内のユーザー式をすべて共有することができます。

9.1.2. 関数エディタ

関数エディタ タブでは、Python言語を使って独自の関数を書くことができます。これは、定義済み関数では対応できない、特定のニーズに対処するための、手軽で簡単な方法を提供しています。

../../../_images/function_editor.png

図 9.2 関数エディタタブ

新しい関数を作成するには次のようにします。

  1. symbologyAdd 新規ファイル ボタンをクリックします。

  2. 新しい関数を保存する場所を選択します。保存先は、関数ファイル または プロジェクト関数 から選択できます。

    • 関数ファイル を選択した場合、QGISのテンプレートファイルを基にしたPython .py ファイルの名前を入力する必要があります。このファイルは、アクティブな ユーザープロファイル ディレクトリ下の /python/expressions フォルダーに保存され、そのプロファイルで開く全てのプロジェクトで利用可能になります。

      関数ファイルとして保存されたカスタムPython関数は、ユーザープロファイルの下で新しいプロジェクトを開始する度に自動的に読み込まれます。このようなPython関数を共有するには、/python/expressions フォルダー内にあるその .py ファイルを共有する必要があることに注意してください。

    • プロジェクト関数 を選択した場合、その新しい関数はそのプロジェクトファイルに保存され、そのプロジェクトでのみ利用可能になります。

      プロジェクト関数として保存されたカスタムPython関数は、それらが保存されたプロジェクトファイルを共有することで簡単に共有できます。プロジェクト関数を含むプロジェクトを開く際、QGIS は 埋め込まれたPythonコードを有効にする かどうかに応じて、それらを読み込むか無視するかを選択できます。

    関数エディタ タブの左パネルに新しい項目が追加されました。

  3. 右側のパネルには、ファイルの内容: Python スクリプトのテンプレート、が表示されます。

  4. Uncomment the code block and start editing it according to your needs. You can rely on code autocompletion, code formatting and typing helpers, as defined in Python設定. Online API documentation for Qt and PyQGIS objects is also accessible pressing the F1 key.

    ヘルプ ウィジェットには、@qgsfunction デコレータの設定に関する一般的な情報が記載されています。

  5. start 関数の保存と読み込み ボタンをクリックします。あなたの書いた関数が タブの関数ツリーの中に追加されます。デフォルトでは Custom グループの中に追加されます。

  6. 新しい関数を使いましょう。

  7. 関数に改善が必要なときは、 関数エディタ タブに戻って修正を加えた後、再度 start 関数の保存と読み込み ボタンをクリックして、ファイル内、つまりは任意の式タブで利用できるようにします。

カスタム関数を削除するには:

  1. 関数エディタ タブを有効にします

  2. リストから削除したい関数を選択します。

  3. symbologyRemove 選択した機能を削除 をクリックします。関数はリストから削除され、ストレージの種類に応じて、対応する .py ファイルがユーザープロファイルフォルダから削除されるか、そのPython関数がプロジェクトファイルから削除されます。

注釈

プロジェクト関数のあるプロジェクトファイルを閉じると、対応するプロジェクト関数はアンロードされ、QGIS セッション内で利用できなくなります。

これは、2つの値を操作する独自の my_sum 関数を作成する簡単な例です。

from qgis.core import *
from qgis.gui import *

@qgsfunction(group='Custom', referenced_columns=[])
def my_sum(value1, value2):
    """
    Calculates the sum of the two parameters value1 and value2.
    <h2>Example usage:</h2>
    <ul>
      <li>my_sum(5, 8) -> 13</li>
      <li>my_sum("field1", "field2") -> 42</li>
    </ul>
    """
    return value1 + value2

@qgsfunction デコレーターは次の引数を受け取ります:

  • 引数 group は、式ダイアログで関数をリストするグループを示します。

  • usesgeometry: 式が地物のジオメトリにアクセスする必要があるときはこれを True に設定します。デフォルトは False です。

  • handlesnull: 式がNULL値のためのカスタム処理を持っている場合、これを True に設定します。False (デフォルト)の場合、パラメータのいずれかがNULLのとき、結果は常にNULLになります。

  • referenced_columns: 関数を実行するために必要な属性名の配列。デフォルトは [QgsFeatureRequest.ALL_ATTRIBUTES] です。フィールドのサブセットを指定するか、空のリストを指定すると、実行が高速化されます。

  • params_as_list: 関数のパラメータをリストとして渡すとき、これを True に設定します。False (デフォルト) の場合、関数はパラメータを個別の引数として受け取ります。

関数自体は、あなたが関数に渡したい任意の数と型のパラメータを受け取ります。これらは、以下のオプション引数の前に設定する必要があります:

  • feature: 現在の地物

  • parent: QgsExpression オブジェクト

  • context: 最後の位置に context という引数がある場合、この変数には QgsExpressionContext オブジェクトが含まれ、式変数のような様々な追加情報へのアクセスを可能にします。例 context.variable( 'layer_id' )

関数シグネチャにそれらの引数が存在する場合、それらはいずれも関数に自動的に渡され、式の中で明示的に指定する必要はありません。

上記の例の関数は、次のように式の中で使うことができます。

../../../_images/customFunction.png

図 9.3 式タブに追加されたカスタム関数

カスタム関数の更なる例や追加の引数については、qgsfunction をご覧ください。Python コードの作成に関する詳細情報は、PyQGIS 開発者用 Cookbook をご参照ください。