Prostorové vyhledávání
V možnostech mapy můžete aktivovat a nakonfigurovat panel pro vyhledávání adres na základě externích webových služeb (nominatim, google nebo francouzské IGN). Viz Možnosti mapy - Obecné možnosti mapy . Kromě toho můžete do aplikace Lizmap přidat možnost prostorového vyhledávání. To znamená, že uživatelům umožníte vyhledávat v rámci prostorových dat, jako jsou země, body zájmu atd. Máte dva způsoby, jak do Lizmap přidat možnost vyhledávání:
You can create a table or view
lizmap_search
in your PostgreSQL database to store the search data for all your Lizmap projects.
Hledání v PostgreSQL
Pokud máte mnoho projektů a dat, je nejlepším řešením, jak zajistit možnost vyhledávání, vytvořit v databázi speciální relaci (tabulku nebo zobrazení). K ukládání dat pro vyhledávání je možné použít databázi PostgreSQL.
Předpoklady
Databáze PostgreSQL přístupná z webového klienta Lizmap.
Rozšíření PostgreSQL aktivovaná v této databázi:
unaccent
apg_trgm
(pro efektivní dotazy LIKE).Vlastní funkce
f_unaccent
, kterou lze použít v indexu. Vysvětlení naleznete v tomto příspěvku Stack Overflow.
-- 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;
Poznámka
Rozhodli jsme se použít rozšíření pg_trgm
a tuto vlastní funkci f_unaccent
místo nástroje Full Text Search (FTS) v PostgreSQL, aby byl nástroj co nejjednodušší a nebylo nutné vytvářet „vektory“ FTS v datech pro vyhledávání.
Tip
Pokud je instance hostována na lizmap.com, přečtěte si dokumentaci o jednom kroku na lizmap_search.
Vytvoření tabulky nebo zobrazení lizmap_search
Správce databáze musí vytvořit tabulku, pohled nebo materializovaný pohled s názvem lizmap_search
. Tento vztah musí být přístupný v search_path
(můžete jej umístit do veřejného schématu nebo nastavit proměnnou search_path
pro databázi nebo uživatele, který se k databázi připojuje).
Vztah lizmap_search
musí obsahovat následující sloupce:
item_layer
(text). Název vrstvy. Například „Země“item_label
(text). Popisek pro zobrazení výsledků, což jsou data, mezi kterými se má vyhledávat. Například: „France“ nebo „John Doe - Australia“. Můžete jej sestavit z konkatenace hodnot několika polí.item_project
(text). Seznam projektů Lizmap oddělených čárkami. Je-li nastaveno, bude vyhledávání probíhat pouze v zadaných projektech Lizmap. Hodnota může býtNULL
, pokud nechcete filtrovat podle jednotlivých projektů.item_filter
(text). Uživatelské jméno nebo název skupiny. Pokud je zadán, budou výsledky filtrovány podle přihlašovacích jmen ověřených uživatelů a skupin. Například admins. Hodnota může býtNULL
, pokud nechcete filtrovat podle uživatelů.geom
(geometrie). Doporučujeme ukládat všechny geometrie se stejným SRID.
Zde je příklad kódu SQL, který můžete použít k přidání dat ze dvou různých prostorových tabulek do lizmap_search (zde jako materializovaný pohled pro usnadnění další údržby).
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
;
Optimalizace
Měli byste použít tabulku nebo materializovaný pohled, ke kterému můžete přidat indexy, abyste urychlili vyhledávací dotazy.
Důrazně doporučujeme přidat trigramový index na pole
item_label
bez příznaku, abyste urychlili vyhledávací dotaz:
-- 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;
Varování
V současné době vyhledávání v Lizmap PostgreSQL nemůže používat 3D geometrie nebo geometrie s hodnotami Z nebo M. Pro převod geometrií na 2D geometrie je nutné použít funkci ST_Force2D(geom)
.
Konfigurace přístupu
Jakmile je tato tabulka (nebo pohled či materializovaný pohled) v databázi vytvořena, je třeba zkontrolovat, zda k ní má Lizmap přístup pro čtení.
Pokud vaše instance Lizmap používá k ukládání uživatelů, skupin a práv PostgreSQL, profil připojení pro vaši databázi již existuje. Pak stačí přidat relaci lizmap_search
uvnitř této databáze (ve schématu public
).
Pokud tomu tak není, nebo pokud potřebujete umístit vyhledávací data do jiné databáze (nebo se připojit s jiným uživatelem PostgreSQL), musíte přidat nový profil připojení k databázi v konfiguračním souboru Lizmap lizmap/var/config/profiles.ini.php
. Tento nový profil představuje novou sekci s předponou jdb, nazvanou jdb:search. Přidejte například následující sekci (proměnné DATABASE_
nahraďte správnými hodnotami):
[jdb:search]
driver="pgsql"
database=DATABASE_NAME
host=DATABASE_HOST
user=DATABASE_USER
password=DATABASE_PASSWORD
; search_path=DATABASE_SCHEMA_WITH_LIZMAP_SEARCH,public
Nástroj locate by layer nemusíte konfigurovat. Propojení s webovým klientem Lizmap se provede automaticky, pokud se vám podaří úspěšně spustit níže uvedený dotaz v aplikaci PgAdmin pomocí stejných přihlašovacích údajů jako v aplikaci Lizmap. Nemusíte určovat schéma, ve kterém se nachází tabulka lizmap_search. Musí** fungovat i bez zadání schématu.
SELECT * FROM lizmap_search LIMIT 1;
Nyní můžete použít výchozí vyhledávací panel v aplikaci Lizmap, který se nachází v pravém horním rohu.