Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 从纬度和经度列表中确定距离_Sql_Sql Server 2008_Gps - Fatal编程技术网

Sql 从纬度和经度列表中确定距离

Sql 从纬度和经度列表中确定距离,sql,sql-server-2008,gps,Sql,Sql Server 2008,Gps,目前我有一张类似这样的桌子 _ID DeviceID Timestamp Latitude Longitude 4 13 1.1.2011 10:00:13 30.234 24.953 5 13 1.1.2011 10:00:17 30.235 24.953 6 13 1.1.2011 10:00:20 30.235 24.954 7 14 1.1

目前我有一张类似这样的桌子

_ID    DeviceID   Timestamp          Latitude Longitude
4      13         1.1.2011 10:00:13  30.234   24.953
5      13         1.1.2011 10:00:17  30.235   24.953
6      13         1.1.2011 10:00:20  30.235   24.954
7      14         1.1.2011 10:00:21  54.532   13.256
8      13         1.1.2011 10:00:22  30.235   24.955
9      13         1.1.2011 10:00:24  30.234   24.954
  • _身份证
    • 主键
    • int
  • 设备ID
    • int
    • 非空
  • 时间戳
    • 日期时间
    • 非空
  • 纬度
    • 真实的
    • 非空
  • 经度
    • 真实的
    • 非空
经过一点搜索(这里也是如此),我会找到很多关于计算两点之间距离的解决方案。但是我想计算一系列点之间的距离

所以我再找了一点,我发现了一个似乎可以满足我需要的东西。问题是,我需要从我拥有的点列表中构造一个几何体,但这并没有告诉我如何准确地做到这一点。(至少它没有以我能理解的方式告诉我。)

谁能告诉我如何从lat/lng列表中创建几何体

更新 好吧,到目前为止,我的问题中遗漏了一件事:

我要计算的距离有很多点(通常在1000到20000之间,但最多是40000点的一到两倍)

也可能我只是采取了完全错误的方法来获得距离。所以,如果你有任何其他的想法来获取数据的距离,请告诉我

也不关心点的排序、添加或删除。当查询运行时,数据在这些方面是稳定的

要回答克里斯的评论:
是的,连接来自4-5-6-8-9(由时间戳确定)。表中是不同设备(如7)的值,但可以使用where子句轻松地对这些设备进行分类。我想得到的距离是连接上述列表中的点时得到的直线长度。

以下是一个脚本,它使用您列出的数据创建一个基本表,将其转换为有效的线字符串,然后计算其长度:

declare @yourTable table (latitude decimal(10,7), longitude decimal(10,7))
insert into @yourTable select 30.234, 24.953
insert into @yourTable select 30.235, 24.953
insert into @yourTable select 30.235, 24.954
insert into @yourTable select 54.532, 13.256
insert into @yourTable select 30.235, 24.955
insert into @yourTable select 30.234, 24.954

DECLARE @LINE VARCHAR(MAX) = 'LINESTRING (';    
SELECT @LINE = @LINE+ convert(varchar(20),latitude) + ' ' + convert(varchar(20),longitude) + ','
FROM @yourTable

select @LINE = LEFT(@LINE,LEN(@LINE)-1)+')'

DECLARE @g geography;
SET @g = geography::STGeomFromText(@LINE, 4326);
SELECT @g.STLength();

这些点是如何相互连接的?
4
是否连接到连接到
6
5
等?你想计算的长度是多少?连接所有点的线段长度之和?如果添加了更多点或删除了一些点,如何保证点的顺序?好的,如果您需要顺序,这在本文中是有意义的,而不是从@yourTable创建一个有序子查询:
FROM(选择*FROM@yourTable order by…)
问题在于,如果你有很多点(就像我一样),字符串的长度非常有限。但是如果我在
stgeomefromtext()
中输入了23个以上的坐标,它将已经生成ArgumentException(指定的输入不代表有效的地理实例)。请找出每个相邻点之间的距离,然后将其相加。要我写sql吗?