目前我的表格看起来像这样
_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
经过一番搜索(也在这里),我会找到很多关于计算两点之间距离的解决方案。但是我想计算一个点列表的距离。
所以我再搜索一下,我发现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子句轻松排序。我想得到的距离是你连接上面列表中的点所得到的线的长度。
答案 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();