Использование SELECT CASE WHEN в PostgreSQL для выбора наименьшего многоугольника, полученного из разбиения

Как в примере из преломлений PostGIS. Запрос разделяет круг на линию. Результат - два многоугольника. Кроме того, он выбирает отдельные многоугольники (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.


person Stefan    schedule 19.12.2013    source источник


Ответы (1)


Занимая меня этим вопросом, я нашел функции LEAST и GREATEST в документации PostgreSQL.

Следующий последний запрос (после подзапросов в моем вопросе) работает, даже если этот подход, возможно, не самый элегантный. Подсказка упорядочивает результаты по 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 и включаю столбец геометрии (оба закомментированы в запросе выше), я всегда выбирал наименьший кусок из разбиения.

Есть ли способ избежать ограничения?

person Stefan    schedule 19.12.2013