使用PostGIS从点创建线?


10

我有一个包含大量车辆位置数据的PostGIS表,并希望从这些点创建线。

可以按车辆ID选择数据并按时间戳排序数据,但是如何根据结果创建行呢?

我基本上需要的是从点1到点2的一条线段,最终确定该线,然后再从点2到点3进行线段。当然,所有这些都需要考虑车辆ID。

后一种是必需的,因为我想计算车辆从一点到另一点的巡航方向和速度。


1
一旦计算出GROUP BY vehicle_id和ORDER BY时间戳记,ST_MakeLine()函数将执行此操作。参见:postgis.refractions.net/docs/ST_MakeLine.html
Micha

好吧,我只是尝试一下并发出以下声明:SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;这将使我了解每辆车的行驶轨迹,而这并不是我所需要的。如何告诉ST_MakeLine()创建从点1到点2的线,最终确定该线并从点2到点3开始新的线...?
托马斯·贝克尔

什么是“点1”,“点2”,“点3”?您如何识别它们?
Micha

我想通过时间戳的顺序来识别它们...- ORDER BY ais_data.bs_ts可能吗?因此,点1,点2等基本上是每行作为Select语句的结果给出的点信息。
托马斯·贝克尔

您可以首先为每辆车生成一行,然后使用邮件列表postgispostgis.17.x6.nabble.com/…中的提示从该行生成顶点。– ThomasG77
2013年

Answers:


12

可以使用自连接或相关子查询以几种方式完成此操作,但使用窗口函数可能是最简单的方法。

该函数lead()返回给定分区中前面的值,而我们的分区为(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

该查询为我们提供了车辆编号,该点在分区中的位置(等于从该位置开始的线的位置)以及将构成该线的两个几何形状。当然,它为最后一点返回NULL geom2,因此我们需要在外部查询中进行检查。

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
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.