Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用SQL Server计算GPS数据之间的距离_Sql Server_Distance - Fatal编程技术网

Sql server 使用SQL Server计算GPS数据之间的距离

Sql server 使用SQL Server计算GPS数据之间的距离,sql-server,distance,Sql Server,Distance,我在SQLServerManagementStudio中有一些表,其中包含几个月内按日期/时间列出的个人位置。这些表具有以下字段:AnimalID、日期/时间、纬度、长度、全局ID。我试图计算并返回每一对点之间的距离,以其移动的顺序,而无需每次手动输入lat和long。这里有许多关于计算两点之间距离的帖子,但我试图运行一个查询,以连续顺序计算每一对点之间的距离。我的一些表格有数百个位置 我的价值观可能是: `MD001 10/9/2019 1:00:00PM 40.73995 -

我在SQLServerManagementStudio中有一些表,其中包含几个月内按日期/时间列出的个人位置。这些表具有以下字段:
AnimalID、日期/时间、纬度、长度、全局ID
。我试图计算并返回每一对点之间的距离,以其移动的顺序,而无需每次手动输入lat和long。这里有许多关于计算两点之间距离的帖子,但我试图运行一个查询,以连续顺序计算每一对点之间的距离。我的一些表格有数百个位置

我的价值观可能是:

        `MD001 10/9/2019 1:00:00PM 40.73995 -111.8739
         MD001 10/9/2019 6:00:00PM 40.75068 -111.8782
         MD001 10/9/2019 10:00:00PM 40.74900 -111.89100`

我想知道下午1点到6点之间的距离,然后是下午6点到10点之间的距离,依此类推。我想在SQLServer中完成这项工作,以便查询出数据中的异常值。非常感谢你的洞察力。我也不想在此表中创建新字段

计算点之间距离的算法称为

要在SQL Server中计算两点之间的距离,有两个选项:

POINT 1 = 151.209030,-33.877814
POINT 2 = 144.971431, -37.808694
选项1。您可以自己实现harvesine公式:

select
    2 * 6371 * asin(sqrt(POWER((sin(radians((-37.808694 - -33.877814) / 2))),2) + cos(radians(-33.877814)) * cos(radians(-37.808694)) * POWER((sin(radians((144.971431 - 151.209030) / 2))),2)))
注意,这将为您提供以公里为单位的距离。这是由乘数6371定义的。要获得以英里为单位的距离,请将6371替换为3959

如果您在上进行搜索,您可以找到有关此实现的更深入的详细信息

选项2。。使用SQL Server内置函数。 为此,您需要将lat和long列转换为地理数据类型,然后使用STDistance函数计算实际距离

下面的陈述应该给你一个开始的想法:

select
    cast('POINT(151.209030 -33.877814)' as geography).STDistance(cast('POINT(144.971431 -37.808694)' as geography)) as distance_in_meters,
    cast('POINT(151.209030 -33.877814)' as geography).STDistance(cast('POINT(144.971431 -37.808694)' as geography)) / 1000 as distance_in_km
默认结果将以米为单位


注意,当这两个选项应用于相同的坐标时,它们之间有细微的区别。因此,如果您需要精度,那么您可能需要进一步调查原因。

我建议您在表中添加一列“与最后一点的距离”或“到下一点的距离。然后,您可能需要一个接一个地用光标浏览和计算这些值。为此,使用
LAG
可能很有用。第一步是编写一个select查询,该查询表示一行上的起点和终点。你能做到吗?谢谢你的回复。这很有帮助。我想我正在努力将选项1公式应用到整个表格中。我不想手动输入lat并搜索每个点,因为我需要找到数百行的距离。我的答案只是演示如何实现该公式。显然,您需要用表中的lat和long列替换硬编码点,并构建自己的select语句。您是否有关于select语句外观的有用链接?这是我正在努力解决的部分,我不知道如何告诉它计算连续对之间的距离。谢谢。表中的一列是否包含上述所有值?也就是说,是否有一行的列的值为
MD001 10/9/2019 1:00:00PM 40.73995-111.8739
?如果是这样的话,缺乏规范化将是一个粗略的过程。不,这些值都在单独的列中:AnimalID、Date/Time、Lat、Long