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í:
Pro QGIS 2 a QGIS 3 můžete v databázi PostgreSQL vytvořit tabulku nebo pohled
lizmap_search
, ve kterém budou uložena vyhledávací data pro všechny projekty Lizmap.Pouze pro QGIS 2 můžete použít zásuvný modul
QuickFinder
pro konfiguraci vyhledávání dat pro projekt QGIS.
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.
Zásuvný modul QuickFinder
Varování
Toto platí pouze pro QGIS 2. Tento zásuvný modul nebyl přenesen na QGIS 3.
Účelem tohoto zásuvného modulu je zajistit rychlé vyhledávání mezi velkými datovými sadami, a to v souboru qtfs generovaném aplikací QGIS Desktop.
Předpoklady
Na serveru Lizmap musíte mít nainstalovanou alespoň verzi PHP 7.x.
Konfigurace
Uvnitř QGIS:
instalace pluginu QuickFinder, pouze pro QGIS 2
vyberte vrstvu (vrstvy), definujte pole, mezi kterými chcete vyhledávat, vyberte formát ukládání geometrie (WKT nebo Extent) a uložte vektor fulltextového vyhledávání (FTS) do databáze souborů (.qfts). Název souboru musí být totožný s názvem souboru projektu QGIS. Například:
myproject.qfts
pro projekt QGIS uložený jakomyproject.qgs
.
Varování
Fungují pouze formáty WKT nebo Extent pro ukládání geometrie, protože binární formát (WKB) nelze dekódovat pomocí LWC.
Uvnitř LWC:
vložte databázový soubor vedle projektu QGIS, použijte nástroj Hledat (vstup) a přiblížte vybraný prvek.