Pergunta

Eu tenho duas tabelas a seguir: -

GeoShapes

  • GeoShapeId INT IDENTIDADE
  • Nome VARCHAR (100)
  • ShapeFile GEOGRAFIA [este é um polígono fechado de Lat / Longs]

CrimeLocations

  • CrimeLocationId INT IDENTIDADE
  • LatLong GEOGRAFIA [este é um Lat / Long Point]

Agora, eu tenho em torno de resultados 10K GeoShape e ao redor 500CrimeLocations.

Eu estou tentando descobrir qual GeoShapes todos os 500 crime lat / pontos longos existir dentro de.

:( Eu só não entendi! Eu estava tentando fazer um STIntersects em uma subconsulta, mas que não funcionou. Alguma sugestão?

aplausos!

EDIT 1:. Eu não pode usar quaisquer funções GEOMETRY .. porque (como dito acima) estes são todos os tipos de geografia

EDIT 2: Eu sei como usar STContains e STIntersects. Por favor, não fornecem exemplos básicos do que isso. Eu estou mais curioso sobre a fazer uma consulta complexa com a minha estrutura da tabela, acima.

Foi útil?

Solução

Quanto às suas 'edições', não é muitas vezes você vê uma pergunta que inclui "não forneça ...". Certamente cada pouco ajuda? Particularmente desde que você não tem realmente nos mostraram o que você do saber sobre STContains ou STIntersects (ou Filter() para que o assunto) ...

De qualquer forma, eu tinha um banco de dados de códigos postais e storelocations acessível, então eu renomeado as tabelas / colunas para combinar seu (Em seguida, tenho 6,535 CrimeLocatoins e 3.285 GeoShapes). Eu presumo que você já percebi isso por agora - mas alguém pode encontrar este útil ...

Os seguintes retornos de consulta o número de CrimeLocations em 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

É preciso idades (como 20 minutos) porque eu não tenho a configuração quaisquer índices geoespaciais e meus shapefiles têm um alto ponto de contagem, mas é executado com êxito. Se eu quisesse restringir os resultados como você sugere:

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

É claro que você não quer para codificar o número 500 -. Assim você pode adicionar uma subconsulta COUNT(*) FROM CrimeLocations lá, ou uma variável com o total a partir de uma consulta separada

Isso é suficiente complexo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top