Pregunta

Tengo las siguientes dos tablas: -

GeoShapes

  • IDENTIDAD INTEGATALIGEA
  • Nombre VARCHAR (100)
  • GEOGRAFÍA ShapeFile [este es un Polígono cerrado de Lat / Longs]

CrimeLocations

  • CrimeLocationId INT IDENTITY
  • GEOGRAFÍA LatLong [este es un punto Lat / Long]

Ahora, tengo alrededor de 10K resultados de GeoShape y alrededor de 500CrimeLocations.

Estoy tratando de averiguar qué GeoShapes existen dentro de los 500 puntos de latitud / longitud del crimen.

:( ¡Simplemente no lo entiendo! Intenté hacer un STIntersects en una subconsulta pero eso no funcionó. ¿Alguna sugerencia?

¡salud!

EDITAR 1: No puedo usar ninguna función GEOMETRY ... porque (como se indicó anteriormente) todos estos son tipos de geografía.

EDIT 2: Sé cómo usar STContains y STIntersects . Por favor no proporcione ejemplos básicos de eso. Tengo más curiosidad por hacer una consulta compleja con la estructura de mi tabla, arriba.

¿Fue útil?

Solución

Con respecto a sus "ediciones", no es frecuente que vea una pregunta que incluya "no proporcione ...". ¿Seguramente cada poquito ayuda? Particularmente porque no nos ha mostrado lo que hace sabe sobre STContains o STIntersects (o Filter () para el caso) ...

De todos modos, tenía una base de datos de códigos postales y ubicaciones de tiendas a mano, así que cambié el nombre de las tablas / columnas para que coincidan con las suyas (luego tengo 6.535 CrimeLocatoins y 3.285 GeoShapes). Supongo que ya lo has descubierto, pero alguien más podría encontrar esto útil ...

La siguiente consulta devuelve el número de CrimeLocations en cada 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

Toma edades (como 20 minutos) porque no he configurado ningún índice geoespacial y mis ShapeFiles tienen un conteo de puntos alto, pero se ejecuta con éxito. Si quisiera restringir los resultados como sugiere:

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

Por supuesto, no desea codificar el número 500, por lo que puede agregar una subconsulta COUNT (*) FROM CrimeLocations allí, o una variable con el total de una consulta separada.

¿Es lo suficientemente complejo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top