В проекте, над которым я работал около 12 лет назад, я выполнил запрос по этим строкам, чтобы сократить список возможностей перед выполнением фактического расчета расстояния:
WHERE zip.lat < my.lat + 0.5 && zip.lat > my.lat - 0.5
&& zip.long < my.long + 0.5 && zip.long > my.long - 0.5
Из этого поднабора я вычисляюфактическое расстояние между двумя точками и сортировка по нему.Вам нужно будет откорректировать порцию «0,5», чтобы получить достаточно большую коробку, чтобы быть уверенным, что вы получите удар.
И я думаю, что есть лучший способ, чем STPointFromText
создать свой точечный объект.Не могли бы вы использовать STPointFromWKB
?Не могли бы вы преобразовать тип geography
один раз?
См. на этой странице пример создания вашей точки с помощью SET
.
DECLARE @p geography;
SET @p = geography::STGeomFromText('POINT(' + CAST(P.Longitude AS VARCHAR(20)) + ' ' + CAST(P.Latitude AS VARCHAR(20)) + ')', 4326);
SELECT TOP 1 ZC.ZipCode
FROM dbo.tZipCodeNoCity ZC
WHERE ZC.PointGeography.STDistance(@p)) < 150 * 1609.344
ORDER BY ZC.PointGeography.STDistance(@p))