【问题标题】:How to count rectangles that contain a point in sql如何计算包含sql中一个点的矩形
【发布时间】:2015-12-20 22:19:43
【问题描述】:

我在 SQL (Teradata) 中有以下问题。我在网格上得到了一系列(数千个)重叠的矩形。有没有一种有效的方法来存储矩形数据,以便只使用 SQL,我可以为每个点计算包含它的矩形数量?在某些情况下,我们谈论的是数千个矩形和数百万个点。一个小规模的例子:

在 5x5 网格上,在 (1,1,4,4) 和 (2,2,5,5) 处有两个坐标为 (x1,y1,x2,y2) 的矩形,生成的矩阵将是

11110
12221
12221
01111

我将如何使用 sql 进行计算?最终的数据格式将是一个包含“x”、“y”和“count”列的表格,其中 count 表示矩阵中 x,y 处的值

【问题讨论】:

  • 您听说过 OGC 简单功能标准吗?它定义了在关系数据库中存储空间数据的通用模型。我记得使用 PostGIS,它是 Postgres 标准的实现,并且有内置函数可以完全满足您的要求(查找包含在其中的元素、交叉点等)。我对 Teradata 了解不多,但this article 表示它符合标准。

标签: sql algorithm teradata


【解决方案1】:

您可以将矩形存储在表rects 中,其中列x1y1x2y2,即两对列,一个用于每个坐标。对于给定的点(x,y),您可以像这样检索包含它的矩形的数量:

SELECT COUNT(*) FROM rects WHERE x1 <= x AND x2 >=x AND y1 <= y AND y2 >= y

【讨论】:

  • 您的答案中没有包含使用过的索引。并且在 (x1, x2, y1, y2) 上使用简单的索引,除非矩形大小受到限制,否则它不会非常有效。
【解决方案2】:

抱歉,不熟悉 Teradata,但通常这种情况下你想要的是 R-Tree,而且 Teradata 似乎支持它 - http://www.info.teradata.com/HTMLPubs/DB_TTU_14_10/index.html#page/SQL_Reference/B035_1181_112A/Introduction.117.18.html#ww15453925

然后你做这样的事情(伪代码):

CREATE TABLE rects (
 id integer primary key,
 box RECTANGLE,
 INDEX `idx_box` (box) USING GIST
);

SELECT * FROM rects where ST_CONTAINS(box, POINT(x, y));

如果你的矩形的最大尺寸是有限的并且比整个区域小得多,那么像 lex82 的答案这样的简单方法只需稍加调整就可以正常工作(再次,伪代码):

CREATE TABLE rects (
  id integer primary key,
  x1 <whatever your coordinate type is>,
  x2 ...
  y1 ...
  y2 ...,
  INDEX (x1, y1)
)

SELECT COUNT(*) FROM rects 
  WHERE 
       x1 BETWEEN (x - MAX_RECT_SIDE) AND X  -- These 2 to hit the index
   AND y1 BETWEEN (y - MAX_RECT_SIDE) AND y
   AND (x2 >= x) AND (y2 >= y)

这里的想法是,如果已知最大矩形大小并且足够小,则基本上可以使用简单的 2 列数字索引为要查找的矩形的左上角设置一个边界框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2021-12-10
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多