Aktualizujesz pole, aby podać liczbę punktów w wielokącie za pomocą STIntersects?

11

Mam warstwę punktów (dbo.ptLayer)

  • Około 1 mln punktów
  • Typ geometrii przestrzennej (dbo.ptLayer.geom)
  • Nie ma jeszcze indeksu przestrzennego, ale utworzy go po zakończeniu gromadzenia danych.

Mam warstwę wielokąta (dbo.polygonLayer)

  • Około 500 wielokątów.
  • Typ geometrii przestrzennej (dbo.polygonLayer.geom)

Oba mają pola o nazwie ID.

Jak wypełnić puste pole liczby całkowitej w warstwie wielokąta, zliczając całkowitą liczbę punktów w każdym wielokącie?

Mimo że mam dostęp do innych programów, chcę dowiedzieć się, co można zrobić wyłącznie w SQL i SQL Server.

Uważam, że powinienem korzystać z STIntersects, ale chciałbym wiedzieć, jaki jest najlepszy sposób przeprowadzenia aktualizacji w celu zapełnienia tego pola.

Szymon
źródło

Odpowiedzi:

17

To powinno zrobić, czego potrzebujesz:

Wybrane zapytanie:

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

Z aktualizacją:

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

Jest to wynik mojego uruchomienia zapytania w jednym z moich zestawów danych

wprowadź opis zdjęcia tutaj

Nathan W.
źródło