Ricerca spaziale
Nelle opzioni della mappa, puoi attivare e configurare la barra di ricerca degli indirizzi, basata su servizi web esterni (nominatim, google o IGN francese). Vedere Map options — The general options of the map . Inoltre, è possibile aggiungere la capacità di ricerca spaziale a Lizmap. Questo significa che permetterete agli utenti di cercare all’interno dei dati spaziali, come paesi, punti di interesse, ecc. Ci sono due modi per aggiungere capacità di ricerca in Lizmap:
You can create a table or view
lizmap_search
in your PostgreSQL database to store the search data for all your Lizmap projects.
Ricerca PostgreSQL
Quando si hanno molti progetti e dati, la soluzione migliore per fornire capacità di ricerca è quella di impostare una relazione dedicata (tabella o vista) all’interno del database. È possibile utilizzare un database PostgreSQL per memorizzare i dati di ricerca.
Prerequisiti
Un database PostgreSQL, accessibile da Lizmap Web Client.
Estensioni PostgreSQL attivate in questo database:
unaccent
epg_trgm
(per query LIKE efficaci)Una funzione personalizzata
f_unaccent
che può essere usata in un indice. Vedere questo post di Stack Overflow per la spiegazione
-- 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;
Nota
Abbiamo scelto di usare l’estensione pg_trgm
e questa funzione personalizzata f_unaccent
invece dello strumento Full Text Search (FTS) di PostgreSQL, per mantenere lo strumento il più semplice possibile ed evitare la necessità di creare «vettori» FTS nei dati di ricerca.
Suggerimento
If the instance is hosted on Lizmap Cloud , read the documentation about one step on lizmap_search.
Creare la tabella o la vista lizmap_search
L’amministratore del database deve creare una tabella, una vista o una vista materializzata chiamata lizmap_search
. Questa relazione deve essere accessibile nel search_path
(puoi metterla nello schema pubblico, o configurare la variabile search_path
per il database o l’utente che si connette al database).
La relazione lizmap_search
deve contenere le seguenti colonne:
item_layer
(text). Nome del livello. Per esempio «Countries»item_label
(text). Etichetta per visualizzare i risultati, ovvero i dati tra cui cercare. Es: «Francia» o «John Doe - Australia». Puoi costruirla da una concatenazione di valori di diversi campi.item_project
(text). Elenco dei progetti Lizmap separati da virgole. Se impostata, la ricerca verrà effettuata solo per i progetti Lizmap specificati. Il valore può essereNULL
se non vuoi filtrare per progetto.item_filter
(text). Nome utente o nome del gruppo. Quando forniti, i risultati verranno filtrati per login e gruppi di utenti autenticati. Ad esempio, «admins». Il valore può essereNULL
se non si desidera filtrare per utente.geom
(geometry). Si consiglia di memorizzare tutte le geometrie con lo stesso SRID.
Ecco un esempio di codice SQL che puoi usare per aggiungere dati da due diverse tabelle spaziali in lizmap_search (qui come vista materializzata per facilitare ulteriore manutenzione)
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
;
Ottimizzazione
Dovresti usare una tabella, o una vista materializzata, su cui puoi aggiungere degli indici per accelerare le query di ricerca.
Ti consigliamo vivamente di aggiungere un indice trigramma sul campo
item_label
non accentuato, per accelerare la query di ricerca:
-- 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;
Avvertimento
Al momento, la ricerca Lizmap PostgreSQL non può usare geometrie 3D, o geometrie con valori Z o M. Devi usare la funzione ST_Force2D(geom)
per convertire le geometrie in geometrie 2D.
Configurare l’accesso
Una volta che questa tabella (o vista, o vista materializzata) è creata nel vostro database, dovete controllare che Lizmap possa avere un accesso in lettura su di essa.
Se la vostra istanza di Lizmap usa PostgreSQL per memorizzare utenti, gruppi e diritti, esiste già un profilo di connessione per il vostro database. Allora puoi semplicemente aggiungere la relazione lizmap_search
dentro questo database (nello schema public
).
In caso contrario, o se si ha bisogno di mettere i dati di ricerca in un altro database (o di connettersi con un altro utente PostgreSQL), è necessario aggiungere un nuovo profilo di connessione al database nel file di configurazione di Lizmap lizmap/var/config/profiles.ini.php
. Il nuovo profilo è una nuova sezione con prefisso jdb, chiamata jdb:search. Per esempio, aggiungi la seguente sezione (sostituisci le variabili DATABASE_
con i valori corretti):
[jdb:search]
driver="pgsql"
database=DATABASE_NAME
host=DATABASE_HOST
user=DATABASE_USER
password=DATABASE_PASSWORD
; search_path=DATABASE_SCHEMA_WITH_LIZMAP_SEARCH,public
Non è necessario configurare lo strumento locate by layer. Il collegamento con Lizmap Web Client è fatto automaticamente se si può eseguire con successo la query qui sotto in PgAdmin usando le stesse credenziali dell’applicazione Lizmap. Non è necessario specificare lo schema in cui si trova la tabella lizmap_search. Essa deve funzionare senza specificare lo schema.
SELECT * FROM lizmap_search LIMIT 1;
Ora puoi usare la barra di ricerca predefinita di Lizmap che si trova in alto a destra.