Sql server 2008 返回按时间顺序排列的记录,给定分隔因子
我在SQLServer2008中有一个巨大的表,它包含技师每分钟报告的位置。我需要在此表上进行报告,但为了控制报告中显示的记录数量,需要考虑时间和距离分隔因素 因此,查询可能看起来像Sql server 2008 返回按时间顺序排列的记录,给定分隔因子,sql-server-2008,tsql,geospatial,spatial-query,Sql Server 2008,Tsql,Geospatial,Spatial Query,我在SQLServer2008中有一个巨大的表,它包含技师每分钟报告的位置。我需要在此表上进行报告,但为了控制报告中显示的记录数量,需要考虑时间和距离分隔因素 因此,查询可能看起来像 "Return all records with no less than 5 minutes and/or 300 feet between them". 时间部分已经完成了,但是距离因素让我很难适应。我有每个点的纬度和经度,如果我需要包含一个SQLServer2008空间UDT来解决问题,我没有问题 我考虑过
"Return all records with no less than 5 minutes and/or 300 feet between them".
时间部分已经完成了,但是距离因素让我很难适应。我有每个点的纬度和经度,如果我需要包含一个SQLServer2008空间UDT来解决问题,我没有问题
我考虑过的事情:
3949.99 * arcos(sin(LAT1) * sin(LAT2) + cos(LAT1) * cos(LAT2) * cos(LONG1 - LONG2))
地球的半径是3949.99英里。其余的都是不言自明的。此公式为大圆距离计算公式。公式为:
3949.99 * arcos(sin(LAT1) * sin(LAT2) + cos(LAT1) * cos(LAT2) * cos(LONG1 - LONG2))
地球的半径是3949.99英里。其余的都是不言自明的。此公式是大圆距离计算公式。在SQL 2008之前,最常见的解决方案是使用自定义项计算球体上两点之间的大圆距离。可能是最常用的方法 当然,地球实际上并不是一个完美的球体,但对于大多数用途来说,它被认为“足够好” 在SQL 2008中,正如您预期的那样,通过引入地理和几何数据类型,可以简化此类计算并使其更加精确。下面是一个简单的示例,说明如何使用它们简化距离计算
DECLARE @locations TABLE(locname VARCHAR(100), coord geography)
DECLARE @loc1 geography
DECLARE @loc2 geography
INSERT INTO @locations
VALUES('HOME', geography::Point(-81.810194, 41.478156, 4326)) --Note: Lat, Long, SRID
--The 4326 is the SRID (spatial reference id) used by SQL as
--a reference to the WGS 84 Standard. This is the same reference
--used by the GPS system
INSERT INTO @locations
VALUES('WORK', geography::Point(-81.687771, 41.498227, 4326))
SELECT * FROM @locations
SELECT @loc1 = coord FROM @locations WHERE locname = 'HOME'
SELECT @loc2 = coord FROM @locations WHERE locname = 'WORK'
SELECT @loc1.STDistance(@loc2) * 3.2808399 --STDistance is in meters so we multiply to convert to feet
SRID是提高精度的关键。其引用的规范包括标准化坐标系和参考椭球体。换句话说,它解释了地球的非球形性质,比单纯的球形大圆计算给出了更好的结果
如果GIS精度对您的工作很重要,这是在SQL 2008中实现它的最简单方法。在SQL 2008之前,最常见的解决方案是使用UDF计算球体上两点之间的大圆距离。可能是最常用的方法 当然,地球实际上并不是一个完美的球体,但对于大多数用途来说,它被认为“足够好” 在SQL 2008中,正如您预期的那样,通过引入地理和几何数据类型,可以简化此类计算并使其更加精确。下面是一个简单的示例,说明如何使用它们简化距离计算
DECLARE @locations TABLE(locname VARCHAR(100), coord geography)
DECLARE @loc1 geography
DECLARE @loc2 geography
INSERT INTO @locations
VALUES('HOME', geography::Point(-81.810194, 41.478156, 4326)) --Note: Lat, Long, SRID
--The 4326 is the SRID (spatial reference id) used by SQL as
--a reference to the WGS 84 Standard. This is the same reference
--used by the GPS system
INSERT INTO @locations
VALUES('WORK', geography::Point(-81.687771, 41.498227, 4326))
SELECT * FROM @locations
SELECT @loc1 = coord FROM @locations WHERE locname = 'HOME'
SELECT @loc2 = coord FROM @locations WHERE locname = 'WORK'
SELECT @loc1.STDistance(@loc2) * 3.2808399 --STDistance is in meters so we multiply to convert to feet
SRID是提高精度的关键。其引用的规范包括标准化坐标系和参考椭球体。换句话说,它解释了地球的非球形性质,比单纯的球形大圆计算给出了更好的结果
如果GIS精度对您的工作很重要,这是在SQL 2008中实现它的最简单方法。Raciel的问题是,如何通过距离因子“简化”点列表。假设您有一个按日期时间排序的100个空间点的列表,其中一个点与上一个点之间的距离正好是150英尺,他只需要得到距离为300英尺的点列表,结果集应该是一个大约50个点的列表。。。
我只是想象用光标来做这件事。拉西尔想问的是,如何通过距离因子来“简化”点列表。假设您有一个按日期时间排序的100个空间点的列表,其中一个点与上一个点之间的距离正好是150英尺,他只需要得到距离为300英尺的点列表,结果集应该是一个大约50个点的列表。。。
我只是想象用光标来做这件事。可能更好吗?谢谢,按照你的建议张贴在这里。由于这个问题涉及到其他技能(GIS),我也将它留在这里…可能更好地询问?谢谢,根据您的建议张贴在这里。由于这个问题涉及其他技能(GIS),我也将其留在这里……穆罕默德,谢谢你的回答,但我的问题实际上不是如何计算两点之间的距离;但给定一系列按时间顺序排列的点,如何只返回不小于X英尺的点。例如,假设一名技师每分钟报告一次他的位置,他正在行走。。。我只对每300英尺或600英尺看一次点感兴趣。这允许运行粗粒度或细粒度报告。穆罕默德,谢谢你的回答,但我的问题实际上不是如何计算两点之间的距离;但给定一系列按时间顺序排列的点,如何只返回不小于X英尺的点。例如,假设一名技师每分钟报告一次他的位置,他正在行走。。。我只对每300英尺或600英尺看一次点感兴趣。这允许运行粗粒度或细粒度报告。乔纳森,谢谢你的回答。这里的问题不是如何计算两个任意点之间的距离,而是如何计算额外的距离