空间SQL:正方形最适合的数据类型是什么?

6
我有一个支持空间查询的数据库(在这个例子中是DB2)。我需要在表格中存储大量正方形。哪种标准的空间SQL数据类型最适合?
我猜可以使用ST_polygon,但也许有一种更专业的类型能够提供:
1.更好的性能 2.更好的数据保证(如果有人在特定的列中存储非正方形值,则希望将其视为错误并捕获)
我尝试查找ST_rectangle或ST_square类型,但它们似乎不存在(?)
虽然我正在使用DB2,但我也对不使用DB2的解决方案感兴趣,只要它们符合标准。
3个回答

4
即使您的数据表示矩形或正方形,您仍需要使用ST_POLYGON类型。但是,在对数据执行查询时,您可以使用第一级过滤器,例如ST_EnvIntersects
通常,空间数据库将比较包含多边形的包络(即包含多边形的矩形)以进行交集计算。然后执行更昂贵的多边形对多边形的交集计算。在这种情况下,由于您的多边形等于包络,因此可以跳过第二个更昂贵的步骤。
至于数据验证,您可以添加一个数据库触发器来检查ST_EQUALS(ST_ENVELOPE(geom),geom) = 1。

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)


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

1
但是就我所看到的,ST_envolope是一个函数而不是一个类型? - Troels Arvin
抱歉,我刚刚删除了很多复杂的废话。在Postgis中,这些点被存储为float4序列,DB2可能也是类似的,或者可能是db2/Oracle中的某种“数字”类型。我猜所有的矩形都只是以某种基本的浮点类型存储的坐标,通过智能索引启用地理功能以进行常见的空间查询。 - unmounted
1
Troels是正确的。ST_ENVELOPE是一个返回ST_POLYGON的函数;ST_ENVELOPE不是一种类型。"float"优化是特定于PostGIS的。 - James Schek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接