2013-04-24 103 views
2

我创建了一个包含美国邮政编码以及这些邮政编码的经度和纬度的表格。从经纬度我创建了一个地理专栏。我在该地理栏目上创建了一个空间索引。我要到最近的100个邮政编码返回经度和纬度,所以我创建了以下存储过程SQL Server 2012空间索引最近邻居查询

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美国俄克拉何马州哈拉斯OK 35.48330 -97.17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894.2236191955

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

我读过MSDN,我的查询看起来正确。任何人都可以帮助我吗?

+0

[GeographyCol]是一个点还是其他一些对象?如果它是一个多边形,而你的纬度/经度为.EnvelopeCenter(),我可以想象一个距离......虽然可能不是56km。 – fortboise 2017-07-23 01:58:49

回答

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()计算将使用索引。因此,至少在这种情况下,如果没有看到索引并知道您至少在地理和几何之间跳跃,我不知道是否有奇怪的结果存在,因为我无法使用上面的代码复制它。