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 Thu 03 December 2009 12:40

imenisg
Participant occasionnel
Date d'inscription: 9 Oct 2009
Messages: 10

distance

salut
je veux faire une fonction dans postgresql je veux calcule le distance entre deux points l une est dans le colonne posit et l'autre je lui donner mais ça n'as pas marcher

Code:

DECLARE

req text;
ste RECORD;
ff POINT;  

BEGIN

ff=GeometryFromText('POINT(191232 243118)',-1);

  req := 'SELECT * FROM deplaceee where Distance(posit,'||ff||')=0';
  --||ff||')=0 ';
  
   EXECUTE req INTO ste ;
 
   
    RETURN ste.hhh ;

 END;

resultat
invalid input syntax for type point: "010100000000000000005807410000000070AD0D41"

merci d'avance
imen

Dernière modification par imenisg (Thu 03 December 2009 12:42)

Hors ligne

 

#2 Thu 03 December 2009 14:21

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

Re: distance

imenisg a écrit:

salut
je veux faire une fonction dans postgresql je veux calcule le distance entre deux points l une est dans le colonne posit et l'autre je lui donner mais ça n'as pas marcher

Code:

DECLARE

req text;
ste RECORD;
ff POINT;  

BEGIN

ff=GeometryFromText('POINT(191232 243118)',-1);

  req := 'SELECT * FROM deplaceee where Distance(posit,'||ff||')=0';
  --||ff||')=0 ';
  
   EXECUTE req INTO ste ;
 
   
    RETURN ste.hhh ;

 END;

resultat
invalid input syntax for type point: "010100000000000000005807410000000070AD0D41"

merci d'avance
imen


Bonjour
La fonction distance prend deux geometries, pas du texte.
Il faut soit caster le point (sous forme de texte) en geometry, soit
utiliser une fonction pgis pour convertir un point en geometry:


'POINT (x y)'::geometry
ou
geomfromwkt('POINT (x y)');

Il faudra aussi faire attention au SRID des geometries utilisées dans la requete (setsrid ou ewkt pour construire une geometrie avec SRID different de -1)

(dans le code, vous faites  ff='POINT(191232 243118)'; Si vous voulez affecter a la variable ff le point, il faut utiliser :=, pas =

Nicolas

Hors ligne

 

#3 Thu 03 December 2009 14:37

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

Re: distance

imenisg a écrit:

salut
je veux faire une fonction dans postgresql je veux calcule le distance entre deux points l une est dans le colonne posit et l'autre je lui donner mais ça n'as pas marcher

Code:

DECLARE

req text;
ste RECORD;
ff POINT;  

BEGIN

ff=GeometryFromText('POINT(191232 243118)',-1);

  req := 'SELECT * FROM deplaceee where Distance(posit,'||ff||')=0';
  --||ff||')=0 ';
  
   EXECUTE req INTO ste ;
 
   
    RETURN ste.hhh ;

 END;

resultat
invalid input syntax for type point: "010100000000000000005807410000000070AD0D41"

merci d'avance
imen


Et egalement, la syntaxe de la requete n'est pas bonne: il ne faut pas concatener ff a la requete, mais l'utiliser directement dans la requete: distance(posit, ff)
Ou mieux utiliser la commande EXECUTE

une bonne introduction a plpgsql se trouve dans l'aide de PG:
http://www.postgresql.org/docs/8.4/static/plpgsql.html

Nico

Hors ligne

 

#4 Thu 03 December 2009 17:06

vincentp
Participant actif
Lieu: Drôme
Date d'inscription: 18 Jul 2006
Messages: 128
Site web

Re: distance

Nicolas Ribot a écrit:

(dans le code, vous faites  ff='POINT(191232 243118)'; Si vous voulez affecter a la variable ff le point, il faut utiliser :=, pas =


A noter juste pour que tout soit clair, que le symbole "=" dans pl/pgsql fonctionne pour faire une affectation, mais ce n'est pas documenté, et c'est surtout fortement déconseillé car il entre souvent en conflit avec la fonction de comparaison d'égalité.
Donc Nicolas a bien raison, pour une affectation il faut utiliser ":=".
vincent

Hors ligne

 

#5 Thu 03 December 2009 17:37

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

Re: distance

vincentp a écrit:
Nicolas Ribot a écrit:

(dans le code, vous faites  ff='POINT(191232 243118)'; Si vous voulez affecter a la variable ff le point, il faut utiliser :=, pas =


A noter juste pour que tout soit clair, que le symbole "=" dans pl/pgsql fonctionne pour faire une affectation, mais ce n'est pas documenté, et c'est surtout fortement déconseillé car il entre souvent en conflit avec la fonction de comparaison d'égalité.
Donc Nicolas a bien raison, pour une affectation il faut utiliser ":=".
vincent


Ah, merci pour cette precision, je ne savais pas.
je me souviens juste m'etre arraché les cheveux sur les erreurs plpgsql a cause de ces affectations.

Nico

Hors ligne

 

Pied de page des forums

Powered by FluxBB