Pages: 1
- Sujet précédent - créer fonction/trigger de MàJ en fonction du plus proche voisin - Sujet suivant
#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
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
Pages: 1
- Sujet précédent - créer fonction/trigger de MàJ en fonction du plus proche voisin - Sujet suivant