如何计算SQL Server中多个点之间的距离?

时间:2013-02-22 23:44:36

标签: sql-server distance geography

我有来自GPS的数据表,例如:LatitudeLongitudeTimeUserId

如何在指定时间范围内汇总所有距离(按时间排序)和用户分组数据的所有距离的总距离?

由于

2 个答案:

答案 0 :(得分:6)

如果您使用的是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(或者如果您想避免使用地理数据类型),您可以查看CodePlex上的MsSQLSpatial项目,可在此处找到:http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

答案 1 :(得分:5)

以下函数以英里为单位给出两个地理坐标之间的 距离

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中引入的 Geography 数据类型

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);

参考: Ref1Ref2

我希望这会有所帮助