2009-08-17 64 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

相关问题