Postgres/Postgis 数据库 - 使用 ST_MakeLine 无限查询 运行
Postgres/Postgis database - Query running infinitely with ST_MakeLine
我目前有一个名为 cardata 的数据库方案,其中包括这些列:
+-------------+-----------------------------+---------------------------------+
| tripid(int) | point geometry(point, 4326) | line geometry(linestring, 4326) |
+-------------+-----------------------------+---------------------------------+
| 1 | <data> | |
| 1 | <data> | |
point
列包含连续的 GPS 测量值,因此我想将它们转换为线串。整个行程可以包含数千个点,但我想要每个点之间的线串。
我试图将其表述为我的 table 的 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
应该为 null 的条目。
目前我不知道如何制定区分不同 tripid
的单个查询,但那是以后的事了。现在我只想要整个 table.
中所有点之间的线串
然而,问题是我的查询似乎永远 运行,并且不会更改 table 中的任何内容。我不懂为什么。我尝试测试内部 SELECT
查询是否按预期运行 - 它 returns 46561 行,共 47055 行。这也很奇怪,因为我认为它应该 return 47054 行 - 即仅得出结论,对于最后一个条目,LEAD
为空。
最后我尝试了 运行在两个随机点上 ST_MakeLine
,这似乎工作正常。
是什么让这个查询永远 运行?
与我一起工作的另一个人终于找到了一个可行的解决方案,尽管我们都不太明白原始查询到底出了什么问题。
因此,我仍然对我最初问题的答案感兴趣,即 什么使查询 运行 永远如此?
这是工作查询,完全按预期工作:
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
我目前有一个名为 cardata 的数据库方案,其中包括这些列:
+-------------+-----------------------------+---------------------------------+
| tripid(int) | point geometry(point, 4326) | line geometry(linestring, 4326) |
+-------------+-----------------------------+---------------------------------+
| 1 | <data> | |
| 1 | <data> | |
point
列包含连续的 GPS 测量值,因此我想将它们转换为线串。整个行程可以包含数千个点,但我想要每个点之间的线串。
我试图将其表述为我的 table 的 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
应该为 null 的条目。
目前我不知道如何制定区分不同 tripid
的单个查询,但那是以后的事了。现在我只想要整个 table.
然而,问题是我的查询似乎永远 运行,并且不会更改 table 中的任何内容。我不懂为什么。我尝试测试内部 SELECT
查询是否按预期运行 - 它 returns 46561 行,共 47055 行。这也很奇怪,因为我认为它应该 return 47054 行 - 即仅得出结论,对于最后一个条目,LEAD
为空。
最后我尝试了 运行在两个随机点上 ST_MakeLine
,这似乎工作正常。
是什么让这个查询永远 运行?
与我一起工作的另一个人终于找到了一个可行的解决方案,尽管我们都不太明白原始查询到底出了什么问题。
因此,我仍然对我最初问题的答案感兴趣,即 什么使查询 运行 永远如此?
这是工作查询,完全按预期工作:
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