6

我正在使用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 的想法,但是我不明白为什么我得到不同的结果CarWalk总距离。有什么提示吗?

解决方案:

距离上的微小差异是因为我需要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
4

1 回答 1

3

好吧,这取决于一点。

想象一下,您有一个 GPS 轨迹结构。在这种情况下,您会将这些 GPS 轨迹转换为仅包含两个坐标的线段,并且您可以使用 start_time 和 end_time 分隔列。

然后使用该结构,您可以在这些日期之间使用 WHERE 子句执行 SELECT,并对段的 ST_Length_Spheroid 求和。

如果您想在一个查询中完成所有操作,考虑到您有一个包含以下内容的表:

the_geom(point), timestamp, cartodb_id

你可以做类似的事情

WITH segments AS 
(SELECT ST_MakeLine(
   the_geom,
   (SELECT the_geom FROM tracks as st WHERE st.cartodb_id = t.cartodb_id+1)
) as the_geom
FROM traces as t WHERE timestamp BETWEEN ...)
SELECT sum(ST_Length_Spheroid(segments.the_geom)

这完全是我们的想法……但我希望你能明白。

您不需要使用 Z 维度,实际上我们并不支持这一点。

于 2012-06-28T22:49:31.283 回答