如何在PostGIS中识别和简化点簇?


11

我刚刚开始使用空间数据库,我想编写一个SQL(PostGIS)查询来自动概括原始GPS轨迹(具有固定的跟踪频率)。我要唤醒的第一件事是一个查询,该查询以查询形式(例如“ y米距离内的x个点”)标识停顿点,以用代表点代替大量点云。我已经意识到要在一定距离内捕捉点并计算捕捉的点。在下面的图片中,可以看到原始示例轨迹(小的黑点)和捕捉点的中心为彩色圆圈(大小=捕捉点的数量)。

在此处输入图片说明

CREATE table simplified AS 
 SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
   FROM raw
  GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
  ORDER BY count(raw.geom) DESC;

我对这个解决方案非常满意,但是存在时间问题:将轨道想象成一个城市中的全日轨道,人们可以返回到之前已经访问过的地方。在我的示例中,深蓝色圆圈代表该人两次访问过的房屋,但我的查询当然忽略了它。

在这种情况下,复杂的查询应仅收集带有连续时间戳(或id)的点,以便在此处产生两个代表点。我的第一个想法是将查询修改为3d版本(时间为三维),但似乎不起作用。

有人对我有什么建议吗?我希望我的问题清楚。


谢谢您的创意。我意识到要制作和简化线串,如下面的屏幕截图所示(点是原始点)。 在此处输入图片说明 我仍然需要确定休息地点(半径小于x米的x点),理想情况下是到达时间和离开时间的一个点……还有其他想法吗?


2
您实际上是否需要这些积分用于其他目的?否则,听起来可能只是从这些点创建直线,然后简化/概括这些直线即可满足您的目的。
安东尼-GISCOE- 2012年

2
这是一个令人着迷的问题。您可能可以从Mathematica网站mathematica.stackexchange.com/questions/2711上提出的相同问题中收集一些想法。并非所有答案都利用数据的时间维度(但我的答案是:-)。
ub

@ Anthony-GISCOE-这是一种有趣的方法。如果需要点特征,则可以从广义线的顶点或沿着gis.stackexchange.com/questions/27102/…之类的线创建新的点特征。我知道,这些还不是原来的观点!
andytilia 2012年

// @安东尼:我绝对需要任何静止状态的“代表点”,至少要有开始和结束时间……
Berlin_J 2012年

1
并且有一个postgis解决方案真的很有用:)
Berlin_J 2012年

Answers:


4

如果确实需要所有要点进行可视化,则可以创建一条线,然后st_simplify(这是Douglas Peucker的实现)会做得很好。

在某些情况下,您甚至不需要存储所有点,因此您可以在保存点数据之前进行过滤,例如,当对象不移动时,不要存储它。在将点添加到数据库之前,可以应用DouglasPeucker或其他一些基本过滤器。另外,某些GPS提供商(例如Android Location API)可以根据时间和最小距离自动进行初始过滤。在某些情况下,您会保留重复的数据:预先过滤以实现快速可视化,并完整记录以进行存档。如今,普通存储非常便宜。


3

同时,我找到了解决问题的方法:

首先,我为每个点确定一个“距离类型”。如果该点距离下一个点x米更近,则确定为“停止”,否则确定为“移动”。然后,我启动了这样的窗口函数:

     SELECT t1.id, t1.dist_type, t1."time", t1.the_geom, t1.group_flag, sum(t1.group_flag) OVER (ORDER BY t1.id) AS group_nr
FROM ( SELECT distances.id, distances.the_geom, distances."time", distances.dist_type, 
                CASE
                    WHEN lag(distances.dist_type) OVER (ORDER BY distances.id) = distances.dist_type THEN NULL::integer
                    ELSE 1
                END AS group_flag
           FROM distances) t1;

结果表如下所示:

在此处输入图片说明

简单的下一步将“停止”点分组,确定这些点组的质心,并将最小和最大时间戳记作为到达和离开时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.