Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je vais donc explorer cette nouvelle piste.
Merci encore pour votre aide.
Bonne journée.
Pas de problème, je vais donc explorer cette voie.
Merci beaucoup pour votre aide.
Bonne fin de journée
Ces informations sont donc stockées dans Postgresql mais non requêtables via PgAdmin ?
Il est donc impossible via PgAmin de connaître la liste des tables postgis appelées dans un projet qgis ?
Merci d'avance pour votre réponse
Bonjour à tous et toutes,
J'ai découvert récemment qu'il était possible, sans QGIS, d'enregistrer un projet .qgs non pas sur un espace serveur classique mais directement sur Postgresql (Dans Qgis 3.16 = Projet\Enregistrer sous\Postgresql...).
Je souhaitais donc interroger les informations relatives au paramétrage de mes couches qgis dans PgAdmin4 (essentiellement pour connaître les couches postgis appelées dans ce projet qgs) mais ces informations sont stockées dans un champ "content"au format bytea, illisible au 1er abord.
En parcourant les forums et sites officiels tels que ceux-ci :
https://www.postgresql.org/docs/9.1/fun … tring.html
https://dba.stackexchange.com/questions … n-postgres
J'ai découvert qu'il fallait utiliser des fonctions d'encodage et/ou de décodage en m'appuyant sur des formats de type base64, hex ou escape pour traduire ces données bytea en informations intelligibles.
Cependant après plusieurs tests de ce type dans pgAdmin, je n'obtiens aucun résultat probant :
select *,
encode(content,'hex') tt
from admingeo.qgis_projects
SELECT convert_from(decode(t, 'escape'), 'UTF8')
FROM encode((select content from admingeo.qgis_projects), 'escape') as tt
L'un ou l'une d'entre vous aurait-il (-elle) une idée me permettant de traduire le contenu de ce champ en informations intelligibles ?
Merci d'avance pour votre aide
Super, ca fonctionne parfaitement ! Merci beaucoup (je vous dois une fière chandelle).
Je vais enfin pouvoir créer des fonctions plus intelligentes et optimisées !
Bon week-end à vous
Merci beaucoup pour votre aide
Je ne maîtrise pas du tout les requêtes dynamiques, désolé.
J'ai modifié ma requête ainsi :
(...)
EXECUTE format('SELECT count(*) FROM %I.%I as x
WHERE ST_Intersects(x.geom, NEW.geom)
AND x.id != NEW.id AND ST_overlaps(x.geom, NEW.geom)',
TG_TABLE_SCHEMA, TG_TABLE_NAME) INTO c;
(...)
et j'obtiens ce message d'erreur dans QGIS :
" ERREUR: entrée manquante de la clause FROM pour la table « new » "
Je suppose qu'il ne reconnait plus cette syntaxe à l'intérieur de la requête dynamique mais je ne sais pas comment désigner autrement la géométrie et l'id du dernier objet saisi...
Auriez-vous une idée ?
Merci d'avance pour votre aide.
Bonjour à tous et tous,
J'essaie sous Postgresql de créer une contrainte de vérification de la topologie d'objets insérés sur une table test.topo1 (pour empêcher la saisie sous QGIS d'objets se chevauchant).
Pour faire cela, j'ajoute un trigger sur cette table et je créé une fonction déclencheur. Ce qui donne ceci :
CREATE OR REPLACE FUNCTION admingeo.overlapping_parcel_trigger()
RETURNS trigger AS
$$
DECLARE
c bigint;
BEGIN
SELECT count(*)
INTO c
FROM test.topo1 t1
WHERE ST_Intersects(t1.geom, NEW.geom)
AND t1.id != NEW.id
AND ST_Relate(t1.geom, NEW.geom, '2********');
IF c > 0 THEN
RAISE EXCEPTION 'l''objet % empiète sur un autre objet', NEW.id;
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
CREATE CONSTRAINT TRIGGER verif_topo
AFTER INSERT OR UPDATE ON test.topo1
FOR EACH ROW EXECUTE FUNCTION admingeo.overlapping_parcel_trigger();
Cette procédure fonctionne parfaitement mais je dois rentrer en dur le nom de la table sur lequel est posé mon trigger, ce qui n'est pas du tout optimal.
J'ai donc essayé d'introduire TG_TABLE_SCHEMA et TG_TABLE_NAME mais sans aucun succès après des dizaines de tentatives.
L'un de vous aurait-il une solution à mon problème svp ?
Merci d'avance pour votre aide.
Voici le code de ma dernière tentative :
CREATE or replace FUNCTION admingeo.overlapping_parcel_trigger()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
c bigint;
t1 text;
BEGIN
EXECUTE format('select (schemaname::text||''.''||tablename::text)::regclass t from pg_tables where schemaname=%I and tablename=%I',TG_TABLE_SCHEMA,TG_TABLE_NAME) INTO t1;
SELECT Count(*)
INTO c
FROM t1
WHERE ST_Intersects(t1.geom, NEW.geom)
AND t1.id != NEW.id
AND ST_overlaps(t1.geom, NEW.geom);
IF c > 0 THEN
RAISE EXCEPTION 'l''objet % empiète sur un autre objet', NEW.id;
END IF;
RETURN NEW;
END;
$BODY$;
Merci.
Pages : 1