#1 Fri 02 February 2018 18:38
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Postgis : message d'erreur st_makepoint
Bonjour,
J'ai bien créé une colonne geom sur ma table :
Code:
ALTER TABLE public.entrants ADD COLUMN geom geometry(POINT,2154);
Je veux maintenant remplir le champ geom à partir des champs X et Y :
Code:
UPDATE public.entrants SET geom = ST_SetSRID(st_makepoint(entrants."x_resi",entrants."y_resi"),2154);
Mais j'ai ce message d'erreur :
Code:
ERROR: ERREUR: la fonction st_makepoint(character varying, character varying) n'existe pas LINE 2: UPDATE public.entrants SET geom = ST_SetSRID(st_makepoint(en... ^ HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments. Vous devez ajouter des conversions explicites de type. SQL state: 42883 Character: 114
Pouvez vous m'aider? Merci
Hors ligne
#2 Fri 02 February 2018 20:22
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Postgis : message d'erreur st_makepoint
Bonjour,
Le message d'erreur vous indique la solution :
les arguments donnés à la fonction sont de type character varying (du texte),
hors ce que celle-ci attends ce sont des nombres réels à virgule flottantes
(double precision).
Vous pouvez convertir du texte en nombre réel grâce à l'opérateur de transtypage,
ou cast : ::
Code:
st_makepoint(x_resi::double precision, y_resi::double precision)
Hors ligne
#3 Sat 03 February 2018 09:30
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgis : message d'erreur st_makepoint
Merci,
J'ai donc testé
Code:
st_makepoint(x_resi::double precision, y_resi::double precision)
mais j'avais un message d'erreur.
J'ai testé celà :
Code:
ALTER TABLE entrants ALTER COLUMN x_resi TYPE double precision USING x_resi::double precision
celà fonctionne. Je me suis assuré que le cast avait été pris en compte avec :
Code:
[SELECT pg_typeof(x_resi),pg_typeof(y_resi) from entrants limit 1;
C'est ok.Par contre, lorsque je retente de generer les points dans ma colonne geom depuis les champs X et Y, j'ai toujours un message d'erreur :
Code:
UPDATE public.entrants SET geom = (st_makepoint(x_resi,y_resi),2154); ERROR: ERREUR: la colonne « geom » est de type geometry mais l'expression est de type record LINE 1: UPDATE public.entrants SET geom = (st_makepoint(x_resi,y_res... ^ HINT: Vous devez réécrire l'expression ou lui appliquer une transformation de type.] SQL state: 42804 Character: 35
Que dois je faire? Pour info, mes champs X et Y stockent des coordonnées en lambert93, il s'agit donc de nombres entiers sans virgules. Si la fonction attend des champs en double precision, doit je donc faire une conversion des mes champs vers des degres longitude latitude (4326)?
Si vous pensez pouvoir m'aider? Je suis en pleine galère.
Dernière modification par image95 (Sat 03 February 2018 09:32)
Hors ligne
#4 Sat 03 February 2018 10:13
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Postgis : message d'erreur st_makepoint
Encore une fois le message d'erreur vous donne une indication.
Vous avez oublier d’écrire st_setstrid avant votre première parenthèse ouvrante,
et PostgreSQL l’interpréte comme si vous vouliez créer un type record avec une
définition (geometry, integer).
Hors ligne
#5 Sat 03 February 2018 12:13
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgis : message d'erreur st_makepoint
Merci à vous...pour le coup, c'était une etourderie de ma part. Celà a fonctionné. Avant d'executer, j'avais fait un cast depuis le type double precision vers bigint car mes champs x et y stockent des entiers (lambert93) et non des réels.
N'est ce pas etonnant que la fonction ait donc fonctionné bien que la doc semble stipuler qu'il faille en entrée des datatype double precision?
Hors ligne
#6 Sat 03 February 2018 13:23
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Postgis : message d'erreur st_makepoint
La fonction fonctionne car PostgreSQL a effectué ce qu'on appelle un transtypage implicite.
En effet, on ne prend aucun risque à transformer un entier vers un réel, car à chaque entier
correspond exactement un réel, la fonction de transtypage d'entier vers réel est dite injective.
La fonction inverse quant à elle ne l'est pas, donc transtyper un réel vers un entier implique un choix
(arrondir a l'entier supérieur ou inférieur), et il est préférable d'obliger l'utilisateur à expliciter ce choix,
afin d'éviter des mauvaises surprises en laissant la décision à la machine
Dernière modification par tumasgiu (Sat 03 February 2018 13:56)
Hors ligne