如何在PostgreSQL中更改圆的半径?

时间:2014-11-14 09:28:51

标签: sql postgresql geometry

(使用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;)运算符中获取区域内的点集)

感谢。

1 个答案:

答案 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; - 未使用。

这种结构还可以更容易地根据问题的变化来调整中心和长度参数。

我还应该指出,在您的问题陈述中,您创建的第一个圆是在框外(中心位于中心,但半径是对角线的一半 - 意味着框刻在圆圈中)。对于框内的圆圈,您希望半径长度为正方形边长的一半,而不是对角线。