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.

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top