Actions — Add some custom buttons

|lizmap_3_4|の機能です。‎

定義

‎このモジュールでは、 PostgreSQL オブジェクトに対して表示される Lizmap地物情報 に1つまたは複数の アクションボタン を追加することができ、データベース内で クエリを起動 し、 マップ上に表示する ** ジオメトリ**を返します。‎

‎**JSON設定ファイル** は、 QGISプロジェクトと同じディレクトリ に配置する必要があります。このファイルには、1 つまたは複数の QGIS PostgreSQL ベクターレイヤーの 地物情報 に追加する PostgreSQLアクション がリストされています。‎

../../_images/publish-configuration-action-popup.gif

‎ツールの設定

  • Each action is characterized by a layer id, a name, a title, an icon, some optional options, style, callbacks and confirm property can be used.

  • ‎レイヤーには 1つまたは複数のアクション を設定できます

  • 独自のアクションで 1つまたは複数のレイヤー を持つことができます‎

‎このJSON設定ファイルの例、 myproject.qgs.action QGISプロジェクトファイルの名前が付けられた場合 myproject.qgs 。このプロジェクトでは、内部レイヤー ID``points_a7e8943b_7138_4788_a775_f94cbd0ad8b6``を持つ ポイント と呼ばれるベクトルレイヤーがあります (QGIS レイヤーの内部 ID を @layer_id という表現で取得できます)‎

{
    "points_a7e8943b_7138_4788_a775_f94cbd0ad8b6": [
        {
            "name": "buffer_500",
            "title": "Buffer 500m around this object",
            "confirm": "Do you really want to show the buffer ?",
            "icon": "icon-leaf",
            "options": {
                "buffer_size": 500,
                "other_param": "yes"
            },
            "style": {
                "graphicName": "circle",
                "pointRadius": 6,
                "fill": true,
                "fillColor": "lightblue",
                "fillOpacity": 0.3,
                "stroke": true,
                "strokeWidth": 4,
                "strokeColor": "blue",
                "strokeOpacity": 0.8
            },
            "callbacks": [
                {"method": "zoom"},
                {"method": "select", "layerId": "bati_1a016229_287a_4b5e_a4f7_a2080333f440"},
                {"method": "redraw", "layerId": "bati_1a016229_287a_4b5e_a4f7_a2080333f440"}
            ]
        }
    ]
}

‎**JSON設定** ファイルには、アクションを宣言する QGISレイヤー がリストされています。各レイヤーは QGISレイヤーID 、例えばここで``points_a7e8943b_7138_4788_a775_f94cbd0ad8b6``、および各IDに対して、許可するアクションを記述するオブジェクトのリストによって定義されます。‎

