确定纬度和经度列表的距离

时间:2011-05-23 14:44:59

标签: 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.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
  • _ID
    • 主键
    • INT
  • 的DeviceID
    • INT
    • not null
  • 时间戳
    • 日期时间
    • not null
  • 纬度
    • not null
  • 经度
    • not null

经过一番搜索(也在这里),我会找到很多关于计算两点之间距离的解决方案。但是我想计算一个点列表的距离。

所以我再搜索一下,我发现STLength method似乎应该做我想要的。问题是我需要从我所拥有的点列表中构造一个几何,而the help page about constructing geometry instances并没有告诉我如何做到这一点。 (至少它并没有以我能理解的方式告诉它。)

有谁能告诉我如何从lat / lng列表中创建几何图形?

更新

好的,到目前为止,在我的问题中有一件事我错过了:

我有一个很多的点可以计算一个距离(通常在1,000到20,000之间,但是一到两次,最多40,000个点)。

也许我只是采取完全错误的方法来摆脱它的距离。所以,如果您有任何其他想法可以远离数据,请告诉我。

也不在乎订购,添加或删除积分。当查询运行时,数据在这些术语中是稳定的。

回答Chris评论: 是的,连接是4 - 5 - 6 - 8 - 9(由时间戳决定)。表中包含不同设备的值(如7),但可以使用where子句轻松排序。我想得到的距离是你连接上面列表中的点所得到的线的长度。

1 个答案:

答案 0 :(得分:2)

这是一个脚本,它使用您列出的数据创建一个基本表,使其成为有效的LINESTRING字符串,然后计算其长度:

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();