Requete postgis => résultat incohérent

Extraire des données OSM, créer sa carte, uMap, utiliser sur un GPS ou un smartphone...
Tioneb
Messages : 26
Inscription : mar. mars 27, 2018 4:03 pm

Requete postgis => résultat incohérent

Message par Tioneb » dim. mai 27, 2018 1:34 am

Salut,

Je fais mes tests de requête notamment pour trouver la distance entre un point A et B situé de part et d'autre d'une linestring. La voici :

Code : Tout sélectionner

@test_distance = Track.find_by_sql(
      ["SELECT
        ST_Distance(line, pta) AS dst_pdd,
        ST_Distance(line, ptb) AS dst_pda,
        ST_Length(ST_LineSubstring(
            line,
            least(ST_Line_Locate_Point(line, pda), ST_Line_Locate_Point(line, pdd)),
            greatest(ST_Line_Locate_Point(line, pda), ST_Line_Locate_Point(line, pdd)))::geography)  AS dst_line
        FROM (
          SELECT
            'SRID=4326;LINESTRING(1.457834243774414 43.597960902821576,1.462029218673706 43.59636807591895)'::geometry line,
            'SRID=4326;POINT(1.457994 43.598124)'::geometry pdd,
            'SRID=4326;POINT(1.461628 43.596128)'::geometry pda
        ) data"
      ])
J'ai découpé la requête pour mieux comprendre le résultat. Le résultat que j'obtiens est vraiment très loin de ce que j'attends

dst_line = 349.69641324941
dst_pdd = 0.000209184746207263
dst_pda = 0.000366862736795735

J'ai simulé sur google maps le même trajet (https://goo.gl/maps/M3nrmVRstUK2) et j'obtiens environ un total de 400 mètres détaillés comme suit :

dst_line = 350 m
dst_pdd = 23 m
dst_pda = 38 m

Les deux dernières valeurs semblent assez proches si l'on fait l'impasse des virgules et des zéros : On aurait 20,91 et 36,68... pourtant ST_distance est censé retourner une valeur en mètres. Même chose pour ST_length mais avec cette fois un résultat cohérent.

D'après la doc postgis ST_Line_Locate_Point retourne "as a fraction of total 2d line length" et un float, j'avoue que je ne comprends pas trop ce que ça retourne vraiment. Si quelqu'un peut m'expliquer... :D

Question subsidiaire :mrgreen: , est ce que je peux utiliser des opérateurs directement dans la requête pour par exemple additionner dst_line, dst_pdd, dst_pda, si oui comment ?

Avatar de l’utilisateur
cquest
Messages : 1787
Inscription : ven. avr. 16, 2010 12:22 am
Localisation : Val de Marne
Contact :

Re: Requete postgis => résultat incohérent

Message par cquest » dim. mai 27, 2018 9:01 am

Normal... tu travaille en données sphériques (4326=WGS84=degrés sur le globe terrestre) pour calculer dst_pdd et dst_pda

Donc les distances retournées sont des "degrés" et totalement inutilisables.

Pour le dst_line tu as basculé tes geometry en geography et donc le calcul de longueur se fait après projection plane, et retourne des metres

ST_Distance(line, pta) AS dst_pdd -> ST_Distance(line::geography, pta::geography) AS dst_pdd
ST_Distance(line, ptb) AS dst_pda -> ST_Distance(line::geography, ptb::geography) AS dst_pda

Et ça devrait être cohérent.

Tioneb
Messages : 26
Inscription : mar. mars 27, 2018 4:03 pm

Re: Requete postgis => résultat incohérent

Message par Tioneb » dim. mai 27, 2018 10:14 am

Ben oui... c'est tellement évident après une nuit de repos ;) Merci. ;)

Sinon, il y a moyen de faire l'addition des 3 résultats avec deux chiffres après la virgule directement dans la requête ou je dois le gérer coté front ?

Avatar de l’utilisateur
cquest
Messages : 1787
Inscription : ven. avr. 16, 2010 12:22 am
Localisation : Val de Marne
Contact :

Re: Requete postgis => résultat incohérent

Message par cquest » mer. mai 30, 2018 9:51 am

SELECT round(ST_Distance(...) + ST_Distance(...) + ST_Length(...) , 2) ...

Tioneb
Messages : 26
Inscription : mar. mars 27, 2018 4:03 pm

Re: Requete postgis => résultat incohérent

Message par Tioneb » jeu. mai 31, 2018 12:06 am

C'est ce que j'ai fais, l'addition passe bien... le round beaucoup moins. Mais finalement ce n'est pas un problème, je le gère au niveau du front en fonction du résultat ;)

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités