T-SQL: поиск ближайшего местоположения объекта в сетке карты
У меня есть сетка, показывающая на карте. Я знаю ваше местоположение и местоположение 2 объектов на карте. Объекты появляются там, где пересекаются линии сетки. Представьте, что мир плоский, а не круглый, поскольку область на карте находится на небольшом расстоянии. Я хочу определить, какой объект ближе всего к вам без использования тригонометрии и умножения по соображениям производительности. Я не столько ищу точность, сколько просто получаю приблизительное указание. Я должен быть в состоянии определить кратчайшее расстояние между разницей в широте и долготе от моего текущего местоположения. Моя таблица Locations выглядит следующим образом:
ID Latitude Longitude
1 50 70
2 30 40
Если мое местоположение - Широта = 40 и Долгота = 60, то местоположение с ID = 1 будет ближе ко мне.
Если мое местоположение - Широта = 30 и Долгота = 60, вероятно, оба местоположения находятся примерно на одном и том же расстоянии, поэтому просто выберите одно.
Если мое местоположение - широта = 30 и долгота = 50, то местоположение с ID = 2 будет ближе.
3 ответа
Я бы просто сделал минимум суммы различий. Я попробовал это, и это работает довольно хорошо.
SELECT MIN(ABS(s.Latitude - 47) + ABS(s.Longitude - -122)), s.ID FROM Sites as s Group By ID;
Вам действительно нужно использовать некоторую тригонометрию, чтобы получить любую точность:
DECLARE @LocationTable TABLE(ID int, Latitude int, Longitude int)
INSERT INTO @LocationTable(ID, Latitude, Longitude)
VALUES
(1,50,70),
(2,30,40)
DECLARE
@MyLatitude int = 90,
@MyLongitude int = 40
WITH DistanceTable AS
(
SELECT ID, Latitude, Longitude,
SQRT(POWER(Latitude - @MyLatitude,2) + POWER(Longitude - @MyLongitude, 2)) AS Distance
FROM @LocationTable
)
SELECT ODT.ID, ODT.Latitude, ODT.Longitude, ODT.Distance
FROM (SELECT ID, Latitude, Longitude, Distance, ROW_NUMBER() OVER(ORDER BY Distance) AS Position
FROM DistanceTable) AS ODT
WHERE ODT.Position = 1;
ВЫБЕРИТЕ МИН (((s.Latitude - @lat)(s.Latitude - @lat)) + ((s.Longitude - @lon)(s.Longitude - @lon))), s.ID ИЗ сайтов в качестве группы s По идентификатору;