Как рассчитать расстояние между несколькими точками в SQL Server?
У меня есть таблица с данными из GPS, например: Latitude
, Longitude
, Time
, UserId
Как суммировать общее расстояние в заданном временном интервале, суммируя все расстояния на все точки (упорядоченные по времени) и данные группы пользователем?
Спасибо
Ответы
Ответ 1
Если вы используете SQL Server, вам может быть интересно использовать тип данных географии, чтобы вы могли запросить базу данных с использованием выделенного метода и географического индекса.
Тип данных географии доступен с SQL Server 2008, здесь вы можете получить дополнительную информацию:
http://msdn.microsoft.com/en-us/library/cc280766.aspx
Как только вы получите данные в столбце географии, вы сможете рассчитать расстояние между двумя точками, используя методы 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 (или хотите избежать использования типа данных географии), вы можете взглянуть на проект MsSQLSpatial на CodePlex, доступный здесь: <а2 >
Ответ 2
Функция ниже дает расстояние между двумя геокоординатами в милях
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)
Эта функция дает расстояние между двумя геокоординатами в километрах
используя География тип данных, который был представлен в 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
Я надеюсь, что это поможет