地物情報でのアクション‎

|lizmap_3_4|の機能です。‎

定義

‎このモジュールは、PostgreSQLクエリを起動し、マップ上に表示する ジオメトリ を返す アクションボタンを地物情報 に追加することができます。‎

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

‎ツールの設定

‎各動作には、layer、'name'、'title'、'icon'、オプションの``options``、'style'、``callbacks``が特徴です。‎

QGIS プロジェクト ファイルの名前が :file:'myproject.qgs':‎JSON 設定ファイルの例、名前 :ファイル:'myproject.qgs.action'

{
    "points_a7e8943b_7138_4788_a775_f94cbd0ad8b6": [
        {
            "name": "liztest",
            "title": "Tampon",
            "icon": "icon-leaf",
            "options": {
                "buffer_size": 5000
            },
            "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": "admin_level_8_fcfdc9e0_c9b9_4563_b803_e36f9e2eca6a"},
                {"method": "redraw", "layerId": "admin_level_8_fcfdc9e0_c9b9_4563_b803_e36f9e2eca6a"}
            ]
        }
    ]
}

‎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 参照 )‎

  • ‎'options' オブジェクトで、このアクションに追加のパラメータを与えます。‎

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

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

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

    • ‎'選択'':ジオメトリと交差する特定のレイヤーから地物を選択します。ターゲットレイヤー QGIS ID は 'layerId' プロパティに追加する必要があります‎

    • ‎'再描画':指定されたレイヤーを再描画します。ターゲットレイヤーQGIS IDは'layerId'プロパティに追加する必要があります。‎

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

‎各ボタン 対応するアクションを起動 :‎

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

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

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

作成されたクエリはLizmap Webクライアントによって構築され、 PostgreSQLデータベースに事前に作成する必要 があるPostgreSQLの関数 lizmap_get_data(json) を使用します。‎この関数は、より汎用的な関数である query_to_geojson(text) も使用します。この関数は、PostgreSQLの任意のクエリを GeoJSON出力 に変換します。以下は、上記の構成例において、ユーザーがボタンアクション liztest をクリックした際に、PostgreSQL の table test.points に対応する layer points の id 1 を持つ feature に対して、Lizmap が実行するクエリの例です。

SELECT public.lizmap_get_data('{"layer_name":"points","layer_schema":"test","layer_table":"points","feature_id":1,"action_name":"liztest","buffer_size":5000}') AS data

lizmapが必要なすべての情報を含むJSONパラメータを作成し、PostgreSQL関数''lizmap_get_data'を実行することを確認することができます。次の 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 valide GEOJSON from a given SQL 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 liztest
    -- Written here as an example
    -- Performs a buffer on the geometry
    IF action_name = 'liztest' THEN
        datasource:= format('
            SELECT
            %1$s AS id,
            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,
            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 valide 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 additionnal options.';

‎関数 ''lizmap_get_data(json)' は、例としてここに示されています。 キーエントリポイント なので、ニーズに合わせて適応させる必要があります。‎

‎PostgreSQL 'IF THEN ELSIF ELSE'句を使用して、すべてのパラメータ(アクション名、ソースデータスキーマとテーブル名、地物ID、QGISレイヤー名)を使用して、(複数の)アクションに適切なクエリを作成することができます。‎