2014-11-14 39 views
0

(使用PostgreSQL 9.1,無需安裝GIS的東西)如何更改PostgreSQL中的圓的半徑?

假設我有一個盒子(應該始終爲正方形):

> 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) 

這不是一個大忌,但我覺得應該是這樣做的一個「好」的方式。

是否有更容易/更好的方式來調整圈子大小?具體來說,我想要一個圓心,它的中心位於盒子的中心,半徑等於盒子對角線長度的一半。

(如果有幫助,我使用(「< @」)操作符「中或含有」得到一個區域內的點的集合)

感謝。

+0

如果將方框放入子查詢中,則不必傳遞兩次。 –

回答

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中使用的表(請在這種情況下)聲明。

我們在這裏做的是構造一個表格,其中包含一個用於盒子中心的列和一個用於對角線長度的表格。 'WITH'子句中的子查詢將BOX設置爲列(bx)。

SQL要求命名子查詢,因此是'AS bun' - 這是未使用的。

這種結構還可以更容易地擺脫問題變化的中心和長度參數。

我還應該指出,在你的問題陳述中,你創建的第一個圓在盒子外(中心在中心,但半徑是對角線的一半 - 意味着盒子被刻在圓圈內)。對於盒子內的一個圓圈,您希望使用半徑長度爲正方形邊長的一半,而不是對角線。