我有一张很大的桌子,上面有很多不规则的点。给定一个用户定义的边界框,我想返回表示相同数量点的子边界框行。子框的形状无关紧要,只要用户定义的边界框中的所有点都被表示和计数。
这就是我要实现的逻辑:
选择与用户边界框相交的所有点。
按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/

10-15 18:12