2013-12-19 15 views
2

像PostGIS折射中的example一樣。 查詢使用一條線分割一個圓。結果是兩個多邊形。另外,它選擇不同的多邊形(n)並計算每個對象的面積。在PostgreSQL中使用SELECT CASE WHEN選擇從分割產生的最小多邊形

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問題。

回答

0

讓我忙於解決這個問題,我在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此查詢,並且包括幾何列(無論是在上面的查詢註釋),我總是選擇最小的片從分裂。

有沒有辦法避免限制?