Я создал таблицу, содержащую американские zipcodes, а также широту и долготу этих почтовых индексов. С широты и долготы я создал географическую колонку. Я создал пространственный индекс в этом столбце географии. Я хочу, чтобы вернуть ближайшие 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 US 73045 Harrah Oklahoma OK 35,48330 -97,17340 0xE6100000010C12143FC6DCBD4140174850FC184B58C0 55894,2236191955
в последней колонке расстояние. В основном запрос говорит, что эта запись почти на 56 км от введенной точки, но широта и долгота одинаковы.
Я прочитал MSDN, и мой запрос выглядит правильно. Кто-нибудь может мне помочь?
Является ли [ГеографияCol] точкой или каким-либо другим объектом? Если это многоугольник, а ваш lat/lng - это .EnvelopeCenter(), я могу себе представить расстояние ... хотя, вероятно, не 56 км. – fortboise