Partager via


Interroger des données spatiales pour un voisin le plus proche

S’applique à : point de terminaison d’analytique SQL Azure SQL Database Azure SQL Database Azure SQL Dans Microsoft Fabric Warehouse dans Microsoft Fabric SQL Database dans Microsoft Fabric SQL Database

Une requête courante utilisée avec les données spatiales est la requête voisine la plus proche. Les requêtes voisines les plus proches sont utilisées pour rechercher les objets spatiaux les plus proches d’un objet spatial spécifique. Par exemple, un localisateur de magasin pour un site web doit souvent trouver les emplacements de magasin les plus proches d’un emplacement client.

Une requête voisine la plus proche peut être écrite dans différents formats de requête valides, mais pour que la requête voisine la plus proche 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êtes et index spatiaux voisins les plus proches

Dans SQL Server, TOP et ORDER BY les clauses sont utilisées pour effectuer une requête voisine 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 spatial. La clause TOP indique le nombre d'objets à retourner pour la requête.

Les conditions suivantes doivent être remplies pour qu’une requête voisine la plus proche 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 des types de données geography ou geometry en tant qu’arguments retournent NULL si les SRID ne sont pas identiques pour les types.

Il est recommandé d’utiliser les nouvelles pavages d’index spatiaux pour les index utilisés dans les requêtes voisines les plus proches. Pour plus d’informations sur les pavages d’index spatiaux, consultez Données spatiales.

Exemple 1

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

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 voisine la plus proche 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 voisine la plus proche 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.