【问题标题】:select neighbour polygons in sql在sql中选择相邻多边形
【发布时间】:2016-05-18 12:50:40
【问题描述】:

我有一个包含几百万条记录的数据库(我国的所有房屋)。现在我想选择所有有相邻记录(附有房子)的记录,并给它一个状态“T”。每条记录都有一个几何列,如下所示:

POLYGON(( 254059.737 593504.637 0.0, 254059.227 593500.0 0.0, 254059.216 593499.899 0.0, 254058.242 593500.0 0.0, 254057.914 593500.034 0.0, 254057.893 593500.0 0.0, 254057.807 593499.863 0.0, 254052.074 593490.692 0.0, 254052.182 593490.639 0.0, 254058.138 593490.002 0.0, 254057.932 593488.165 0.0, 254074.487 593486.413 0.0, 254075.981 593500.0 0.0, 254076.265 593502.583 0.0, 254076.561 593502.55 0.0, 254076.594 593502.847 0.0, 254059.737 593504.637 0.0))

有没有可能用 sql 语句来做到这一点?我从来没有使用过 SQL,所以我是一个完整的菜鸟。最好有详细的解释。

我开始:

SELECT id, geometry, 'T'::text as type 
FROM houses 
WHERE

我想我必须在WHERE 子句中添加一些相交函数?

【问题讨论】:

标签: sql postgresql gis postgis


【解决方案1】:

看看ST_IntersectionST_Crosses

所以,我会做这样的事情:

SELECT DISTINCT
    h1.id,
    'T'::text as type
FROM
    houses h1,
    houses h2
WHERE
    h1.id <> h2.id and
    ST_Intersects(h1.geometry, h2.geometry)

【讨论】:

  • 感谢您的回复。但我有 800 万条记录。我不能写 'h1.id' 直到 'h8000000'。有没有自动的方法,对于每个房子,他检查它是否有一个具有相同线段的房子或其他东西?
  • 你不需要这样做,这个选择会收集每个有交叉点的房子几何图形,它会告诉你,哪个 id-s 与它们相交。因此,如果 id1 与 id2 和 id3 有交集,它将显示如下内容: row1: id1 | id2 | T;第 2 行:id1 | id3 | T;只需尝试限制为 100 的选择,您就会看到。
  • 我明白你的意思。尝试新的选择,我编辑了问题。这将选择每个 id,至少有一个相交的“邻居”。
  • 谢谢。我确实尝试过,但即使限制为 10,即使 10 分钟后查询仍在运行。不确定是因为我的数据集还是其他问题
  • 这个答案基本上是正确的,慢是另一回事,需要用索引来解决(但对于一个用于自连接的 800 万行表来说,这可能并不容易)
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 2014-12-17
  • 2012-11-07
  • 2017-09-22
  • 2013-07-23
  • 2014-08-04
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多