我遇到了以下问题:我有一个带有 long/lat 值的表和另一个带有 project-id 和 long/lat/radius(圆形)的表。
现在我需要找出哪个项目与第一个表中的 long/lat 值匹配。
有没有简单的方法可以做到这一点?
我遇到了以下问题:我有一个带有 long/lat 值的表和另一个带有 project-id 和 long/lat/radius(圆形)的表。
现在我需要找出哪个项目与第一个表中的 long/lat 值匹配。
有没有简单的方法可以做到这一点?
有多种算法可以计算球体上的距离,但我们使用以下算法:
create function GetDistance(
@latitudeFrom decimal(30,10),
@longitudeFrom decimal(30,10),
@latitudeTo decimal(30,10),
@longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN
DECLARE @distance float
SET @distance = ROUND(6378.137 * ACOS(
convert(decimal(30,10),
(SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
(COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)
RETURN @distance
END
go
(其中 6378.137 - 是地球的半径)
所以现在当你可以计算地球上两点之间的距离时,你可以建立查询
select *
from Table1, Project
where dbo.GetDistance(
Table1.lat, Table1.lon,
Project.lat, Project.lon) < @YouRadius
@YouRadius - 你的圆的参数化半径
比较简单:计算点到圆心的大圆距离。如果距离小于半径,则该点在圆内,否则。如果它在圆周上,你决定。有几个关于计算大圆距离的讨论,看看他们。
为了加快速度,您可以考虑在每个圆的定义中存储其在纬度/经度“正方形”中的最小边界框。这将为您提供快速检查点是否可能在圆内所需的信息,仅当点在 mbb 内时计算距离。