【问题标题】:Determine distance from list of Latitude and Longitude从纬度和经度列表中确定距离
【发布时间】:2011-05-23 14:44:58
【问题描述】:

目前我有一张看起来像这样的桌子

_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
  • 设备ID
    • int
    • 不为空
  • 时间戳
    • 日期时间
    • 不为空
  • 纬度
    • 真实
    • 不为空
  • 经度
    • 真实
    • 不为空

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

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

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

更新

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

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

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

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

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

【问题讨论】:

  • 这些点是如何相互连接的? 4 是否连接到 5 连接到 6 等?您要计算的长度是多少?连接所有点的线段长度之和?

标签: sql sql-server-2008 gps


【解决方案1】:

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

【讨论】:

  • 如果添加更多点或删除一些点,您如何保证排序?
  • 好吧,如果你需要顺序,这在这种情况下是有意义的,而不是FROM @yourTable,你可以创建一个有序的子查询:FROM (select * from @yourTable order by ...)
  • 问题是如果你有很多点(就像我有),一个字符串的长度是非常有限的。但是如果我将超过 23 个坐标放入其中,STGeomFromText() 将已经产生 ArgumentException(指定的输入不代表有效的地理实例。)。
  • 找出每个相邻点之间的距离,然后将其相加。要我写sql吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2011-10-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多