Interroger des données spatiales au sujet du plus proche voisin

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Une requête courante utilisée avec les données spatiales est la requête Plus proche voisin. Les requêtes Plus proche voisin sont utilisées pour trouver les objets spatiaux les plus proches d'un objet spatial spécifique. Par exemple, le localisateur de magasin d'un site Web doit souvent trouver les magasins les plus proches de l'emplacement d'un client.

Une requête Plus proche voisin peut être écrite dans divers formats de requête valides, mais pour qu'elle utilise un index spatial, la syntaxe suivante doit être utilisée.

Syntaxe

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

Requête Plus proche voisin et index spatiaux

Dans SQL Server, les clauses TOP et ORDER BY sont utilisées pour effectuer une requête voisin la plus proche sur les colonnes de données spatiales. La clause ORDER BY contient un appel à la méthode STDistance() pour le type de données de colonne spatiale. La clause TOP indique le nombre d'objets à retourner pour la requête.

Les conditions suivantes doivent être respectées pour qu'une requête Plus proche voisin utilise un index spatial :

  1. Un index spatial doit être présent sur l’une des colonnes spatiales et la méthode STDistance() doit utiliser cette colonne dans les clauses WHERE et ORDER BY .

  2. La clause TOP ne peut pas contenir d'instruction PERCENT .

  3. La clause WHERE doit contenir une méthode STDistance() .

  4. S’il existe plusieurs prédicats dans la clause WHERE , le prédicat qui contient la méthode STDistance() doit être connecté par une conjonction AND aux autres prédicats. La méthode STDistance() ne doit pas se trouver dans une partie facultative de la clause WHERE .

  5. La première expression dans la clause ORDER BY doit utiliser la méthode STDistance() .

  6. L’ordre de tri de la première expression STDistance() dans la clause ORDER BY doit être ASC.

  7. Toutes les lignes pour lesquelles STDistance retourne NULL doivent être éliminées par filtrage.

Avertissement

Les méthodes qui prennent les types de données geography ou geometry comme arguments retournent NULL si les SRID ne sont pas les mêmes pour les types.

Il est recommandé d'utiliser les nouveaux pavages d'index spatial pour les index utilisés dans les requêtes Plus proche voisin. Pour plus d’informations sur les pavages d’index spatiaux, consultez Données spatiales (SQL Server).

Exemple 1

L'exemple de code suivant montre une requête Plus proche voisin qui peut utiliser un index spatial. L’exemple utilise la Person.Address table dans l’exemple AdventureWorks2022 de base de données.

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

Créez un index spatial sur la colonne SpatialLocation pour voir comment une requête Plus proche voisin utilise un index spatial. Pour plus d'informations sur la création d'index spatiaux, consultez Create, Modify, and Drop Spatial Indexes.

Exemple 2

L'exemple de code suivant montre une requête Plus proche voisin qui ne peut pas utiliser un index spatial.

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

La requête n’a pas de clause WHERE qui utilise STDistance() au format spécifié dans la section Syntaxe ; la requête ne peut donc pas utiliser d’index spatial.

Voir aussi

Données spatiales (SQL Server)