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í:
V databázi PostgreSQL můžete vytvořit tabulku nebo pohled
lizmap_search
, ve kterém budou uložena vyhledávací data pro všechny projekty Lizmap.
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 Cloud , 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.

Debug client side
Visit a map where you have enabled
lizmap_search
.By pressing F12 in your web-browser, you can see HTTP requests made in the Network tab.
Clear all HTTP requests, not required, but it will be easier.
When pressing Enter in the search box after you have written some text, there should be an HTTP request targeting
index.php/lizmap/searchFts/get?
which get fired.Right-click to open it in a new tab and edit the HTTP request by adding
&debug=true
at the end.You can see the SQL query generated in your
.
In case of error, think to check your logs.