簡體   English   中英

從數據庫表中選擇重疊的矩形

[英]Selecting overlapping rectangles from a database table

我有一個存儲矩形的數據庫表 (postgres),由左下角和右上角的網格坐標(X 和 Y)定義。 該表定義如下......

CREATE TABLE tableA (
  minX             NUMERIC, 
  minY             NUMERIC, 
  maxX             NUMERIC,
  maxY             NUMERIC 
);

其中minXminY是左下角的坐標, maxXmaxY是右上角的坐標。

我正在嘗試提出一個 SQL 查詢,該查詢將拉回與目標矩形重疊的任何矩形的記錄,該目標矩形也由左下角和右上角 - minX_TminY_TmaxX_TmaxY_T

到目前為止,這就是我想出的...

SELECT * FROM tableA  
WHERE 
( 
  ( 
    (minY <=minY_T AND maxY >= minY_T) 
    AND 
    (minX <=minX_T AND maxX >= minX_T) 
  ) 
  OR 
  ( 
    (minY <=maxY_T AND maxY >= maxY_T) 
    AND 
    (minX <=maxX_T AND maxX >= maxX_T) 
  ) 
  OR 
  ( 
    (minY <=maxY_T AND maxY >= maxY_T) 
    AND 
    (minX <=minX_T AND maxX >= minX_T) 
  ) 
  OR 
  ( 
    (minY <=minY_T AND maxY >= minY_T) 
    AND 
    (minX <=maxX_T AND maxX >= maxX_T) 
  )
)

這(部分)有效它從數據庫中選擇矩形的一角落在目標內的任何記錄,但是它不會找到所有變化並且它是 SQL 的一個非常混亂的位。乍一看這是一個非常簡單的問題,但我我已經為此絞盡腦汁好幾個小時了——每次我認為我有一個解決方案時,我都會發現一個它不起作用的場景!

有任何想法嗎? (順便說一句 - 這僅適用於邊長為水平或垂直的矩形)


好的,又過了幾個小時,這個更簡單的版本似乎可以解決問題

SELECT * FROM tableA
WHERE 
( 
 minX_T < maxX 
  AND 
 maxX_T > minX 
  AND 
 minY_T < maxY 
  AND 
 maxY_T > minY 
) 

不要重新發明輪子(或者在這種情況下是盒子)。 Postgres 提供了幾何數據類型(在本例中為點和框)和所需的幾何函數
以下 sql function 將從您的表格中返回任何重疊的“框”:

create or replace 
function overlaps_rectangle( rectangle_in box) 
 returns setof tablea
 language sql
 as $$
    select * 
      from tablea 
     where box( point(maxx,maxy),point(minx,miny)) && rectangle_in ;
$$;

請參閱此處的示例

function其實並不需要,sql語句本身可以作為腳本運行。 我只是發現將參數傳遞給 function 比修改腳本更容易。 更進一步,根據其他用途,您實際上可以將值存儲為 Points 甚至 Boxes。 示例包含在上述參考中。 注意:作為一個盒子

可以在輸入中提供任意兩個對角,但值將根據需要重新排序以按該順序存儲右上角和左下角。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM