Memperbarui bidang untuk memberikan jumlah poin dalam poligon menggunakan STIntersects?

11

Saya memiliki layer poin (dbo.ptLayer)

  • Sekitar 1 juta poin
  • Tipe Geometri Spasial (dbo.ptLayer.geom)
  • Belum ada indeks spasial, tetapi akan membuat satu setelah pengumpulan data selesai.

Saya memiliki lapisan poligon (dbo.polygonLayer)

  • Sekitar 500 poligon.
  • Tipe Geometri Spasial (dbo.polygonLayer.geom)

Keduanya memiliki bidang yang disebut ID.

Bagaimana cara mengisi bidang bilangan bulat kosong di lapisan poligon, dengan jumlah total poin dalam setiap poligon?

Meskipun saya memiliki akses ke produk perangkat lunak lain, saya tertarik untuk mempelajari apa yang dapat dilakukan murni dalam SQL dan SQL Server.

Saya percaya saya harus memanfaatkan STIntersects tetapi ingin tahu apa cara terbaik untuk melakukan pembaruan untuk mengisi bidang ini.

Simon
sumber

Jawaban:

17

Ini harus melakukan apa yang Anda butuhkan:

Kueri pemilihan:

SELECT polygons.id, Count(*) 
FROM points
JOIN polygons
ON polygons.ogr_geometry.STContains(points.ogr_geometry) = 1
GROUP BY polygons.id

Dengan pembaruan:

UPDATE polygons
SET [countcolumn] = counts.pointcount
FROM polygons
JOIN
(
 SELECT polygons.id, Count(*) 
 FROM points
 JOIN polygons
 ON polygons.ogr_geometry.STContains(points.ogr_geometry) = 1
 GROUP BY polygons.id
) counts ON polygons.id = counts.id

Ini adalah hasil dari saya menjalankan kueri itu di salah satu dataset saya

masukkan deskripsi gambar di sini

Nathan W
sumber