Как изменить радиус круга в PostgreSQL?

(Используя PostgreSQL 9.1, без установки ГИС)

Предполагая, что у меня есть коробка (которая всегда должна быть квадратной):

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

что не является нарушением условий сделки, но я чувствую, что должен быть «лучший» способ сделать это.

Есть ли более простой/лучший способ изменить размер круга? В частности, мне нужен круг с центром в центре коробки и радиусом, равным половине длины диагонали коробки.

(Если это поможет, я использую оператор «Содержится в или на» («‹@»), чтобы получить набор точек в области)

Спасибо.


person Moose Morals    schedule 14.11.2014    source источник
comment
Вам не придется проходить его дважды, если вы поместите box в подзапрос.   -  person Jakub Kania    schedule 14.11.2014


Ответы (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» не используется.

Эта конструкция также упрощает работу с параметрами центра и длины для различных вариантов вашей задачи.

Я также должен указать, что в вашей постановке задачи первый круг, который вы создаете, находится за пределами прямоугольника (центр в центре, но радиус равен половине диагонали — это означает, что прямоугольник вписан в круг). Для круга внутри коробки вы хотите использовать длину радиуса, равную половине длины сторон квадрата, а не диагонали.

person Robert M. Lefkowitz    schedule 14.11.2014