Saya memiliki 150 juta poin dalam tabel poin dan ingin menemukan beberapa titik di luar geometri poligon yang diberikan. Saya tahu bahwa 99,9% poin berada dalam geometri poligon. Saya tertarik menemukan beberapa poin yang ada di luar poligon.
Permintaan terbaik saya saat ini menggunakan tabel PostGIS yang diindeks membutuhkan waktu sekitar 30 menit untuk menyelesaikannya. Apakah ada cara untuk mengoptimalkan kueri berikut mengetahui bahwa sebagian besar titik berada dalam poligon (perbatasan)?
SELECT COUNT(*)
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA';
Poligon pada dasarnya adalah admin 0 perbatasan Italia. Verteks - 405.000. Bagian - 510. Amplop ini jauh lebih besar dari poligon (Poligon mencakup 24% dari amplop)
postgis
postgresql
Prithvi
sumber
sumber
GROUP BY
kunci utama poin. (PostgreSQL memudahkan Anda untuk mereferensikan kolom apa pun dalamSELECT
klausa yang berasal dari tabel di mana kunci utama termasuk dalamGROUP BY
klausa.)ST_Within
sudah melakukan kotak centang batas yang memungkinkan untuk menggunakan indeks. (Hampir semua fungsi PostGIS menyertakan optimisasi ini.) Jika masih lambat, jelas masalahnya adalah dengan kompleksitas poligon.ST_Intersects
, karenaST_Within
tidak akan cocok dengan kondisi batas internal.Jawaban:
Gunakan ST_Subdivide untuk memotong poligon Anda menjadi poligon yang lebih kecil, menyimpannya ke sebuah tabel dan membuat indeks spasial. Kemudian lakukan kueri Anda pada poligon grid.
Tanpa itu, pengindeksan spasial tidak memberikan keuntungan apa pun dalam kasus Anda (hanya 1 poligon yang menarik).
sumber