代码之家  ›  专栏  ›  技术社区  ›  Troels Arvin

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

  •  5
  • Troels Arvin  · 技术社区  · 15 年前

    我有一个支持空间的数据库(在本例中是DB2)。我需要在一张桌子上储存大量的正方形。哪种标准空间SQL数据类型最适合?

    我想我可以用 圣保罗多边形 但是也许有一种更专业的类型

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

    我试着找到一个 矩形矩形 斯塔克广场 类型,但它们似乎不存在(?)

    当我使用DB2时,我也对那些不在DB2上工作的解决方案感兴趣,只要它们符合标准。

    3 回复  |  直到 15 年前
        1
  •  1
  •   rburhum    15 年前

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

    此代码来自

    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?最后一个多边形==st_信封(几何图形)

        2
  •  4
  •   James Schek    15 年前

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

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

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

        3
  •  1
  •   unmounted    15 年前

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