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

Sql server 如何计算SQL Server中多个点之间的距离?,sql-server,distance,geography,Sql Server,Distance,Geography,我有来自GPS的数据表,例如:纬度,经度,时间,用户ID 如何在指定的时间范围内聚合总距离,按所有点(按时间排序)将所有距离相加,并按用户分组数据 谢谢如果您使用的是SQL Server,您可能会对使用地理数据类型感兴趣,这样您就可以使用专用方法和地理索引请求数据库 地理数据类型自SQL Server 2008起可用,您可以在此处查看更多信息: 将数据输入地理列后,您将能够使用STDistance()方法计算两点之间的距离,请参见MSDN: 下面是一个示例,其中STDistance()用于计

我有来自GPS的数据表,例如:
纬度
经度
时间
用户ID

如何在指定的时间范围内聚合总距离,按所有点(按时间排序)将所有距离相加,并按用户分组数据


谢谢

如果您使用的是SQL Server,您可能会对使用地理数据类型感兴趣,这样您就可以使用专用方法和地理索引请求数据库

地理数据类型自SQL Server 2008起可用,您可以在此处查看更多信息:

将数据输入地理列后,您将能够使用STDistance()方法计算两点之间的距离,请参见MSDN:

下面是一个示例,其中STDistance()用于计算返回的两点之间的距离(带有地理变形),单位为米(国际标准单位):


如果您使用的是SQL Server 2005(或者如果您希望避免使用地理数据类型),可以查看CodePlex上的MsSQLSpatial项目,可在此处找到:

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

用法:

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);
参考:


我希望这有助于

对于距离计算本身,您可能想看看注意,像这样的球体计算可以精确到10米,超过数千公里。如果需要更高的精度,请使用Vincenty或Karney的算法。@N8allan感谢您指出Vincenty和Karney的算法algorithms@N8allan我找不到此算法的任何sql脚本。当我有空闲时间时,我将尝试将算法转换为SQL脚本。出于某些原因,STDistance是区分大小写的。实际原因是由于空间特征中的.Net实现(对于地理或几何体也是如此)。事实上,OGC正在定义标准中的ST_距离,我认为该距离已经适应了常见的SQL Server约定。
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)
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);