‎各 アクション は、次の式で定義されたオブジェクトです。‎

  • name はアクション識別子です。‎

  • ``title``‎は‎Lizmap インターフェイスのラベルとして使用されます

  • ‎``icon``はアクション ボタンに表示されます ( https://getbootstrap.com/2.3.2/base-css.html#icons 参照 )‎

  • ‎|lizmap_3_5|より,オプションの confirm プロパティはテキストみます。設定されている場合、アクションを実際に起動すべきかどうかを尋ねる確認ダイアログがユーザーに表示されます。アクションによってデータベース内の一部のデータが変更される場合に使用します。‎

  • ‎``options`` オブジェクトで、このアクションに追加のパラメータを設定します。必要なパラメータを追加できます。‎

  • a style object allowing to configure the returned geometry style. It follows OpenLayers styling attributes.

  • ‎``callbacks`` オブジェクトは、生成されたgeometryが返された後に、いくつかのアクションを起動することができます。これらは method の名前で定義されています。‎

    • ‎``ズーム``:geometryにズームします。‎

    • ‎``select``:返されたジgeometryと交差する特定のレイヤーから地物を選択します。ターゲットレイヤー QGIS内部ID は``layerId``プロパティに追加する必要があります。例では、建物を含むレイヤーのフィーチャ、ID bati_1a016229_287a_4b5e_a4f7_a2080333f440 が選択されます。‎

    • ‎``再描画``:マップ内の特定のレイヤーを再描画(更新)します。ターゲットレイヤーQGIS IDは``layerId``プロパティに追加する必要があります。‎

‎Lizmap は設定ファイル検出し、マップの読み込み時に必要なロジックを追加します。‎‎ユーザーがマップ内のこのレイヤーの 1 つのオブジェクトをクリックすると、‎ ‎**地物情報 パネル** は、地物データを示しますし,各 地物情報 アイテム上部‎, ‎**ツールバーは各レイヤーアクション** ごとに1つのボタンを表示します。‎アクションボタンをホバーすると、アクション title が表示されます。‎

‎まだ 有効 でない場合各ボタンは、 対応するアクションをトリガ します(それ以外の場合は、geometryを非有効化して消去します)。‎

  • ‎Lizmapはバックエンドで、アクションが適切に設定されているかどうかをチェックします。‎

  • ‎**PostgreSQL クエリ** を作成し、それを PostgreSQL データベースのレイヤーで実行します。(下記の例を参照)‎

  • ‎このクエリは GeoJSON を返し、マップに表示されます。‎

  • callbacks が設定されている場合は、起動されます。‎

  • ‎|lizmap_3_5|以降、返されるデータとアクションのプロパティを使用して、 Lizmap event actionResultReceived が生成されます。‎

‎**作成されたPostgreSQLクエリ** は、 Lizmap Webクライアントによって構築され、PostgreSQLテーブルデータベースで**を事前に作成する必要があるPostgreSQL関数``lizmap_get_data(json)`` を使用しています。この関数は、PostgreSQL クエリ文字列GeoJSON出力 に変換するより汎用関数``query_to_geojson(text)``を使用します。‎

Lizmap Webクライアント によって PostgreSQL データベースで実行されます。設定例として、ユーザーがボタン アクションをクリックしたときに buffer_500PostgreSQL テーブル test.points``に対応する **layer**``Points の ID 1 を持つ 地物 をクリックします。‎

SELECT public.lizmap_get_data('{
    "layer_name":"points",
    "layer_schema":"test",
    "layer_table":"points",
    "feature_id":1,
    "action_name":"buffer_500",
    "buffer_size":500,
    "other_param": "yes"
}') AS data;

‎ Lizmap が必要なすべての情報を含むJSONパラメータを作成し、PostgreSQL関数``lizmap_get_data(text)``を実行します。‎

‎この PostgreSQL 関数 lizmap_get_data(text) を作成して、1 つのオブジェクトを含む有効な GeoJSON テキストを返す必要があります。次の SQL コードは、必要な関数を作成するのに役立つ です。必要に応じて修正する必要があります。‎

-- Returns a valid GeoJSON from any query
CREATE OR REPLACE FUNCTION query_to_geojson(datasource text)
RETURNS json AS
$$
DECLARE
    sqltext text;
    ajson json;
BEGIN
    sqltext:= format('
        SELECT jsonb_build_object(
            ''type'',  ''FeatureCollection'',
            ''features'', jsonb_agg(features.feature)
        )::json
        FROM (
          SELECT jsonb_build_object(
            ''type'',       ''Feature'',
            ''id'',         id,
            ''geometry'',   ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
            ''properties'', to_jsonb(inputs) - ''geom''
          ) AS feature
          FROM (
              SELECT * FROM (%s) foo
          ) AS inputs
        ) AS features
    ', datasource);
    RAISE NOTICE 'SQL = %s', sqltext;
    EXECUTE sqltext INTO ajson;
    RETURN ajson;
END;
$$
LANGUAGE 'plpgsql'
IMMUTABLE STRICT;

COMMENT ON FUNCTION query_to_geojson(text) IS 'Generate a valid GEOJSON from a given SQL text query.';

-- Create a query depending on the action, layer and feature and returns a GeoJSON.
CREATE OR REPLACE FUNCTION lizmap_get_data(parameters json)
RETURNS json AS
$$
DECLARE
    feature_id integer;
    layer_name text;
    layer_table text;
    layer_schema text;
    action_name text;
    sqltext text;
    datasource text;
    ajson json;
BEGIN

    action_name:= parameters->>'action_name';
    feature_id:= (parameters->>'feature_id')::integer;
    layer_name:= parameters->>'layer_name';
    layer_schema:= parameters->>'layer_schema';
    layer_table:= parameters->>'layer_table';

    -- Action buffer_500
    -- Written here as an example
    -- Performs a buffer on the geometry
    IF action_name = 'buffer_500' THEN
        datasource:= format('
            SELECT
            %1$s AS id,
            ''The buffer '' || %4$s || ''m has been displayed in the map'' AS message,
            ST_Buffer(geom, %4$s) AS geom
            FROM "%2$s"."%3$s"
            WHERE id = %1$s
        ',
        feature_id,
        layer_schema,
        layer_table,
        parameters->>'buffer_size'
        );
    ELSE
    -- Default : return geometry
        datasource:= format('
            SELECT
            %1$s AS id,
            ''The geometry of the object have been displayed in the map'' AS message
            geom
            FROM "%2$s"."%3$s"
            WHERE id = %1$s
        ',
        feature_id,
        layer_schema,
        layer_table
        );

    END IF;

    SELECT query_to_geojson(datasource)
    INTO ajson
    ;
    RETURN ajson;
END;
$$
LANGUAGE 'plpgsql'
IMMUTABLE STRICT;

COMMENT ON FUNCTION lizmap_get_data(json) IS 'Generate a valid GeoJSON from an action described by a name, PostgreSQL schema and table name of the source data, a QGIS layer name, a feature id and additional options.';
  • ‎関数 lizmap_get_data(json) は、例としてここに示されています。 key entry point なので、ニーズに合わせて適応させる必要があります。 各アクション名のクエリを作成 をするために、指定されたパラメータに対して動的に作成され、クエリ結果データの GeoJSON 表現を返します。 1つの機能/地物 のみが返されている必要があります:必要に応じて集計を使用します。上記の例では、format``メソッドを使用してクエリテキストを設定し、関数 ``query_to_geojson を使用してこのクエリの GeoJSON を返します。‎

  • ‎PostgreSQL IF THEN ELSIF ELSE``句を使用して、すべてのパラメータ(アクション名、ソースデータスキーマとテーブル名、地物ID、QGISレイヤー名)を使用して、(複数の)アクションに適切なクエリを作成することができます。JSON 設定ファイルのプロパティの一部と QGIS レイヤーのいくつかのプロパティを含む例の ``parameters 変数の内容を参照してください。‎

    • ‎**action name** action_name、例えば``buffer_500`` など、文字、数字、``_``を含む単純な単語を使用する必要があります。‎

    • ‎QGIS レイヤー名 (QGISの凡例のように):layer_name、例えば``ポイント``

    • ‎このレイヤーの PostgreSQL テーブル スキーマ ``layer_schema``と テーブル名 ``layer_table``‎

    • ‎オブジェクト feature id feature_id は,‎‎地物情報の 主キー です。‎

    • ‎JSON 設定ファイルで指定されたその他の プロパティー は``options`` プロパティにあります。‎‎例では``buffer_size``、``500``など‎

  • ‎``IF ELSE``は アクション名 をチェックすることによって、datasource 変数に組み込まれた別のクエリを実行するために使用されます。‎

  • ‎上記の例のように、戻りデータに message フィールドが含まれている場合、このフィールドに含まれるテキストは吹き出しの **mapに表示**されます。‎

  • ‎関数によって返される geometry**は、 **マップ上に表示 されます‎

  • ‎GeoJSON を返す前に、関数を使用してデータベース内の データを編集 することができます。これを行うには、IMMUTABLE プロパティパー VOLATILE を置き換える必要があります。 注意して使用してください !‎

Since Lizmap Web Client triggers an event actionResultReceived any time the user clicks on an action button, and data is returned (in the same time as the result geometry is drawn on the map), you could use your own Javascript code to add some logic after the result is shown.

参考

‎章‎ ‎javaスクリプトの追加‎

‎たとえば、ここでは、コンテンツが受信したブラウザコンソールに書き込みます。‎

lizMap.events.on({

    actionResultReceived: function(e) {
        // QGIS Layer id
        var layerId = e.layerId;
        console.log('Layer ID = ' + layerId);
        // Feature ID, which means the value of the primary key field
        var featureId = e.featureId;
        console.log('Feature ID = ' + featureId);
        // Action item with its name and other properties: name, title, options, styles, etc.
        var action = e.action;
        console.log('Action properties = ');
        console.log(action);
        // Features returned by the action
        var features = e.features;
        console.log('Returned object = ');
        console.log(features);
    }
});

‎これらのデータは、JS コードで自由に使用できます。‎