ฉันจะเปลี่ยนรัศมีของวงกลมใน PostgreSQL ได้อย่างไร

(ใช้ 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" ('‹@') เพื่อรับชุดของคะแนนภายในพื้นที่)

ขอบคุณ.


person Moose Morals    schedule 14.11.2014    source แหล่งที่มา
comment
คุณจะไม่ต้องส่งผ่านสองครั้งหากคุณใส่กล่องในแบบสอบถามย่อย   -  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 bun' ซึ่งไม่ได้ใช้

โครงสร้างนี้ยังทำให้ง่ายต่อการเล่นซอกับพารามิเตอร์จุดศูนย์กลางและความยาวสำหรับรูปแบบต่างๆ ของปัญหาของคุณ

ฉันควรชี้ให้เห็นด้วยว่าในข้อความปัญหาของคุณ วงกลมแรกที่คุณสร้างอยู่นอกกล่อง (ศูนย์กลางอยู่ตรงกลาง แต่รัศมีคือครึ่งหนึ่งของเส้นทแยงมุม -- หมายความว่ากล่องถูกจารึกไว้ในวงกลม) สำหรับวงกลมภายในกล่อง คุณต้องใช้ความยาวรัศมีเป็นครึ่งหนึ่งของความยาวด้านข้างของสี่เหลี่ยมจัตุรัส ไม่ใช่เส้นทแยงมุม

person Robert M. Lefkowitz    schedule 14.11.2014