¿Actualizando el campo para dar recuento de puntos en el polígono usando STIntersects?

11

Tengo una capa de puntos (dbo.ptLayer)

  • Alrededor de 1 millón de puntos
  • Tipo de geometría espacial (dbo.ptLayer.geom)
  • Todavía no hay índice espacial, pero creará uno una vez que se complete la recopilación de datos.

Tengo una capa de polígono (dbo.polygonLayer)

  • Alrededor de 500 polígonos.
  • Tipo de geometría espacial (dbo.polygonLayer.geom)

Ambos tienen campos llamados ID.

¿Cómo rellenar un campo entero vacío en la capa de polígono, con un recuento del número total de puntos dentro de cada polígono?

Aunque tengo acceso a otros productos de software, estoy interesado en aprender qué se puede hacer únicamente dentro de SQL y SQL Server.

Creo que debería estar haciendo uso de STIntersects, pero me gustaría saber cuál es la mejor manera de hacer una actualización para completar este campo.

Simón
fuente

Respuestas:

17

Esto debería hacer lo que necesita:

Una consulta de selección:

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

Con una actualización:

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

Este es el resultado de mi ejecución de esa consulta en uno de mis conjuntos de datos

ingrese la descripción de la imagen aquí

Nathan W
fuente