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 По идентификатору;

Другие вопросы по тегам