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"
])
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...

Question subsidiaire
