指向.NET / SQL中的圆(经度/纬度)

时间:2010-02-15 09:31:56

标签: .net sql-server vb.net latitude-longitude

我遇到了以下问题: 我有一个带有long / lat值的表和另一个带有project-id和long / lat / radius(circle)的表。

现在我需要找出哪个项目匹配第一个表中的long / lat值。

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:2)

有多种算法来计算球体上的距离,但我们使用以下内容:

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 - 是地球的半径)

所以现在当你可以计算地球上2点之间的距离时,你可以构建查询

 select * 
     from Table1, Project 
     where dbo.GetDistance(
           Table1.lat, Table1.lon, 
           Project.lat, Project.lon) < @YouRadius

其中@YouRadius - 圆圈的参数化半径

答案 1 :(得分:0)

相对简单:计算圆与点中心之间的大圆距离。如果距离小于半径,则该点在圆圈中,如果不是的话。如果它在圆周上,你决定。关于大圆距离的计算已有几个SO讨论,看看它们。

为了加快速度,您可以考虑使用每个圆的定义,以纬度/长度“正方形”存储其最小边界框。这将为您提供快速检查点是否可能在圆内的信息,仅在点在mbb内时计算距离。