Bagaimana cara mengubah jari-jari lingkaran di PostgreSQL?

(Menggunakan PostgreSQL 9.1, tanpa menginstal perangkat GIS)

Dengan asumsi saya punya kotak (yang harus selalu berbentuk persegi):

> SELECT box '((0, 0), (1,1))'
"(1,1),(0,0)"

Saya bisa mendapatkan lingkaran yang pas di dalam kotak:

> SELECT circle (box '((0, 0), (1,1))')
"<(0.5,0.5),0.707106781186548>"

dan dengan sedikit bermain-main saya bisa mendapatkan lingkaran yang lebih besar:

> SELECT circle(center(circle(box '((0, 0), (1,1))')), radius(circle(box '((0, 0), (1,1))')) * 2)
"<(0.5,0.5),1.4142135623731>"

tetapi melakukan itu sebagai pernyataan yang sudah disiapkan berarti melewati kotak tersebut dua kali:

"SELECT circle(center(circle(?)), radius(circle(?)) * 2)

yang bukan merupakan pemecah masalah, tapi menurut saya seharusnya ada cara yang 'lebih baik' untuk melakukannya.

Apakah ada cara yang lebih mudah/lebih baik untuk mengubah ukuran lingkaran? Secara khusus, saya ingin sebuah lingkaran dengan pusatnya di tengah kotak, dan jari-jarinya sama dengan setengah panjang diagonal kotak.

(Jika membantu, saya menggunakan operator "Terkandung dalam atau di" ('‹@') untuk mendapatkan kumpulan titik dalam suatu area)

Terima kasih.


person Moose Morals    schedule 14.11.2014    source sumber
comment
Anda tidak perlu meneruskannya dua kali jika Anda memasukkan kotak ke dalam subkueri.   -  person Jakub Kania    schedule 14.11.2014


Jawaban (1)


Saya akan membuat pernyataan menggunakan perintah SQL 'DENGAN'. Anda mungkin menginginkan sesuatu dalam bentuk:

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;

Klausa WITH menghasilkan tabel untuk digunakan dalam pernyataan SQL berikut (dalam kasus ini SELECT).

Apa yang kita lakukan di sini adalah membuat tabel yang berisi kolom untuk pusat kotak dan satu kolom untuk panjang diagonal. Subquery dalam klausa 'WITH' menetapkan BOX sebagai kolom (bx).

SQL mengharuskan subquery diberi nama, maka 'AS bun' -- yang tidak digunakan.

Konstruksi ini juga memudahkan untuk mengutak-atik parameter pusat dan panjang untuk variasi masalah Anda.

Saya juga harus menunjukkan bahwa dalam rumusan masalah Anda, lingkaran pertama yang Anda buat berada di luar kotak (pusat di tengah, tetapi jari-jarinya setengah diagonal -- artinya kotak tersebut tertulis di dalam lingkaran). Untuk lingkaran di dalam kotak, Anda ingin menggunakan panjang jari-jari setengah panjang sisi persegi, bukan diagonalnya.

person Robert M. Lefkowitz    schedule 14.11.2014