Как рассчитать расстояние между несколькими точками в SQL Server?

У меня есть таблица с данными GPS, например: Latitude, Longitude, Time, UserId

Как агрегировать общее расстояние за указанный период времени, суммируя все расстояния по всем точкам (упорядоченным по времени) и группируя данные по пользователю?

Спасибо


person norcis    schedule 22.02.2013    source источник
comment
Для расчета расстояния вы можете посмотреть ‹williams.best.vwh.net/ avform.htm#Расстояние  -  person PM 77-1    schedule 23.02.2013


Ответы (2)


Если вы используете SQL Server, вам может быть интересно использовать тип данных geography, чтобы вы могли запрашивать базу данных с помощью специального метода и географического индекса.

Тип данных geography доступен начиная с SQL Server 2008, дополнительную информацию можно найти здесь:

http://msdn.microsoft.com/en-us/library/cc280766.aspx

Получив данные в столбец geography, вы сможете рассчитать расстояние между двумя точками с помощью методов STDistance(), см. MSDN:

http://msdn.microsoft.com/en-us/library/bb933808.aspx

Вот пример, где STDistance() используется для вычисления расстояния (с географической деформацией) между двумя точками, возвращаемого в метрах (международная стандартная единица):

DECLARE @pointA geography;
DECLARE @pointB geography;
SET @pointA = geography::STGeomFromText('POINT(-122.34900 50)', 4326);
SET @pointB = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @pointA.STDistance(@pointB);

Если вы используете SQL Server 2005 (или хотите избежать использования типа данных geography), вы можете взглянуть на проект MsSQLSpatial в CodePlex, доступный здесь: http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

person Nicolas Boonaert    schedule 25.02.2013
comment
И по какой-то причине STDistance чувствителен к регистру. - person David; 25.07.2017
comment
Фактическая причина связана с реализацией .Net, лежащей в основе пространственных функций (то же самое для географии или геометрии). Фактически, OGC определяет, что в стандарте должно быть ST_Distance, который, я думаю, был адаптирован к обычному соглашению SQL Server. - person Nicolas Boonaert; 26.07.2017

Функция ниже дает расстояние между двумя геокоординатами в милях

create function [dbo].[fnCalcDistanceMiles] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4))
returns decimal (8,4) as
begin
declare @d decimal(28,10)
-- Convert to radians
set @Lat1 = @Lat1 / 57.2958
set @Long1 = @Long1 / 57.2958
set @Lat2 = @Lat2 / 57.2958
set @Long2 = @Long2 / 57.2958
-- Calc distance
set @d = (Sin(@Lat1) * Sin(@Lat2)) + (Cos(@Lat1) * Cos(@Lat2) * Cos(@Long2 - @Long1))
-- Convert to miles
if @d <> 0
begin
set @d = 3958.75 * Atan(Sqrt(1 - power(@d, 2)) / @d);
end
return @d
end 

Функция ниже дает расстояние между двумя геокоординатами в километрах

CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT 
AS
BEGIN

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END

Использование:

select [dbo].[fnCalcDistanceKM](13.077085,80.262675,13.065701,80.258916)

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

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);

Ссылка: Ref1,Ref2

надеюсь, это поможет

person Durai Amuthan.H    schedule 20.03.2014
comment
Обратите внимание, что расчеты сфероидов, подобные этим, имеют точность около 10 метров на тысячи километров. Если требуется более высокая точность, используйте алгоритмы Винсенти или Карни. - person N8allan; 29.08.2014
comment
@N8allan Спасибо за указание на алгоритмы Винсенти и Карни - person Durai Amuthan.H; 29.08.2014
comment
@N8allan N8allan Я не смог найти SQL-скрипты для этого алгоритма. Я собираюсь попытаться преобразовать алгоритм в сценарии SQL, когда у меня будет свободное время. - person Durai Amuthan.H; 29.08.2014