Apakah boleh mengelompokkan berdasarkan geometri di PostGIS?

17

Apakah boleh mengelompokkan berdasarkan geometri?

Kami melakukan banyak penghitungan poin dengan geometri poligon, yang melibatkan memotong data terlebih dahulu untuk menghitung instance siswa. menurut batas sekolah, kelompok blok, dll:

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

Langkah kedua adalah membungkus sub-kueri untuk bergabung dengan geometri dari tabel poligon kembali ke kueri hitung:

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

Tapi sepertinya Anda juga bisa menggunakan geometri dalam 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

Apakah termasuk geometri dalam GROUP BY pendekatan yang benar?

DPSSpatial
sumber
Apa untungnya bagi GROUP BYAnda? Bukankah itu bisa digabungkan dengan kunci unik nbhd_id? Anda membuat semacam itu lebih luas, yang meningkatkan runtime, mungkin lebih dari sekadar gabungan berikutnya.
Vince
1
Ini memungkinkan saya untuk tidak harus membungkus kueri hitung sebagai sub-kueri untuk bergabung di nbhd_id - jika itu meningkatkan runtime ke grup dengan geometri, maka itu adalah kemungkinan alasan untuk TIDAK melakukan ini, bukan begitu?
DPSSpatial

Jawaban:

18

Hampir tidak ada yang salah dengan pengelompokan berdasarkan geometri dalam kasus ini, karena Anda sudah dikelompokkan berdasarkan ID unik ( nbhd_id). Dan, seperti yang Anda tunjukkan, ini membuat Anda bergabung dan membuat kueri lebih bersih.

Penting untuk mengetahui bahwa GROUP BY geomklausa dalam PostGIS 2.3 dan sebelumnya sebenarnya mengelompokkan baris berdasarkan kesetaraan kotak pembatas, bukan persamaan geometrik. Dengan data nyata yang tidak dibuat-buat, ini sering memiliki efek yang sama dengan pengelompokan pada persamaan geometrik (dan jauh lebih cepat), tetapi mungkin tidak menghasilkan hasil yang diharapkan ketika beberapa poligon berbeda memiliki kotak pembatas yang sama. Dimulai pada PostGIS 2.4, GROUP BYberoperasi pada definisi yang kaku tentang persamaan geometrik, dengan mempertimbangkan titik awal dan orientasi geometri.

Karena Anda sudah dikelompokkan nbhd_id, Anda masih akan melihat baris terpisah walaupun dua poligon lingkungan yang berbeda berbagi kotak pembatas.

dbaston
sumber
apakah artikel dari Paul ini memiliki perubahan pada jawaban ini? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial