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

Sql server 2012 SQL Server 2012空间索引最近邻查询,sql-server-2012,spatial-query,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 G

我已经创建了一个包含美国邮政编码以及这些邮政编码的纬度和经度的表格。根据纬度和经度,我创建了一个地理列。我在地理栏上创建了一个空间索引。我想返回最接近纬度和经度的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美国73045哈拉俄克拉荷马州35.48330-97.17340 0xE6100000010C1214FC6DCBD4140174850FC184B58C0 55894.2236191955

最后一列是距离。基本上,查询的意思是该记录距离输入点近56公里,但纬度和经度相同


我已经阅读了MSDN,我的查询看起来是正确的。谁能帮帮我吗?

这一个太糟糕了,我不确定我是否拿到了。我开始尝试用最纯粹的术语复制你们看到的东西:两个地理点之间的距离不正确

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米SRID4326使用米作为距离单位,所以我一直挠头。我注意到的唯一一件我无法复制的事情是:您在地理和几何之间切换您的问题代码:

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

当我把它输入代码时,距离仍然是0。所以我唯一的问题,也许你可以发布T-SQL,是关于你的空间索引。我认为STDistance计算将使用索引。因此,如果没有看到索引,也不知道您至少在本例中在地理和几何之间跳跃,我会怀疑是否存在奇怪的结果,因为我无法用上面的代码复制它。

地理坐标是点还是其他对象?如果它是一个多边形,而你的lat/lng是.EnvelopeCenter,我可以想象一段距离。。。虽然可能不是56公里。