Query dei dati spaziali per Nearest NeighborQuery Spatial Data for Nearest Neighbor

La query Nearest Neighbor è una query comune utilizzata con dati spaziali.A common query used with spatial data is the Nearest Neighbor query. Le query Nearest Neighbor vengono utilizzate per trovare gli oggetti spaziali più vicini a un oggetto spaziale specifico.Nearest Neighbor queries are used to find the closest spatial objects to a specific spatial object. Un localizzatore di archivio per un sito Web, ad esempio, deve spesso trovare i percorsi di archivio più vicini alla posizione di un cliente.For example a store locater for a Web site often must find the closest store locations to a customer location.

Una query Nearest Neighbor può essere scritta in una varietà di formati di query validi, ma per l'utilizzo di un indice spaziale è necessario utilizzare la sintassi seguente.A Nearest Neighbor query can be written in a variety of valid query formats, but for the Nearest Neighbor query to use a spatial index the following syntax must be used.

SintassiSyntax

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 ]  
[ ; ]  

Query Nearest Neighbor e indici spazialiNearest Neighbor Query and Spatial Indexes

In SQL ServerSQL Servervengono usate le clausole TOP e ORDER BY per eseguire una query Nearest Neighbor nelle colonne di dati spaziali.In SQL ServerSQL Server, TOP and ORDER BY clauses are used to perform a Nearest Neighbor query on spatial data columns. La clausola ORDER BY contiene una chiamata al metodo STDistance() per il tipo di dati della colonna spaziale.The ORDER BY clause contains a call to the STDistance() method for the spatial column data type. La clausola TOP indica il numero di oggetti da restituire per la query.The TOP clause indicates the number of objects to return for the query.

Per utilizzare un indice spaziale in una query Nearest Neighbor, è necessario soddisfare i requisiti seguenti:The following requirements must be met for a Nearest Neighbor query to use a spatial index:

  1. In una delle colonne spaziali deve essere presente un indice spaziale e tale colonna deve essere usata dal metodo STDistance() nelle clausole WHERE e ORDER BY .A spatial index must be present on one of the spatial columns and the STDistance() method must use that column in the WHERE and ORDER BY clauses.

  2. La clausola TOP non può contenere un'istruzione PERCENT .The TOP clause cannot contain a PERCENT statement.

  3. La clausola WHERE deve contenere un metodo STDistance() .The WHERE clause must contain a STDistance() method.

  4. Se nella clausola WHERE sono presenti più predicati, il predicato che contiene il metodo STDistance() deve essere connesso con una congiunzione AND ad altri predicati.If there are multiple predicates in the WHERE clause then the predicate containing STDistance() method must be connected by an AND conjunction to the other predicates. Il metodo STDistance() non può trovarsi in una parte facoltativa della clausola WHERE .The STDistance() method cannot be in an optional part of the WHERE clause.

  5. La prima espressione nella clausola ORDER BY deve usare il metodo STDistance() .The first expression in the ORDER BY clause must use the STDistance() method.

  6. L'ordinamento per la prima espressione STDistance() nella clausola ORDER BY deve essere ASC.Sort order for the first STDistance() expression in the ORDER BY clause must be ASC.

  7. Devono essere filtrate tutte le righe per le quali STDistance restituisce NULL .All the rows for which STDistance returns NULL must be filtered out.

Avviso

I metodi che accettano tipi di dati geography o geometry come argomenti restituiranno NULL se gli identificatori SRID non sono gli stessi per i tipi.Methods that take geography or geometry data types as arguments will return NULL if the SRIDs are not the same for the types.

Per gli indici utilizzati nelle query Nearest Neighbor è consigliabile utilizzare i nuovi schemi a mosaico di indice spaziale.It is recommended that the new spatial index tessellations be used for indexes used in Nearest Neighbor queries. Per altre informazioni sugli schemi a mosaico di indice spaziale, vedere Dati spaziali (SQL Server).For more information on spatial index tessellations, see Spatial Data (SQL Server).

EsempioExample

Nell'esempio di codice seguente viene illustrata una query Nearest Neighbor nella quale può essere utilizzato un indice spaziale.The following code example shows a Nearest Neighbor query that can use a spatial index. Nell'esempio viene utilizzata la tabella Person.Address del database AdventureWorks2012 .The example uses the Person.Address table in AdventureWorks2012 database.

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);  

Creare un indice spaziale nella colonna SpatialLocation per vedere in che modo viene utilizzato un indice spaziale in una query Nearest Neighbor.Create a spatial index on the column SpatialLocation to see how a Nearest Neighbor query uses a spatial index. Per ulteriori informazioni sulla creazione di indici spaziali, vedere Create, Modify, and Drop Spatial Indexes.For more information on creating spatial indexes, see Create, Modify, and Drop Spatial Indexes.

EsempioExample

Nell'esempio di codice seguente viene illustrata una query Nearest Neighbor nella quale non può essere utilizzato un indice spaziale.The following code example shows a Nearest Neighbor query that cannot use a spatial index.

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);  

Nella query manca una clausola WHERE che usa STDistance() in un formato specificato nella sezione relativa alla sintassi, quindi la query non può usare un indice spaziale.The query lacks a WHERE clause that uses STDistance() in a form specified in the syntax section so the query cannot use a spatial index.

Vedere ancheSee Also

Dati spaziali (SQL Server)Spatial Data (SQL Server)