我该如何编写这个空间查询?

时间:2011-06-23 04:31:03

标签: sql postgresql gis postgis

我有以下表结构:

column names : cell    longitude latitude bcch   bsic
data types   : varchar double    double   double double 
Keys         : x       

我想知道所有

的细胞
  • 在10公里范围内彼此和
  • 拥有相同的bcch + bsic。

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

由于我对postgis的理解有限,可以自由地用“使用这个数据库表结构”开始你的答案,这样它就更加面向GIS(我相信有一个点而不是lat / long colums的概念)。我之前没有写过空间查询,正在考虑购买“PostGIS In Action”一书,但需要知道我想做的是否可行以及如何做。

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

1 个答案:

答案 0 :(得分:3)

尼,

这不是真的。一个要点指数在这里会有所帮助。

Basarat我不太清楚你期望的输出。这是每个单元格的查询 将返回那些在10公里以内的人。首先,您要添加地理列,然后创建它的要点索引。这在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