PostGIS/CartoDB :Хранить метку времени для каждой точки в MultiLineString

Я использую CartoDB в качестве сервера PostGIS для своего приложения.

Мне нужно хранить треки и связывать метку времени для каждой пары координат точек трека, чтобы делать запросы типа give me the distance traveled between 12AM and 12PM on day X.

В CartoDB я могу создать только 3 типа таблиц :MULTIPOINT, MULTILINESTRING и MULTIPOLYGON. Для вставки дорожек я использую таблицу MULTILINESTRING.

Моя первая попытка состояла в том, чтобы вставить метку времени в качестве индекса Z для каждой точки в MULTILINESTRING, однако я всегда получаюERROR: Geometry has Z dimension but column does not.

Как это достигается в «обычной» базе данных PostGIS, а также как я могу добиться этого в реализации CartoDB PostGIS?

ОБНОВЛЕНИЕ 1:

Итак, после ответа jatorre я создал пример JSFiddle в качестве практического упражнения. Однако я получаю непоследовательные результаты.

В приведенном выше примере у меня есть две таблицы с одними и теми же двумя наборами данных. Однако одна из них представляет собой таблицу MULTILINESTRING, в которой каждая строка представляет собой segment, а другая — таблицу MULTIPOINT, в которой я храню каждый segmentнабор координат.

Затем я запрашиваю эти две таблицы, чтобы получить total distance of segments according to transport mode. Я думаю, что я довольно ясно понял идею джатторе, однако я не понимаю, почему я получаю разные результаты для общего расстояния Carи Walk. Любые подсказки?

РЕШЕНИЕ:

Небольшие различия в расстояниях были связаны с тем, что мне нужно было отсортировать таблицу pointsперед группировкой segment. Это мой текущий запрос, чтобы получить общее расстояние и время, пройденное в соответствии с видом транспорта:

WITH segments AS 
  (SELECT ST_Makeline(pts.the_geom_webmercator) as the_geom, (MAX(pts.timestamp) - MIN(pts.timestamp)) AS time, paths.transport_mode, paths.cartodb_id AS id
   FROM (SELECT * FROM points ORDER BY track_id, path_id, timestamp ASC) AS pts JOIN paths ON pts.path_id=paths.cartodb_id
   WHERE paths.user_id=1
   GROUP BY id, transport_mode)
SELECT SUM(ST_Length(segments.the_geom)) AS distance, SUM(segments.time), segments.transport_mode
FROM segments
GROUP BY segments.transport_mode
ORDER BY distance

6
задан ffleandro 9 August 2012 в 21:58
поделиться