我有一张很大的桌子,上面有很多不规则的点。给定一个用户定义的边界框,我想返回表示相同数量点的子边界框行。子框的形状无关紧要,只要用户定义的边界框中的所有点都被表示和计数。
这就是我要实现的逻辑:
选择与用户边界框相交的所有点。
按x值排列所有点
计数返回每组的ST U范围。
我不知道从哪里开始,因为我对SQL和PostGIS没有太多经验,但是像这样的东西。。。?
SELECT
ST_Extent(geom) as extent,
c.count
FROM
xyz_master as x,
(
SELECT
COUNT(*) as count
FROM
xyz_master
) as c
WHERE
c.count < 1000
GROUP BY
extent
;
当然,Postgres的回答是:
ERROR: aggregate functions are not allowed in GROUP BY
LINE 3: ST_Extent(geom) as extent
我意识到子查询并没有多大的意义,因为它只是返回一行并计数所有点,但是我不知道从哪里开始。
有人能指点我正确的方向吗?
谢谢。
最佳答案
根据x对表进行排序,然后为每个1000创建一个不同的组。使用CEIL是一种方法。注意,您必须在以下代码中替换用户提供的xmin、ymin、xmax、ymax和srid:
SELECT ST_EXTENT(t2.geom) extent, COUNT(*) count
FROM (
SELECT t1.geom, ROW_NUMBER() OVER (ORDER BY ST_X(t1.geom)) row_num
FROM xyz_master t1
WHERE ST_INTERSECTS(ST_MakeEnvelope(xmin, ymin, xmax, ymax, srid), t1.geom)
) t2
GROUP BY CEIL(t2.row_num / 1000.0);
关于sql - 如何按定义的计数对点进行分组并为每个组返回边界框?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57697053/