Было бы полезно, если бы вы могли включить пример LineStrings, которые возвращают MultiLineString. Но это, вероятно, потому что LineStrings не разделяют общую точку и поэтому не могут быть объединены.
Если вы в порядке, выбрасывая эти строки, а не исправляя их, это должно работать:
SELECT ST_AsGeoJson(St_linemerge(ST_Collect(tr.path))) as geojson
FROM tracks tr
INNER JOIN trace_tracks ON tr.id = trace_tracks.track_id
WHERE trace_tracks.trace_id = #{trace.id}
AND ST_GeometryType(St_linemerge(ST_Collect(tr.path))) = 'ST_Linestring';
Если вы хотите сохранить их и все в порядке, возвращая более одной строки, тогда вы можете сделать:
SELECT ST_AsGeoJson(geom) as geojson
FROM
(SELECT (ST_Dump(ST_LineMerge(ST_Collect(tr.path)))).*
FROM tracks tr
INNER JOIN trace_tracks ON tr.id = trace_tracks.track_id
WHERE trace_tracks.trace_id = #{trace.id}
) g;
Если вы хотите принудительно создать линию из точек мультилинии (т.е. соединить две непересекающиеся линии вместе), возможно, с неожиданными результатами, вы можете сделать это (ИСПОЛЬЗОВАТЬ ATВАШ СОБСТВЕННЫЙ РИСК):
SELECT ST_AsGeoJson(ST_MakeLine(geom)) as geojson
FROM
(SELECT (ST_DumpPoints(tr.path)).*
FROM tracks tr
INNER JOIN trace_tracks ON tr.id = trace_tracks.track_id
WHERE trace_tracks.trace_id = #{trace.id}
) g;
Это просто соединяет конец одной строки с началом следующей в любом порядке, в котором хранятся строки.