我正在使用CartoDB作为我的应用程序的PostGIS服务器。
我需要存储轨迹并为每个跟踪点坐标对关联一个时间戳,以便进行类似于give me the distance traveled between 12AM and 12PM on day X的查询。
在CartoDB中我只能创建3种类型的表: MULTIPOINT,MULTILINESTRING和MULTIPOLYGON。为了插入曲目,我使用了MULTILINESTRING表。
我的第一个尝试是为多行中的每个点插入时间戳作为Z索引,但是我总是得到一个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。我想我很清楚地理解了jattore的想法,但是我不明白为什么Car和Walk总距离会得到不同的结果。有什么提示吗?
解决方案:
距离上的小差异是因为我需要在对segment进行分组之前对points表进行排序。这是我当前的查询,用于根据运输模式获取总距离和所用时间:
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发布于 2012-06-29 06:49:31
嗯,这要看情况了。
想象一下你有一个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维度,实际上我们不是很好地支持它。
https://stackoverflow.com/questions/11249052
复制相似问题