Postgres / Postgis数据库 - 使用ST_MakeLine无限运行查询

时间:2015-10-05 14:50:09

标签: postgresql postgis

我目前有一个名为cardata的数据库方案,其中包括以下列:

+-------------+-----------------------------+---------------------------------+
| tripid(int) | point geometry(point, 4326) | line geometry(linestring, 4326) |
+-------------+-----------------------------+---------------------------------+
| 1           | <data>                      |                                 |
| 1           | <data>                      |                                 |

point列包含连续的GPS测量,因此我想将它们转换为线串。整个行程可以包含数千个点,但我想在每个点之间有一个线串。

我试图将此表示为update到我的表格中,如下所示:

UPDATE cardata
SET line = ST_MakeLine(foo.point, lead)
FROM (
    SELECT point, LEAD(point, 1)
    OVER w
    FROM cardata
    GROUP BY point
    WINDOW w AS (ORDER BY point)
) AS foo

WHERE lead IS NOT NULL

我的想法是,对于每一行,我使用该点,然后在第一行(ST_MakeLine)中保存线串(line)。这应该一直持续到行程结束,忽略LEAD应该为空的最后一个条目。

目前我不知道如何制定区分不同tripid的单个查询,但这是另一次。现在我只想要整个表中所有点之间的线串。

然而问题是我的查询似乎永远运行,并且不会更改表中的任何内容。我不懂为什么。我尝试测试内部SELECT查询是否按预期运行 - 它返回46561行,共47055行。这也很奇怪,因为我认为它应该返回47054行 - 即只得出结论,对于最后一个条目,LEAD为空。

最后,我尝试在两个随机点上运行ST_MakeLine,这似乎工作正常。

是什么让这个查询永远运行?

1 个答案:

答案 0 :(得分:0)

我与之合作的另一个人终于找到了一个有效的解决方案,尽管我们都不太了解原始查询究竟出了什么问题。

因此,我仍然对我原来的问题的答案感兴趣,即是什么让查询永远运行?

这是工作查询,完全按预期工作:

UPDATE cardata
    SET line = resline
    FROM(
        SELECT tripid,
               id,
               ST_MakeLine(point, next_point) AS resline
        FROM(
            SELECT tripid,
                   id,
                   point,
                   lead(point) OVER w AS next_point,
                   lead(tripid) OVER w AS next_tripid
            FROM cardata
            WINDOW w AS(ORDER BY id)
        ) AS allcalclines
        WHERE tripid = 1 AND next_tripid = tripid
    ) AS calclines
    WHERE cardata.id = calclines.id