2011-01-10 8 views
0

postgres 拡張子を持つpostgres-dbには、(1.000.000)個のST_Pointがあります。私はそれらを地図上に表示すると、ブラウザが非常に忙しくなっています。 そのために、高密度を1つの点にフィルタリングするSQL文を記述したいと思います。
ユーザーが100 ST_Pointsをズームアウトすると、postgresは1つだけ戻します。 しかし、これらのポイントが接近している場合のみ。
私はこの文でそれを試してみました:多くの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 

私は間引きそれを呼び出すが、何かを見つけるdidnotだろう - 私は英語のネイティブスピーカー じゃないかもしれないので。 誰か提案がありますか?

答えて

0

あなたが探している用語は「クラスタリング」です。

これを行うためのライブラリはclient-sideであり、サーバー側ではcommercial servicesです。

しかし、それはPostGISが本来行うことではありません。 ticketがあります。

あなた自身で解決策を作成し、事前にクラスタを事前に計算する必要があります。

2

私はtcarobruceに、クラスタリングがあなたが探している用語であることに同意します。しかし、それは郵便物で利用可能です。

基本的にクラスタリングは、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小数点以下を四捨五入します。

+1

この丸めのための関数があります。たとえば、ST_SnapToGrid(geometry、0.001)です。より複雑な方法でグリッドを定義することもできます(docを参照)。 –