Sql 2008 problema di query - quale LatLong esiste in un poligono geografico?
-
08-07-2019 - |
Domanda
Ho le seguenti due tabelle: -
GeoShapes
- GeoShapeId INT IDENTITY
- Nome VARCHAR (100)
- ShapeFile GEOGRAPHY [questo è un poligono chiuso di Lat / Longs]
CrimeLocations
- CrimeLocationId INT IDENTITY
- LatLong GEOGRAPHY [questo è un Lat / Long Point]
Ora ho circa 10K risultati GeoShape e circa 500CrimeLocations.
Sto cercando di capire quali GeoShapes esistono tutti e 500 i punti lat / long di crimine all'interno di.
:( Non capisco! Stavo provando a fare un STIntersects
su una subquery ma non ha funzionato. Qualche suggerimento?
evviva!
MODIFICA 1: Non posso usare alcuna funzione GEOMETRIA
.. perché (come detto sopra) questi sono tutti tipi di geografia.
EDIT 2: so come usare STContains
e STIntersects
. Si prega di non fornire esempi di base di ciò. Sono più curioso di fare una query complessa con la mia struttura di tabella, sopra.
Soluzione
Per quanto riguarda le tue "modifiche", non capita spesso di vedere una domanda che include " per favore non fornire ... " ;. Sicuramente ogni piccolo aiuto? In particolare dal momento che non ci hai effettivamente mostrato ciò che fai su STContains
o STIntersects
(o Filter ()
del resto) ...
Comunque, avevo a portata di mano un database di zipcode e storelocations, quindi ho rinominato le tabelle / colonne in modo che corrispondessero alle vostre (ho quindi 6.535 CrimeLocatoins e 3.285 GeoShapes). Presumo che tu l'abbia capito ormai - ma qualcun altro potrebbe trovarlo utile ...
La seguente query restituisce il numero di CrimeLocations in ogni 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
Ci vogliono età (come 20 minuti) perché non ho impostato alcun indice geospaziale e i miei ShapeFile hanno un conteggio punti elevato, ma funziona correttamente. Se volessi limitare i risultati come suggerisci:
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
Ovviamente non vuoi codificare il numero 500, quindi puoi aggiungere una sottoquery COUNT (*) FROM CrimeLocations
o una variabile con il totale da una query separata.
È abbastanza complesso?