2011-01-10 46 views
0

我有postgis 扩展名的postgres-db中有很多(1.000.000)ST_Points。当我在地图上显示他们时,浏览器变得非常忙碌。 为此,我想编写一个sql语句,将高密度过滤为只有一个点。
当用户缩小100个ST_Points时,postgres应该只返回一个。 但只有当这些点靠近在一起。
我这个说法试了一下:精简许多ST_Points

select a.id, count(*) 
from points as a, points as b 
where st_dwithin(a.location, b.location, 0.001) 
and a.id != b.id 
group by a.id 

我称之为薄了,但因此未找到任何东西 - 也许是因为我不 一个母语是英语。 有没有人有一些建议?

回答

0

您正在寻找的术语是“聚类”。

有这样做的client-side库,以及服务器端的commercial services

但这不是PostGIS本身的东西。 (这里有一个ticket。)

您可能必须编写自己的解决方案,并提前预先计算您的集群。

2

我同意tcarobruce聚类是你正在寻找的术语。但它在postgis中可用。

基本上可以通过减少X和Y中的小数位数并对它们进行分组来实现聚类;

select 
    count(*), 
    round(cast (ST_X(geom) as numeric),3) 
    round(cast (ST_Y(geom) as numeric),3) 
from mytable 
group by 
round(cast (ST_X(geom) as numeric),3), 
round(cast (ST_Y(geom) as numeric),3) 

这将导致一个表中的坐标和在该坐标上的实际点数。在这个特定的示例中,它将使您舍入小数点后3位,如您在初始语句中的0.001。

+1

例如,有一个用于该舍入的函数:ST_SnapToGrid(几何,0.001)。你也可以用更复杂的方式定义网格,参见doc。 – 2011-01-24 15:54:41