Compartilhar via


Consultar dados espaciais de vizinho mais próximo

Uma consulta comum usada com dados espaciais é a consulta vizinho mais próxima. Consultas vizinhas mais próximas são usadas para localizar os objetos espaciais mais próximos de um objeto espacial específico. Por exemplo, um localizador de lojas para um site geralmente deve encontrar as localizações de loja mais próximas da localização do cliente.

Uma consulta vizinho mais próxima pode ser escrita em uma variedade de formatos de consulta válidos, mas para que a consulta Vizinho Mais Próximo use um índice espacial, a sintaxe a seguir deve ser usada.

Sintaxe

SELECT TOP ( number )  
        [ WITH TIES ]  
        [ * | expression ]   
        [, ...]  
    FROM spatial_table_reference, ...   
        [ WITH   
            (   
                [ INDEX ( index_ref ) ]   
                [ , SPATIAL_WINDOW_MAX_CELLS = <value>]   
                [ ,... ]   
            )   
        ]  
    WHERE   
        column_ref.STDistance ( @spatial_ object )   
            {   
                [ IS NOT NULL ] | [ < const ] | [ > const ]   
                | [ <= const ] | [ >= const ] | [ <> const ] ]   
            }  
            [ AND { other_predicate } ]   
    }  
    ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]  
[ ; ]  
  

Consulta vizinha mais próxima e índices espaciais

No SQL Server, as cláusulas TOP e ORDER BY são usadas para executar uma consulta de vizinho mais próximo em colunas de dados espaciais. A cláusula ORDER BY contém uma chamada ao método STDistance() para o tipo de dado espacial da coluna. A TOP cláusula indica o número de objetos a serem retornados para a consulta.

Os seguintes requisitos devem ser atendidos para que uma consulta de vizinho mais próximo use um índice espacial.

  1. Um índice espacial deve estar presente em uma das colunas espaciais, e o método STDistance() deve usar essa coluna nas cláusulas WHERE e ORDER BY.

  2. A TOP cláusula não pode conter uma PERCENT instrução.

  3. A WHERE cláusula deve conter um STDistance() método.

  4. Se houver vários predicados na cláusula WHERE, o predicado que contém o método STDistance() deverá ser ligado por uma conjunção AND aos outros predicados. O STDistance() método não pode estar em uma parte opcional da WHERE cláusula.

  5. A primeira expressão na ORDER BY cláusula deve usar o STDistance() método.

  6. A ordem de classificação para a primeira STDistance() expressão na ORDER BY cláusula deve ser ASC.

  7. Todas as linhas para as quais STDistance retorna NULL devem ser filtradas.

Aviso

Métodos que assumem geography ou geometry tipos de dados como argumentos retornarão NULL se os SRIDs não forem os mesmos para os tipos.

É recomendável que os novos mosaicos de índices espaciais sejam usados para índices utilizados em consultas de vizinho mais próximo. Para obter mais informações sobre mosaicos de índice espacial, consulte Dados Espaciais (SQL Server).

Exemplo

O exemplo de código a seguir mostra uma consulta vizinho mais próxima que pode usar um índice espacial. O exemplo usa a Person.Address tabela no AdventureWorks2012 banco de dados.

USE AdventureWorks2012  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
WHERE SpatialLocation.STDistance(@g) IS NOT NULL  
ORDER BY SpatialLocation.STDistance(@g);  
  

Crie um índice espacial na coluna SpatialLocation para ver como uma consulta vizinho mais próxima usa um índice espacial. Para obter mais informações sobre como criar índices espaciais, consulte Criar, Modificar e Remover Índices Espaciais.

Exemplo

O exemplo de código a seguir mostra uma consulta vizinho mais próxima que não pode usar um índice espacial.

USE AdventureWorks2012  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
ORDER BY SpatialLocation.STDistance(@g);  
  

A consulta não tem uma cláusula WHERE que usa STDistance() em uma forma especificada na seção de sintaxe, assim, a consulta não pode utilizar um índice espacial.

Consulte Também

Dados Espaciais (SQL Server)