我有一个空间启用的数据库(在本例中为DB2)。我需要在表格中存储大量的正方形。哪种标准空间SQL数据类型最合适?
我想我可以使用 ST_polygon ,但也许有更专业的类型可以提供
我试图找到 ST_rectangle 或 ST_square 类型,但它们似乎不存在(?)
当我使用DB2时,我也对那些不适用于DB2的解决方案感兴趣,只要它们符合标准。
答案 0 :(得分:4)
即使您的数据表示矩形或方形,您仍需要使用ST_POLYGON类型。但是,当您对数据执行查询时,可以使用一阶过滤器,例如ST_EnvIntersects。
通常,空间数据库将比较交叉点的包络(即包含多边形的矩形)。然后它执行更昂贵的多边形到多边形的交叉计算。在这种情况下,由于您的多边形等于包络,您可以跳过第二个更昂贵的步骤。
就数据验证而言,您可以添加一个检查ST_EQUALS(ST_ENVELOPE(geom),geom)= 1的数据库触发器。
答案 1 :(得分:1)
您可能正在寻找ST_Envelope - 我不确定DB2,但它是OGC标准的一部分。任何非垂直或非水平线或多边形都将通过此函数生成矩形,通常将坐标存储为浮点数。
答案 2 :(得分:1)
在DB2中,它也是一个Polygon。看起来你正在存储网格,所以快速检查可能是如果ST_ENVELOPE(几何)==几何,那么你有一个正方形
此代码来自
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(几何)