Requête spatiale
Dans les options de carte, vous pouvez configurer les recherches d’adresses basées sur des services web externes (nominatim, google, IGN France). Lire Options de carte. De plus, vous pouvez ajouter des moyens de recherche spatiale à Lizmap. Cela signifie que vous autoriserez les utilisateurs à effectuer des recherches avec des données spatiales, telles que les pays, les points d’intérêts, etc. Vous avez 2 manières pour ajouter des moyens de recherche dans Lizmap :
Pour QGIS 2 et QGIS 3, depuis |lizmap_3_2|, vous pouvez créer une table ou une vue
lizmap_search
dans votre base de données PostgreSQL pour stocker les données de recherche de vos projets Lizmap.Pour QGIS 2 seulement, vous pouvez utiliser l’extension
QuickFinder
pour configurer les données de recherche par projet QGIS.
Recherche PostgreSQL
Lorsque vous avez de nombreux projets et données, la meilleure solution pour fournir des capacités de recherche est de mettre en place une relation dédiée (table ou vue) dans votre base de données. Il est possible d’utiliser une base de données PostgreSQL pour stocker les données de recherche.
Pré-requis
Une base de données PostgreSQL, accessible depuis Lizmap Web Client.
PostgreSQL avec les extensions activées :
unaccent
etpg_trgm
(pour des requêtes LIKE efficaces)A custom function
f_unaccent
which can be used in an index. See this Stack Overflow post for explanation
-- 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;
Note
Nous avons choisi d’utiliser l’extension pg_trgm et sa fonction habituelle f_unaccent plutôt que l’outil de PostgreSQL de recherche plein texte (FTS), pour garder l’outil aussi simple que possible et éviter de devoir créer des vecteurs FTS pour votre recherche de données.
Créer la table de recherche Lizmap ou la vue
L’administrateur de la base de données doit créer une table, vue ou vue matérialisée nommée « lizmap_search ». Cette relation doit être accessible dans le search_path (vous pouvez la mettre dans le schéma public, ou configurer la variable search_path pour la base de données ou l’utilisateur qui se connecte à la base de données).
La relation lizmap_search
doit contenir les colonnes suivantes :
« item_layer » (texte). Nom de la couche. Par exemple, « Pays »
item_label
(text). Label to display the results, which is the data to search among. Ex: « France » or « John Doe - Australia ». You can build it from a concatenation of several fields values.item_project
(text). List of Lizmap projects separated by commas. Optionnal. When set, the search will be done only for the specified Lizmap projectsitem_filter
(text). Username or group name. When given, the results will be filtered by authenticated user login and groups. For example, “admins”geom
(géométrie). Nous conseillons de stocker toutes les géométries avec le même SRID.
Voici un exemple de code SQL que vous pouvez utiliser, pour ajouter des données issues de deux tables spatiales différentes dans la recherche lizmap (ici en tant que vue matérialisée pour faciliter une maintenance ultérieure)
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
;
Optimisation
Vous devriez utiliser une table, ou une vue matérialisée sur laquelle vous pouvez ajouter des index pour accélérer les requêtes de recherche.
Nous vous conseillons vivement d’ajouter un index trigramme sur le champ non accentué
item_label
, pour accélérer la requête de recherche :
-- 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;
Avertissement
Actuellement, la recherche Lizmap PostgreSQL ne peut pas utiliser les géométries 3D, ou les géométries avec des valeurs Z ou M. Vous devez utiliser la fonction ST_Force2D(geom)
pour convertir les géométries en géométries 2D.
Configurer l’accès
Une fois que cette table (ou vue ou vue matérialisée) est créée dans votre base de données, vous devez vérifier que Lizmap a un accès en lecture dessus.
Si votre instance de Lizmap utilise PostgreSQL pour stocker les utilisateurs, groupes et droits, un profil de connexion existe déjà pour votre base de données. Vous pouvez alors simplement ajouter la relation lizmap_search
dans cette base de données (dans le schéma public
).
If not, or if you need to put the search data in another database (or connect with another PostgreSQL user), you need to add a new database connection profile in Lizmap configuration file lizmap/var/config/profiles.ini.php
.
The new profile is a new jdb prefixed section, called jdb:search. For example, add the following section (please replace the DATABASE_
variables by the correct values):
[jdb:search]
driver="pgsql"
database=DATABASE_NAME
host=DATABASE_HOST
user=DATABASE_USER
password=DATABASE_PASSWORD
; search_path=DATABASE_SCHEMA_WITH_LIZMAP_SEARCH,public
Vous n’avez pas besoin de configurer l’outil localiser par couche. Le lien avec Lizmap Web Client se fait automatiquement si vous pouvez exécuter la requête ci-dessous avec succès dans PgAdmin en utilisant les mêmes informations d’identification que l’application Lizmap. Vous ne devez pas spécifier le schéma où se trouve la table lizmap_search. Elle doit fonctionner sans spécifier le schéma.
SELECT * FROM lizmap_search LIMIT 1;
Vous pouvez maintenant utiliser la barre de recherche par défaut dans Lizmap qui se trouve dans le coin supérieur droit.
Extension QuickFinder
Avertissement
Ceci est pour QGIS 2 seulement. Cette extension n’est pas disponible sur QGIS 3.
Le but de cette extension est de fournir une recherche rapide au sein d’un grand volumes de données, en réalisant des recherches dans un fichier qtfs généré par QGIS Bureautique.
Pré-requis
Vous devez avoir installé a minima la version « 7.x » de « PHP » sur votre serveur Lizmap.
Configuration
Depuis QGIS :
installer l’extension
QuickFinder
, pour QGIS 2 seulementchoisissez une ou plusieurs couches, définissez les champs parmi lesquels effectuer la recherche, choisissez le format de stockage de la géométrie (WKT ou Extent) et stockez le vecteur Full Text Searchs (FTS) dans un fichier base de données (.qfts). Le nom de fichier doit être identique au nom de fichier du projet QGIS. Ex :
myproject.qfts
pour un projet QGIS stocké sousmyproject.qgs
.
Avertissement
Seuls les formats WKT ou Extent pour le stockage des géométries fonctionne, car le format binaire (WKB) ne peut pas être décodé par LWC.
Dans Lizmap Web Client:
placez le fichier de base de données à côté du projet QGIS, utilisez l’outil de recherche (champs de saisie) et effectuez un zoom sur la fonction choisie.