Я использую 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?
Итак, после ответа 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