Выполнение запроса для поиска ближайшего кратного (Lat, Long) из одного (Lat, Long) - PullRequest
0 голосов
/ 11 февраля 2019

Я делаю запрос ближайшей точки из одной точки.Вот последовательность.У меня есть несколько POI, хранящихся в MSSQLServer, и таблица dbo.Place.Вторая таблица - dbo.Position, в которой будет храниться собранная точка GPS.

Я использую хранимую процедуру, и LatLong of Position определен и доступен.Как сделать запрос, основанный на примерах ниже?

dbo.Place

Id   | Name   | Lat   | Long
1      POI1     1.735   4.73225
2      POI2     1.5665  3.9983
3      Tim2     1.4344  3.1282

Переменная Lat Long определяется в хранимой процедуре.Я хотел бы использовать следующую формулу, чтобы найти ближайшую точку, которую я возьму только из ближайших значений из 3 запросов (при условии, что данные выборки состоят из 3 строк)

SQRT(POW(X(`POI.Lat`) - 49.843317 , 2) + POW(Y(`POI.Long`) - 24.026642, 2)) * 100

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Помимо рекомендуемых типов географии, вы также можете достичь аналогичного результата, используя обычные типы данных, такие как float.

DECLARE @latitude FLOAT = 4.5678; -- Latitude of the place to search around
DECLARE @longitude FLOAT = 51.234; -- Longitude of the place to search around
DECLARE @range FLOAT = 100000; -- Max range in meters

SELECT TOP(1000)
    [place].[Lat],
    [place].[Long],
    ((((ACOS((SIN((PI() * [place].[Lat]) / 180.0) * SIN((PI() * @latitude) / 180.0)) + ((COS((PI() * [place].[Lat]) / 180.0) * COS((PI() * @latitude) / 180.0)) * COS((PI() * ([place].[Long] - @longitude)) / 180.0))) * 180.0) * 60.0) * 1.1515) * 1609.344) / PI() AS [Distance]
FROM [dbo].[Place] AS [place]
WHERE (((((ACOS((SIN((PI() * [place].[Lat]) / 180.0) * SIN((PI() * @latitude) / 180.0)) + ((COS((PI() * [place].[Lat]) / 180.0) * COS((PI() * @latitude) / 180.0)) * COS((PI() * ([place].[Long] - @longitude)) / 180.0))) * 180.0) * 60.0) * 1.1515) * 1609.344) / PI()) <= @range
ORDER BY [Distance]
0 голосов
/ 11 февраля 2019

Для этого вы можете использовать географические функции SQL Server.

DECLARE @InputLatitude FLOAT = 1.64
DECLARE @InputLongitude FLOAT = 4.25

DECLARE @GPS GEOGRAPHY = GEOGRAPHY::Point(@InputLatitude, @InputLongitude, 4326)

SELECT TOP 1
    P.*,
    Distance = @GPS.STDistance(GEOGRAPHY::Point(P.Lat, P.Long, 4326))
FROM
    dbo.Place AS P
ORDER BY
    @GPS.STDistance(GEOGRAPHY::Point(P.Lat, P.Long, 4326)) ASC

Вам следует рассмотреть возможность добавления столбца GEOGRAPHY в таблицу с уже преобразованными точками GPS и добавления SPATIAL INDEX для ускорения запросов..

...