我正在使用CartoDB作为我的应用程序的 PostGIS 服务器。
我需要存储轨迹并为每个轨迹点坐标对关联一个时间戳,以便进行类似give me the distance traveled between 12AM and 12PM on day X
.
在 CartoDB 中,我只能创建 3 种类型的表:MULTIPOINT、MULTILINESTRING 和 MULTIPOLYGON。要插入曲目,我使用的是 MULTILINESTRING 表。
我的第一次尝试是将时间戳作为 MULTILINESTRING 中每个点的 Z 索引插入,但是我总是得到一个ERROR: Geometry has Z dimension but column does not.
这是如何在“普通” PostGIS 数据库中实现的,以及如何在 CartoDB PostGIS 实现中实现它?
更新 1:
因此,在 jatorre 回答之后,我创建了一个JSFiddle示例作为练习。但是我得到了不连贯的结果。
在上面的示例中,我有两个具有相同两个数据集的表。然而,一个是MULTILINESTRING
每行代表 a的表格,segment
另一个是MULTIPOINT
我存储每组segment
坐标的表格。
然后我查询这两个表以获取total distance of segments according to transport mode
. 我想我很清楚 jattore 的想法,但是我不明白为什么我得到不同的结果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