大圆距离公式:T-SQL
Posted
技术标签:
【中文标题】大圆距离公式:T-SQL【英文标题】:Great Circle Distance Formula: T-SQL 【发布时间】:2011-04-29 00:00:31 【问题描述】:所以我有一张桌子,里面有一堆不同的地址。我需要一个 proc 来选择该表中与传入的纬度/经度值相距指定距离(以英里为单位)内的地址。
我的桌子的例子:
- messageId
- lat (float)
- long (float)
Proc 正在传递另一个纬度/经度对(float
s 以及 int
(英里)
我找到了这个http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360 来计算实际的公式,但我想不出以 proc 形式修改它以便能够浏览整个地址列表,只给我Id
的从我传入的纬度/经度算起
我可以在这里得到任何帮助吗?
谢谢!
【问题讨论】:
【参考方案1】:SQL Server 2008
使用空间函数STDistance
返回距离(以米为单位)
geography::Point(@lat1, @lon1, 4326).STDistance(geography::Point(@lat2, @lon2, 4326))
【讨论】:
我更喜欢这种方式,它更清洁,而且我可以将米转换为英里 4326 是 WGS82 地理点的 SRID。除非您打算使用与标准 GPS 纬度/经度不同的坐标系,否则您将始终希望使用 4326。 为了极大地提高查询速度,请预先计算geography::Point
并将其存储为空间数据类型,并对其进行索引。然后你可以拨打point1.STDistance(point2)
如果我创建了一个计算列,在我插入它们时存储为纬度/经度的地理,然后我只在存储的过程中创建另一个点?
那会很好用。这样做是为了避免不必要地生成地理点。【参考方案2】:
实际上,为了这个目的,我不久前写了一个简短的blog post。基本上,我的查询是:
SELECT
Name,
Address,
City,
State,
Latitude,
Longitude,
(
ACOS(
COS(@center_latitude * (PI()/180)) *
COS(@center_longitude * (PI()/180)) *
COS(Latitude * (PI()/180)) *
COS(Longitude * (PI()/180)) +
COS(@center_latitude * (PI()/180)) *
SIN(@center_longitude * (PI()/180)) *
COS(Latitude * (PI()/180)) *
SIN(Longitude * (PI()/180)) +
SIN(@center_latitude * (PI()/180)) *
SIN(Latitude * (PI()/180))
) *
(
(@equatorial_radius * @polar_radius) /
(
SQRT(
(@equatorial_radius * @equatorial_radius) -
(
(
(@equatorial_radius * @equatorial_radius) -
(@polar_radius * @polar_radius)
) *
(
COS(@center_latitude) *
COS(@center_latitude)
)
)
)
)
)
) AS Miles
FROM
Places
WHERE
Miles <= @search_radius
给它中心纬度,中心经度和搜索半径,你应该很好。 (地球赤道和极地半径的参数自然可以硬编码。)
所有这些数学都应该解释地球的曲率、赤道的膨胀等等。
【讨论】:
我在 WHERE 子句中运行它时遇到错误。它说“无效的列名 - 英里” @slandau:很有趣。我认为它应该可以工作,因为包含所有数学的列都别名为Miles
。但经过进一步研究,我猜 T-SQL 不喜欢那样。 (我可能以前在 mysql 中使用过它,已经有一段时间了。)您可以尝试将它放在派生表中。见:***.com/questions/260399/…
有没有办法可以在计算中使用表格中的经度/纬度,但不将它们作为结果集的一部分返回?
@slandau:只要从 SELECT 子句中删除它们就可以了。【参考方案3】:
您可以直接在 SP 中使用该函数...我在想:
创建过程 [FindPlaces](@lat 浮点数,@long 浮点数,@min_dist 浮点数) 作为 从您的表中选择 messageId 其中 dbo.F_GREAT_CIRCLE_DISTANCE(@lat, @long, lat, long)【讨论】:
以上是关于大圆距离公式:T-SQL的主要内容,如果未能解决你的问题,请参考以下文章
java Java / Android - 使用大圆公式计算两个坐标之间的距离。
java Java / Android - 使用大圆公式计算两个坐标之间的距离。
java Java / Android - 使用大圆公式计算两个坐标之间的距离。