空間検索
マップオプションでは、外部のWebサービス(nominatim, google or french IGN)に基づいて、アドレス検索バーを有効にして設定できます。参照してください Map options — The general options of the map さらに、Lizmap に空間検索機能を追加できます。つまり、ユーザーは、国や関心のあるポイントなどの空間データ内で検索できます。Lizmap で検索機能を追加するには、次の 2 つの方法があります。
You can create a table or view
lizmap_search
in your PostgreSQL database to store the search data for all your Lizmap projects.
PostgreSQL検索
プロジェクトやデータが多数ある場合、検索機能を提供する最善のソリューションは、データベース内に専用のリレーションシップ (テーブルまたはビュー) を設定することです。PostgreSQL データベースを使用して検索データを格納することができます。
前提条件
lizmap Web クライアントからアクセスできるのは PostgreSQL データベース。
このデータベースで有効化された PostgreSQL 拡張 :
unaccent
とpg_trgm
(効果的な LIKE クエリの場合)インデックスで使用できるカスタム関数
f_unaccent
です。詳細については、この スタックオーバーフローの投稿<https://stackoverflow.com/questions/11005036/does-postgresql-support-accent-insensitive-collations/11007216#11007216> を参照してください。
-- Add the extension pg_trgm
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Add the extension unaccent, available with PostgreSQL contrib tools. This is needed to provide searches which are not sensitive to accentuated characters.
CREATE EXTENSION IF NOT EXISTS unaccent;
-- Add the f_unaccent function to be used in the index
CREATE OR REPLACE FUNCTION public.f_unaccent(text)
RETURNS text AS
$func$
SELECT public.unaccent('public.unaccent', $1) -- schema-qualify function and dictionary
$func$ LANGUAGE sql IMMUTABLE;
注釈
PostgreSQLのフルテキスト検索(FTS)ツールの代わりに``pg_trgm``拡張子とこのカスタム``f_unaccent``機能を使用して、ツールをできるだけシンプルに保ち、検索データにFTSの''ベクトル''を作成する必要を避けます。
Tip
If the instance is hosted on lizmap.com, read the documentation about one step on lizmap_search.
lizmap_searchテーブルまたはビューを作成する
データベース管理者は、``lizmap_search``というテーブル、ビュー、またはマテリアライズビューを作成する必要があります。このリレーションは``search_path``でアクセス可能でなければなりません(パブリックスキーマに配置するか、データベースまたはデータベースに接続するユーザーの``search_path``変数を設定することができます)。
リレーション ``lizmap_search``は、次の列を含める必要があります。
``item_layer``(テキスト)。レイヤーの名前。たとえば「Countries」の場合
``item_label``(テキスト)。検索結果を表示するラベル、検索するデータ。例:"France"または"John Doe - Australia"。複数のフィールド値を連結して構築できます。
item_project`` (テキスト). Lizmapプロジェクトをカンマで区切ってリストアップする。設定すると、指定したLizmapのプロジェクトのみを検索対象とする。プロジェクト単位でフィルタリングを行わない場合は、この値を
NULL
にすることができます。item_filter`` (テキスト). ユーザー名またはグループ名。指定すると、認証されたユーザーのログイン名とグループ名でフィルタリングされた結果が得られる。例えば、'admins' といった具合である。ユーザーごとにフィルタリングしたくない場合は、値を
NULL
にすることができる。``geom``(ジオメトリ)。すべてのジオメトリを同じ SRID で格納することをお勧めします。
ここでは、2 つの異なる空間テーブルのデータをlizmap_searchに追加する SQL コードの例を示します (ここでは、さらにメンテナンスを容易にするマテリアライズド ビューとして)
DROP MATERIALIZED VIEW IF EXISTS lizmap_search;
CREATE MATERIALIZED VIEW lizmap_search AS
SELECT
'Commune' AS item_layer, -- name of the layer presented to the user
concat(idu, ' - ', tex2) AS item_label, -- the search label is a concatenation between the 'Commune' code (idu) and its name (tex2)
NULL AS item_filter, -- the data will be searchable for every Lizmap user
NULL AS item_project, -- the data will be searchable for every Lizmap maps (published QGIS projects)
geom -- geometry of the 'Commune'. You could also use a simplified version, for example: ST_Envelope(geom) AS geom
FROM cadastre.geo_commune
UNION ALL -- combine the data between the 'Commune' (above) and the 'Parcelles' (below) tables
SELECT
'Parcelles' AS item_layer,
concat(code, ' - ', proprietaire) AS item_label,
'admins' AS item_filter, -- only users in the admins Lizmap group will be able to search among the 'Parcelles'
'cadastre,urban' AS item_project, -- the Parcelles will be available in search only for the cadastre.qgs and urban.qgs QGIS projects
geom
FROM cadastre.parcelle_info
;
最適化
検索クエリを高速化するためにインデックスを追加できるテーブルまたはマテリアライズドビューを使用する必要があります。
検索クエリを高速化するために、非アクセントの
item_label
フィールドにトリグラム インデックスを追加することを強くお勧めします。
-- Create the index on the unaccentuated item_label column:
DROP INDEX IF EXISTS lizmap_search_idx;
CREATE INDEX lizmap_search_idx ON lizmap_search USING GIN (f_unaccent(item_label) gin_trgm_ops);
-- You can refresh the materialized view at any time (for example in a cron job) with:
REFRESH MATERIALIZED VIEW lizmap_search;
警告
現在、lizmap PostgreSQL 検索では、3D ジオメトリ、または Z または M 値を持つジオメトリを使用できません。ジオメトリを 2D ジオメトリに変換するには``ST_Force2D(geom)``関数を使用する必要があります。
アクセスの設定
このテーブル (またはビュー、またはマテリアライズド ビュー) がデータベースに作成されたら、Lizmap が読み取りアクセス権を持つことができることを確認する必要があります。
Lizmap インスタンスが PostgreSQL を使用してユーザー、グループ、および権限を保存している場合、データベースに対して接続プロファイルが既に存在します。次に、このデータベース内に lizmap_search
リレーションシップを追加するだけです (public
スキーマ)。
そうでなければ、または別のデータベースに検索データを配置する必要がある場合(または別のPostgreSQLユーザーと接続する場合)、Lizmap設定ファイルに新しい データベース接続プロファイル を追加する必要があります lizmap/var/config/profiles.ini.php
新しいプロファイルは、 jdb:search と呼ばれる新しい jdb 接頭辞セクションです。たとえば、次のセクションを追加します (DATABASE_
変数を正しい値に置き換えてください)。
[jdb:search]
driver="pgsql"
database=DATABASE_NAME
host=DATABASE_HOST
user=DATABASE_USER
password=DATABASE_PASSWORD
; search_path=DATABASE_SCHEMA_WITH_LIZMAP_SEARCH,public
:guilabel:` レイヤーでの位置指定 ` ツールを設定する 必要はありません 。以下のクエリを PgAdmin で、Lizmap アプリケーションと同じ資格情報を使用して正常に実行できる場合、Lizmap Web Clientとのリンクは自動的に実行されます。lizmap_searchテーブルが配置されているスキーマを指定する 必要 があります。スキーマを指定せずに動作する必要があります。
SELECT * FROM lizmap_search LIMIT 1;
右上にあるLizmapのデフォルトの検索バーを使用できるようになりました。