Mise à jour du champ pour donner le nombre de points dans le polygone en utilisant STIntersects?

11

J'ai une couche de points (dbo.ptLayer)

  • Environ 1 million de points
  • Type de géométrie spatiale (dbo.ptLayer.geom)
  • Pas d'index spatial pour l'instant, mais il en créera un une fois la collecte des données terminée.

J'ai une couche polygonale (dbo.polygonLayer)

  • Environ 500 polygones.
  • Type de géométrie spatiale (dbo.polygonLayer.geom)

Les deux ont des champs appelés ID.

Comment remplir un champ entier vide dans la couche de polygones, avec un décompte du nombre total de points dans chaque polygone?

Bien que j'aie accès à d'autres logiciels, je souhaite savoir ce qui peut être fait uniquement dans SQL et SQL Server.

Je pense que je devrais utiliser STIntersects, mais j'aimerais savoir quelle est la meilleure façon de faire une mise à jour pour remplir ce champ.

Simon
la source

Réponses:

17

Cela devrait faire ce dont vous avez besoin:

Une requête de sélection:

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

Avec une mise à jour:

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

Ceci est le résultat de l'exécution de cette requête sur l'un de mes ensembles de données

entrez la description de l'image ici

Nathan W
la source