PostGISでジオメトリごとにグループ化しても大丈夫ですか?


17

ジオメトリでグループ化しても大丈夫ですか?

ポリゴンジオメトリで多くのポイントをカウントします。これには、学生のインスタンスをカウントするために最初にデータを交差させることが含まれます。学校の境界、ブロックグループなど:

SELECT
  n.nbhd_id
  , count(*) AS count_burglaries
FROM denver.crime AS c
  JOIN denver.neighborhoods AS n
    ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

2番目のステップは、ポリゴンテーブルからジオメトリをカウントクエリに結合するために、サブクエリをラップすることです。

SELECT

count.*
, n.nbhd_name
, n.geom
FROM (
SELECT
n.nbhd_id
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

) AS count

JOIN denver.neighborhoods AS n
ON count.nbhd_id = n.nbhd_id

ただし、GROUP BYでジオメトリを使用することもできます。

SELECT
n.nbhd_id
, n.nbhd_name
, n.geom

, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id, nbhd_name, n.geom

GROUP BYにジオメトリを含めることは正しいアプローチですか?


何がGROUP BY得られますか?の一意のキーで結合できませんnbhd_idか?ソートの幅を広げているため、おそらく後続の結合以上に実行時間が長くなります。
ビンス

1
nbhd_idで結合するサブクエリとしてカウントクエリをラップする必要はありません-ランタイムをジオメトリごとにグループ化する場合、これをしない理由として考えられますか?
DPSSpatial

回答:


18

一意のID(nbhd_id)で既にグループ化されているため、この場合、ジオメトリによるグループ化にはほとんど間違いなく問題はありません。そして、あなたが指摘するように、それはあなたに結合を保存し、クエリをきれいにします。

GROUP BY geomPostGIS 2.3以前の節では、実際には幾何学的等式ではなく、境界ボックスの等式に基づいて行がグループ化されることを知っておくことが重要です。実際のデータではないため、これは多くの場合、幾何学的等値のグループ化と同じ効果があります(そして、はるかに高速です)が、複数の異なるポリゴンが同じ境界ボックスを持つ場合、期待した結果を生成しない場合があります。PostGIS 2.4以降でGROUP BYは、ジオメトリの開始点と方向を考慮して、幾何学的等値の厳密な定義に基づいて動作します。

既にグループ化されているためnbhd_id、2つの異なる近隣ポリゴンが境界ボックスを共有している場合でも、別々の行が表示されます。


ポールからのこの記事は、この答えに何か変化がありますか?blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.