查询最近邻的空间数据

与空间数据一起使用的常见查询是最接近的邻居查询。 最近的邻居查询用于查找与特定空间对象最近的空间对象。 例如,网站的商店定位器通常必须查找离客户位置最近的商店位置。

最接近的邻居查询可以采用各种有效的查询格式编写,但对于最接近的邻居查询,必须使用空间索引,因此必须使用以下语法。

语法

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

最近的邻居查询和空间索引

在 SQL Server 中,TOPORDER BY 子句用于对空间数据列执行最近邻查询。 ORDER BY 子句包含对空间列数据类型的 STDistance() 方法的调用。 该 TOP 子句指示要为查询返回的对象数。

使用空间索引的最近邻查询必须满足以下要求:

  1. 空间索引必须存在于其中一个空间列上,并且STDistance()方法必须在WHEREORDER BY子句中使用该列。

  2. 子句 TOP 不能包含 PERCENT 语句。

  3. WHERE 句必须包含一个 STDistance() 方法。

  4. 如果WHERE子句中有多个谓词,包含STDistance()方法的谓词必须通过AND连词与其他谓词连接。 该STDistance()方法不能位于WHERE子句的可选部分。

  5. ORDER BY 子句中的第一个表达式必须使用 STDistance() 方法。

  6. 子句中第一个 STDistance() 表达式的 ORDER BY 排序顺序必须为 ASC

  7. 所有 STDistance 返回 NULL 的行都必须被筛选掉。

警告

如果给出的数据类型 geographygeometry 的 SRID 不相同,以这些类型作为参数的方法将返回 NULL

建议将新的空间索引分割用于近邻查询中使用的索引。 有关空间索引分割的详细信息,请参阅空间数据(SQL Server)。

示例:

下面的代码示例演示了可以使用空间索引的近邻查询。 该示例使用数据库中的Person.AddressAdventureWorks2012表。

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

在 SpatialLocation 列上创建空间索引,以查看近邻查询如何使用空间索引。 有关创建空间索引的详细信息,请参阅 创建、修改和删除空间索引

示例:

下面的代码示例演示了无法使用空间索引的近邻查询。

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

查询缺少一个在语法节中指定格式中使用的子句STDistance(),因此查询不能使用空间索引。

另请参阅

空间数据(SQL Server)