2

我创建了一个表格,其中包含美国邮政编码以及这些邮政编码的纬度和经度。从经纬度我创建了一个地理专栏。我在那个地理列上创建了一个空间索引。我想将最近的 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 哈拉俄克拉荷马 OK 35.48330 -97.17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894.2236191955

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

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

4

1 回答 1

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 之间跳跃的情况下,我想知道是否存在奇怪的结果,因为我无法用上面的代码复制它。

于 2013-12-09T16:57:02.573 回答