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