Actions#
Nous allons créer une action permettant de connaitre la distance entre un logement et la borne incendie la plus proche. Nous nous réfererons à la documentation pour la création d'actions.
SQL#
Commençons par créer une table de bornes incendie :
1 2 3 4 5 6 7 8 |
|
Propriétés du projet#
- Charger la couche
bornes_incendie
dans le projet QGIS - Ajouter, en édition, plusieurs points représentant des bornes incendie sur la carte
- Rendre visible cette couche à l'ouverture de Lizmap
- Activer les popups pour cette couche
Exercice#
En vous inspirant de la documenation, créer le SQL ainsi que le JSON de l'action. Celle-ci doit :
- Ajouter un bouton dans la popup des entités des logements
- Au clique, afficher le message "La plus proche borne a pour id
%1
et est à%2
m", où%1
est l'identifant de la borne et%2
la distance en mètre - Au clique, afficher une droite entre le logement et la borne incendie la plus proche et zoomer dessus
Solution#
SQL de l'action
- Ajoute la fonction
query_to_geojson
disponible ici. - Puis créer la fonction
lizmap_get_data
.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
SET SEARCH_PATH = z_formation; -- Create a query depending on the action, layer and feature and returns a GeoJSON. CREATE OR REPLACE FUNCTION lizmap_get_data(parameters json) RETURNS json AS $$ DECLARE feature_id varchar; layer_name text; layer_table text; layer_schema text; action_name text; sqltext text; datasource text; ajson json; BEGIN action_name:= parameters->>'action_name'; feature_id:= (parameters->>'feature_id')::varchar; layer_name:= parameters->>'layer_name'; layer_schema:= parameters->>'layer_schema'; layer_table:= parameters->>'layer_table'; IF action_name = 'plus_proche_borne_incendie' THEN -- Dessine une ligne jusqu'à la plus proche borne à incendie datasource:= format(' WITH tmp_logement AS ( SELECT geom FROM logement WHERE id = ''%1$s'' ) SELECT id, ST_Distance(bornes_incendie.geom, logement.geom), ''La plus proche borne a pour id '' || bornes_incendie.id || '' et est à '' || ST_Distance(bornes_incendie.geom, logement.geom)::integer || ''m'' AS message, ST_MakeLine(logement.geom, bornes_incendie.geom) AS geom, bornes_incendie.id AS borne_id FROM bornes_incendie, tmp_logement logement ORDER BY ST_Distance(bornes_incendie.geom, logement.geom) LIMIT 1 ', feature_id ); ELSE -- Default : return geometry datasource:= format(' SELECT %1$s AS id, ''The geometry of the object have been displayed in the map'' AS message geom FROM "%2$s"."%3$s" WHERE id = %1$s ', feature_id, layer_schema, layer_table ); END IF; SELECT query_to_geojson(datasource) INTO ajson ; RETURN ajson; END; $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT; COMMENT ON FUNCTION lizmap_get_data(json) IS 'Generate a valid GeoJSON from an action described by a name, PostgreSQL schema and table name of the source data, a QGIS layer name, a feature id and additional options.';
JSON de l'action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|