6

我有一个启用空间的数据库(在本例中为 DB2)。我需要在表格中存储大量正方形。哪种标准空间 SQL 数据类型最合适?

我想我可以使用ST_polygon,但也许有一种更专业的类型可以提供

  • 更好的性能
  • 更好的数据保证(如果有人在特定列中存储非平方值,我想将其视为错误)

我试图找到ST_rectangleST_square类型,但它们似乎不存在(?)

在我使用 DB2 的同时,我也对不适用于 DB2 的解决方案感兴趣,只要它们符合标准。

4

3 回答 3

4

即使您的数据表示矩形或正方形,您仍然需要使用 ST_POLYGON 类型。但是,当您对数据执行查询时,您可以使用一阶过滤器,例如ST_EnvIntersects

通常,空间数据库将比较交叉点的包络线(即包含多边形的矩形)。然后它执行更昂贵的多边形到多边形相交计算。在这种情况下,由于您的多边形等于包络,您可以跳过第二个更昂贵的步骤。

至于数据验证,您可以添加一个检查 ST_EQUALS(ST_ENVELOPE(geom),geom) = 1 的数据库触发器。

于 2009-08-28T15:56:31.860 回答
2

您可能正在寻找ST_Envelope —— 我不确定 DB2,但它是 OGC 标准的一部分。任何非垂直或非水平线或多边形都将通过此函数生成一个矩形,通常将坐标存储为浮点数。

于 2009-08-17T21:49:22.470 回答
2

在 DB2 中,它也是一个多边形。看起来您正在存储网格,因此快速检查可能是如果 ST_ENVELOPE(geometry) == geometry 那么您有一个正方形

这段代码来自

DB2 的文档

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(geometry)

于 2009-08-18T20:11:51.867 回答