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

问题描述

| 目前我有一张桌子看起来像这样
_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 首要的关键 整型 设备编号 整型 不为空 时间戳记 约会时间 不为空 纬度 真实 不为空 经度 真实 不为空 经过一番搜索(也在此处),我将找到许多有关计算两点之间距离的解决方案。但是我想计算点列表之外的距离。 因此,我进行了更多搜索,发现STLength方法似乎可以满足我的要求。问题是我需要从我拥有的点列表中构造出一个几何图形,而有关构造几何图形实例的帮助页面却没有告诉我该怎么做。 (至少它不会以我能理解的方式告诉它。) 谁能告诉我如何从经纬度清单中创建几何图形? 更新资料 好的,到目前为止,我的问题中还缺少一件事: 我有很多点可以计算一个距离(通常在1,000到20,000之间,但一到两次最多可达40,000点)。 另外,也许我只是采用完全错误方法来拉远距离。因此,如果您还有其他想法可以使数据距离更远,请告诉我。 也不必关心点的排序,添加删除。当查询运行时,这些术语中的数据是稳定的。 要回答克里斯评论: 是的,连接是从4-5-6-8-9(由时间戳确定)。该表中包含不同设备的值(例如7),但是可以使用where子句轻松地将它们分类。我想要获得的距离是将上述列表中的点连接起来后得到的线的长度。     

解决方法

这是一个脚本,该脚本将使用您概述的数据创建基本表,将其变成有效的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.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();