2009-08-17 76 views
5

我有一個空間啓用的數據庫(在本例中爲DB2)。我需要在桌子上儲存大量的廣場。哪種標準的空間SQL數據類型最適合?空間SQL:最適合正方形的數據類型?

我想我可以用一個ST_polygon,但也許有一個很特殊的類型,這將使​​

  • 更好的性能
  • 更好的數據保證(我想抓住它,就好像一個錯誤的人在哪裏存儲在特定列非正方形值)

我試圖找到一個ST_rectangleST_squar e類型,但它們似乎不存在(?)

雖然我正在使用DB2,但我也對那些不能在DB2上工作的解決方案感興趣,只要它們符合標準。

回答

1

在DB2中它也是一個Polygon。它看起來像你存儲網格,所以快速檢查可能是,如果ST_ENVELOPE(幾何)==幾何那麼你有一個方形

此代碼是從

DB2's documentation

SET CURRENT PATH = CURRENT PATH, db2gse; 
CREATE TABLE sample_geoms (id INTEGER, geometry ST_Geometry); 

INSERT INTO sample_geoms VALUES 
(1, ST_Geometry(ST_Point('point EMPTY',0))); 

INSERT INTO sample_geoms VALUES 
(2, ST_Geometry(ST_Point('point zm (10 10 16 30)' ,0))); 

INSERT INTO sample_geoms VALUES 
(3, ST_Geometry(ST_Multipoint('multipoint m (10 10 5, 50 10 6, 
     10 30 8)' ,0))); 

INSERT INTO sample_geoms VALUES 
(4, ST_Geometry(ST_Linestring('linestring (10 10, 20 10)',0))); 

INSERT INTO sample_geoms VALUES 
(5, ST_Geometry(ST_Polygon('polygon((40 120, 90 120, 90 150, 
     40 150, 40 120))',0))); 


SELECT id, CAST(ST_AsText(ST_Envelope(geometry)) as VARCHAR(160)) Envelope 
FROM sample_geoms; 

結果:

ID   ENVELOPE 
----------- --------------------------------------------------------------- 
     1  - 

     2  POLYGON ((9 9, 11 9, 11 11, 9 11, 9 9)) 

     3  POLYGON ((10 10, 50 10, 50 30, 10 30, 10 10)) 

     4  POLYGON ((10 9, 20 9, 20 11, 10 11, 10 9)) 

     5  POLYGON ((40 120, 90 120, 90 150, 40 150, 40 120)) 

請參閱ID = 5?最後一個POLYGON == ST_ENVELOPE(幾何)

1

您或許正在尋找ST_Envelope - 我不確定DB2是什麼,但它是OGC標準的一部分。任何非垂直或非水平線或多邊形都將通過此函數生成一個矩形,通常將其座標存儲爲浮點數。

+1

但ST_envolope是一個函數,而不是一個類型的,據我可以看到? – 2009-08-17 22:01:25

+0

對不起,我剛剛刪除了許多令人費解的廢話。這些點在Postgis中存儲爲一系列的float4,對DB2不太確定,但它必須大致相同,或者可能是db2/Oracle的「數字」類型之一。我猜測所有的矩形都只是作爲一些基本的浮點類型存儲的座標,通過智能索引爲常見的空間查詢啓用地理功能。 – unmounted 2009-08-17 22:16:56

+1

Troels是正確的。 ST_ENVELOPE是一個返回ST_POLYGON的函數; ST_ENVELOPE不是一種類型。 「浮點」優化特定於PostGIS。 – 2009-08-28 16:04:05

4

即使您的數據表示矩形或正方形,您仍然需要使用ST_POLYGON類型。但是,當您對數據執行查詢時,可以使用一階篩選器,如ST_EnvIntersects

通常,空間數據庫將比較交點的包絡(即包含多邊形的矩形)。然後它執行更昂貴的多邊形到多邊形的交點計算。在這種情況下,由於您的多邊形與信封相同,因此您可以跳過第二個昂貴的步驟。

至於數據驗證,您可以添加一個數據庫觸發器,檢查ST_EQUALS(ST_ENVELOPE(GEOM),GEOM)= 1

相關問題