SQL Server 2012空间索引最近邻查询

时间:2013-04-24 16:58:17

标签: sql-server-2012 spatial-query

我创建了一个包含美国邮政编码的表格以及这些邮政编码的纬度和经度。从纬度和经度我创建了一个地理专栏。我在该地理专栏上创建了一个空间索引。我想将最近的100个邮政编码返回到纬度和经度,因此我创建了以下存储过程

CREATE PROCEDURE [dbo].[Geo_Locate]
@Latitude DECIMAL,
@Longitude DECIMAL
AS
BEGIN
SET NOCOUNT ON;

DECLARE @GeogTemp NVARCHAR(200)
DECLARE @Geog GEOGRAPHY

-- Create a geography type variable from the passed in latitude and longitude. This will be used to find the closest point in the database
SET @GeogTemp = 'POINT(' + convert(NVARCHAR(100), @Longitude) + ' ' + convert(NVARCHAR(100), @Latitude) + ')'
SET @Geog = geography::STGeomFromText(@GeogTemp, 4326)

-- Run the main query
SELECT TOP 100
    [Id],
    [Country],
    [ZipPostalCode],
    [City],
    [County],
    [Latitude],
    [Longitude],
    [GeographyCol],
    GeographyCol.STDistance(@Geog) AS Distance
FROM 
    [dbo].[ZipCode] WITH(INDEX(ZipCode_SpatialIndex))
WHERE 
    GeographyCol.STDistance(@Geog) < 100000     -- 100 KM
ORDER BY
    GeographyCol.STDistance(@Geog) ASC
END

但是,当我将纬度= 35.48330和经度= -97.17340传递给此存储过程时,我会在第55项返回以下内容

869531 US 73045 Harrah Oklahoma OK 35.48330 -97.17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894.2236191955

最后一列是距离。基本上,查询说这条记录距离输入点差不多是56KM,但纬度和经度是相同的。

我已阅读MSDN,我的查询看起来是正确的。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

这个很糟糕,我不确定我是不是。我开始尝试用最纯粹的术语复制你所看到的内容:两个地理点之间的STDistance()不正确。

DECLARE @zipcode geography
DECLARE @searchpoint geography
SET @zipcode = geography::STPointFromText('POINT(-97.17340 35.48330)', 4326);
SET @searchpoint = geography::STPointFromText('POINT(-97.17340 35.48330)', 4326);

SELECT @zipcode.STDistance(@searchpoint)

结果是,正确地,0米(SRID 4326使用米作为距离单位),所以我一直在挠头。我注意到我唯一无法复制的是:你在地理和几何之间翻转(你​​的代码来自问题):

SET @Geog = geography::STGeomFromText(@GeogTemp, 4326)

当我把它插入我的代码时,我的距离仍然是0。所以我唯一的问题,也许你可以发布T-SQL,是关于你的空间索引。我认为STDistance()计算将使用索引。因此,至少在这种情况下,如果没有看到索引并且知道你在Geography和Geometry之间跳过,我会想知道奇怪的结果是否在那里,因为我不能用上面的代码复制它。