Sql server 2008 返回按时间顺序排列的记录,给定分隔因子

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来解决问题,我没有问题 我考虑过

我在SQLServer2008中有一个巨大的表,它包含技师每分钟报告的位置。我需要在此表上进行报告,但为了控制报告中显示的记录数量,需要考虑时间和距离分隔因素

因此,查询可能看起来像

"Return all records with no less than 5 minutes and/or 300 feet between them".
时间部分已经完成了,但是距离因素让我很难适应。我有每个点的纬度和经度,如果我需要包含一个SQLServer2008空间UDT来解决问题,我没有问题

我考虑过的事情:

  • 按时间因子携带记录,并通过计算相邻点之间的距离在客户端中应用分离约束,并丢弃位于因子内的记录。(最简单,但必须是消耗更多资源的)

  • 将每个技师的最后一条记录保留在缓存中,预先计算记录与其前一条记录之间的距离,并解决客户端中的约束。(应该比1消耗更少的资源)由于距离是预先计算的,但是由于表很大,它将增加数据集的大小,不确定空间是否值得处理节省)

  • 使用SQLServer2008中的空间函数,但老实说,我一直在阅读,找不到任何有助于解决此类需求的内容。有GIS专家吗

  • 我想选择最好的选项(可能上面没有列出?),IMO应该是最有效地使用SQLserver功能的选项。

    公式是:

    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英尺看一次点感兴趣。这允许运行粗粒度或细粒度报告。乔纳森,谢谢你的回答。这里的问题不是如何计算两个任意点之间的距离,而是如何计算额外的距离