(使用PostgreSQL 9.1,未安装GIS内容)
假设我有一个盒子(应该总是正方形):
> SELECT box '((0, 0), (1,1))'
"(1,1),(0,0)"
我可以得到一个适合广场的圆圈:
> SELECT circle (box '((0, 0), (1,1))')
"<(0.5,0.5),0.707106781186548>"
并且有点乱,我可以得到一个更大的圈子:
> SELECT circle(center(circle(box '((0, 0), (1,1))')), radius(circle(box '((0, 0), (1,1))')) * 2)
"<(0.5,0.5),1.4142135623731>"
但是这样做是准备好的声明意味着将广场传递两次:
"SELECT circle(center(circle(?)), radius(circle(?)) * 2)
这不是一个交易破坏者,但我觉得应该有一个更好的&#39;这样做的方式。
是否有更简单/更好的方法来调整圆圈的大小?具体来说,我想要一个圆心,其中心位于盒子的中心,半径等于盒子对角线长度的一半。
(如果有帮助,我使用&#34;包含在&#34;(&#39;&lt; @&#39;)运算符中获取区域内的点集)
感谢。
答案 0 :(得分:1)
我会使用SQL&#39; WITH&#39;来构造语句。命令。你可能想要一些形式:
WITH bxx as (SELECT center(bx) as cb, length(diagonal(bx)) as lb
FROM (SELECT box('((0,0),(1,1))') AS bx) AS bun)
SELECT circle(cb, lb) from bxx;
WITH子句生成一个表,该表将在以下SQL(本例中为SELECT)语句中使用。
我们在这里做的是构建一个表格,其中包含一个用于框中心的列和一个用于对角线长度的列。 &#39; WITH&#39;中的子查询子句将BOX建立为列(bx)。
SQL要求子查询被命名,因此&#39; AS bun&#39; - 未使用。
这种结构还可以更容易地根据问题的变化来调整中心和长度参数。
我还应该指出,在您的问题陈述中,您创建的第一个圆是在框外(中心位于中心,但半径是对角线的一半 - 意味着框刻在圆圈中)。对于框内的圆圈,您希望半径长度为正方形边长的一半,而不是对角线。