【问题标题】:How do I change the radius of a circle in PostgreSQL?如何在 PostgreSQL 中更改圆的半径?
【发布时间】:2014-11-14 09:28:51
【问题描述】:

(使用 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)

这不会破坏交易,但我觉得应该有一种“更好”的方式来做到这一点。

有没有更简单/更好的方法来调整圆圈的大小?具体来说,我想要一个圆心在盒子的中心,半径等于盒子对角线长度的一半。

(如果有帮助,我正在使用“Contained in or on”('

谢谢。

【问题讨论】:

  • 如果你把 box 放在子查询中,你就不必传递两次。

标签: sql postgresql geometry


【解决方案1】:

我将使用 SQL 'WITH' 命令构造语句。您可能想要以下形式的东西:

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)语句。

我们在这里所做的是构建一个表,其中包含一个用于框中心的列和一个用于对角线长度的列。 'WITH' 子句中的子查询将 BOX 建立为列 (bx)。

SQL 要求命名子查询,因此“AS bun” - 未使用。

这种结构还可以更轻松地调整中心和长度参数以解决问题的变化。

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

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 2014-06-12
    • 2016-08-03
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多