Problème de requête SQL 2008 - quels LatLongs existent dans un polygone géographique?
-
08-07-2019 - |
Question
J'ai les deux tableaux suivants: -
GeoShapes
- IDENTITÉ GeoShapeId INT
- Nom VARCHAR (100)
- GEOGRAPHIE ShapeFile [il s’agit d’un polygone fermé de Lat / Longs]
CrimeLocations
- IDENTITÉ INT CrimeLocationId
- GÉOGRAPHIE LatLong [il s’agit d’un point lat / long]
Maintenant, j'ai environ 10K résultats GeoShape et environ 500CrimeLocations.
J'essaie de déterminer quels sont les GeoShapes des 500 points lat / long de criminalité qui se trouvent à l'intérieur de.
:( Je ne comprends pas! J'essayais de faire un STIntersects
sur une sous-requête, mais cela n'a pas fonctionné. Des suggestions?
acclamations!
EDIT 1: je ne peux utiliser aucune fonction GEOMETRY
.. car, comme indiqué ci-dessus, il s’agit de types géographiques.
EDIT 2: je sais comment utiliser STContains
et STIntersects
. S'il vous plaît ne pas fournir des exemples de base de cela. Je suis plus curieux sur le point de faire une requête complexe avec la structure de ma table ci-dessus.
La solution
En ce qui concerne vos "modifications", il est rare que vous voyiez une question comportant le libellé "Merci de ne pas fournir ...". Sûrement chaque petit geste aide? Surtout que vous ne nous avez pas réellement montré ce que vous faites sur STContains
ou STIntersects
(ou Filter ()
d'ailleurs) ...
Quoi qu’il en soit, j’avais une base de données contenant des codes postaux et des stockages, donc j’ai renommé les tables / colonnes pour les faire correspondre au vôtre (j’ai alors 6 535 CrimeLocatoins et 3 285 GeoShapes). Je présume que vous l’avez déjà compris, mais que d’autres trouveront peut-être cela utile ...
La requête suivante renvoie le nombre de CrimeLocations dans chaque fichier GeoShapes.ShapeFile
.SELECT G.Name, COUNT(CL.Id)
FROM GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
ORDER BY 2 DESC
Cela prend âges (environ 20 minutes) car je n'ai pas configuré d'index géospatial et mes ShapeFiles ont un nombre de points élevé, mais ils fonctionnent correctement. Si je voulais limiter les résultats comme vous le suggérez:
SELECT G.Name, COUNT(CL.Id)
FROM GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
HAVING COUNT(CL.Id) = 500
Bien sûr, vous ne voulez pas coder en dur le nombre 500. Vous pouvez donc ajouter une sous-requête COUNT (*) FROM CrimeLocations
ou une variable avec le total provenant d'une requête distincte.
Est-ce assez complexe?