【问题标题】:How would I write this spatial query?我将如何编写这个空间查询?
【发布时间】:2011-06-23 04:31:03
【问题描述】:

我的表结构如下:

列名:单元格经度纬度bcch bsic 数据类型:varchar double double double double 键:x

我想知道所有的单元格是什么

  • 彼此相距 10 公里,并且
  • 具有相同的 bcch+bsic。

满足上述要求的空间 sql 查询是什么?

由于我对 postgis 的了解有限,请随意以“改用此数据库表结构”开始您的回答,以便它更面向 GIS(我相信存在点的概念,而不是纬度/经度列)。我以前没有写过空间查询,正在考虑购买“PostGIS In Action”一书,但需要知道我想要做的事情是否可行以及如何做。

另外我想提一下,我知道如何在标准 sql 中做到这一点。我需要一个空间查询,因为大约有 10000 条记录,并且使用标准的 sql 方法,我需要生成 10000*10000(每个单元格的所有其他单元格)记录,然后查询它们,这将是非常低效的。

【问题讨论】:

  • 如果您在整个表上运行此查询,我怀疑您是否会从 gist 索引中获得有意义的性能提升。在这种情况下,基本上每一行都将在连接的任一侧被考虑,因此您最终将整个表与其自身连接并实际处理 10k * 10k 行......如果 gist 索引会有所帮助你只是在考虑范围更窄的事情。

标签: sql postgresql gis postgis


【解决方案1】:

丹尼斯,

这不是真的。要点索引在这里会有所帮助。

Basarat 我不太清楚您期望的输出。这是每个单元格的查询 将返回那些在 10 公里以内的人。首先,您要添加一个地理列,然后为其创建一个 gist 索引。这在 PostGIS in Action 的第一章中有介绍。

假设您有一个名为 geog 的新列,您已在其中放置了一个 gist 索引。

那么您的查询将是

SELECT c.cell, array_agg(n.cell) As cells_close
FROM cells As c INNER JOIN cells As n ON ST_DWithin(c.geog, n.geog, 10000)
WHERE c.bsic = n.bsic  --other criteria go here
GROUP BY c.cell;

如果您不希望将输出作为数组 - 您可以这样做

array_to_string(array_agg(n.cell),',') As cell_comma_sep

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2015-10-19
    相关资源
    最近更新 更多