我创建了一个包含美国邮政编码以及这些邮政编码的经度和纬度的表格。从经纬度我创建了一个地理专栏。我在该地理栏目上创建了一个空间索引。我要到最近的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,我的查询看起来正确。任何人都可以帮助我吗?
[GeographyCol]是一个点还是其他一些对象?如果它是一个多边形,而你的纬度/经度为.EnvelopeCenter(),我可以想象一个距离......虽然可能不是56km。 – fortboise 2017-07-23 01:58:49