【问题标题】:Using SELECT CASE WHEN in PostgreSQL to select the smallest polygon, produced from a split在 PostgreSQL 中使用 SELECT CASE WHEN 来选择最小的多边形,由分割产生
【发布时间】:2013-12-19 12:09:20
【问题描述】:

就像 PostGIS 折射中的 example。 该查询用一条线分割一个圆圈。结果是两个多边形。此外,它会选择不同的多边形 (n) 并计算每个对象的面积。

WITH split AS
(SELECT 
    ST_Split(circle, line) AS geom,
    generate_series(1,100) AS n
FROM (
    SELECT 
        ST_MakeLine(ST_MakePoint(10, 10),ST_MakePoint(190, 190)) AS line,
        ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) AS circle) AS foo),
objects AS
(SELECT
    n,
    ST_GeometryN(split.geom,n) AS geom
FROM split
    WHERE n <= ST_NumGeometries(split.geom))

    SELECT
        n,
        ST_Area(objects.geom),
        geom
    FROM objects

查询返回两个面积值不同的对象。

我的问题是如何选择最小的? 问题在于,在某些情况下,n=1 的几何形状较小,而对于另一个多边形,n=2 的几何形状较小。

我在最后的查询中尝试了这个,但它不起作用。它不返回几何图形。

CASE
    WHEN ST_Area(ST_GeometryN(objects.geom,1)) < ST_Area(ST_GeometryN(objects.geom,2)) 
        THEN ST_GeometryN(objects.geom,1)
    ELSE ST_GeometryN(objects.geom,2)
END

我想要的是分割后的小多边形。

我认为CASE WHEN 子句可以在这里提供帮助。所以,这更像是一个 PostgreSQL 问题。

【问题讨论】:

    标签: sql postgresql case case-when


    【解决方案1】:

    让我忙于这个问题,我在 PostgreSQL 文档中找到了 LEASTGREATEST 函数。

    以下最终查询(在我的问题中的子查询之后)有效,即使这种方法可能不是最优雅的方法。 线索是使用区域的LEAST 值对结果进行排序。

    ...
    
    SELECT
        objects.n,
        -- objects.geom,
        ST_Area(objects.geom) AS area
    FROM objects, split
        WHERE split.n <= ST_NumGeometries(split.geom)
            ORDER BY LEAST(ST_Area(ST_GeometryN(objects.geom,split.n)))
            -- LIMIT 1
    

    为此设置的结果是:

     n |       area       
    ---+------------------
     2 | 3199.62422930388
     1 | 4603.98865134125
     1 | 4603.98865134125
     2 | 3199.62422930388
    (4 rows)
    

    当我将此查询限制为 1 并包含几何列(在上面的查询中均已注释掉)时,我总是从拆分中选择最小的部分。

    有没有办法避免限制?

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2018-12-25
      • 2020-01-26
      • 2017-10-31
      • 1970-01-01
      相关资源
      最近更新 更多