banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 11 February 2014 12:23

Loublande
Participant occasionnel
Date d'inscription: 29 Oct 2008
Messages: 38

créer fonction/trigger de MàJ en fonction du plus proche voisin

Bonjour,

Je souhaite  créer une fonction/trigger de mise à jour du champ d'une table de ponctuel en fonction du nom de rue de la rue la plus proche du nouveau point crée.

J'ai fait ceci (voir ci-dessous) mais, la machine me renvoit le message ci attaché en image :


Code:

CREATE OR REPLACE FUNCTION reglementation.plainte_ajout_rue()
  RETURNS trigger AS
$BODY$

BEGIN

-- on ajoute le nom de la rue du nouvel objet à partir de la table referentiel.voie si le champ nom-rue n'a pas ---été préalablement rempli    
    if new.nom_rue is null  or new.nom_rue='' or new.nom_rue='0' then
        select into new.nom_rue voie."LIB_DIRECT" from reglementation.suivi,referentiel.voie where st_distance(new.geom, voie.the_geom) order by distance LIMIT 1 ;
        return new ;
-- si le champ nom_rue est rempli, on conserve la saisie faite
    else return new;
    end if;
    
END;
 $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION reglementation.plainte_ajout_rue()
  OWNER TO postgres;


CREATE TRIGGER insert
  BEFORE  INSERT OR UPDATE
  ON reglementation.suivi
  FOR EACH ROW
  EXECUTE PROCEDURE reglementation.plainte_ajout_rue();

Je vous remercie par avance


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Tue 11 February 2014 12:48

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: créer fonction/trigger de MàJ en fonction du plus proche voisin

Bonjour,

La requete de la fonction du trigger n'est pas bonne:
la clause WHERE attend des parametres booléens, la plupart du temps, issus de tests: colonne = valeur.
"where st_distance()" n'est pas un test mais une valeur de type double précision, d'ou le message.

Pour trouver le plus proche voisin avec une distance:

Code:

select into new.nom_rue voie."LIB_DIRECT",  st_distance(new.geom, voie.the_geom)
from reglementation.suivi,referentiel.voie 
order by 2 
LIMIT 1 ;

(Le "2" dans le ORDER BY est la position de la colonne "st_distance" dans le SELECT)

Cette approche n'est pas performante, notamment si la table contient bcp d'entrées: calcul de distance sur tous les objets de la table a chaque fois.

Si vous savez que les rues se trouvent forcément a moins de x metres des points, vous pouvez rajouter une clause WHERE:

Code:

WHERE st_dwithin(new.geom, voie.the_geom, <distance>)

Sinon, pour la meilleure performance, il faut mieux utiliser le nouvel opérateur de plus proche voisin disponible dans PostGIS: KNN.
Un tuto par Maitre Paul: http://workshops.boundlessgeo.com/postg … o/knn.html
Et la doc postgis: http://postgis.net/docs/manual-2.1/geom … troid.html

Nicolas

Hors ligne

 

#3 Tue 11 February 2014 13:57

Loublande
Participant occasionnel
Date d'inscription: 29 Oct 2008
Messages: 38

Re: créer fonction/trigger de MàJ en fonction du plus proche voisin

Re bonjour,

Merci Nicolas, ça fonctionne à merveille.

Cordialement,

Hors ligne

 

Pied de page des forums

Powered by FluxBB