在PostgreSQL中使用“选择大小写”选择分割生成的最小多边形
就像PostGIS折射中的图像一样。 查询将用一条线拆分一个圆。结果是两个多边形。此外,它还选择不同的多边形n并计算每个对象的面积在PostgreSQL中使用“选择大小写”选择分割生成的最小多边形,sql,postgresql,case,case-when,Sql,Postgresql,Case,Case When,就像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,
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
我想要的是分割后的较小多边形
我认为WHEN条款在这方面会有所帮助。因此,这更像是一个PostgreSQL问题。让我忙着处理这个问题,我在PostgreSQL文档中找到了最少和最好的函数 在我的问题中的子查询之后的最后一个查询是有效的,即使这种方法可能不是最优雅的。 线索是以面积的最小值对结果排序
...
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
当我将此查询限制为1并包括在上面的查询中注释掉的geometry列时,我总是从拆分中选择最小的部分
有没有办法避免这种限制
n | area
---+------------------
2 | 3199.62422930388
1 | 4603.98865134125
1 | 4603.98865134125
2 | 3199.62422930388
(4 rows)