我有以下问题: 我与经度/纬度值的表和与项目-id和经度/纬度/半径(圆)另一个表。

现在我需要找出哪些项目长/纬度值从第一个表匹配。

有没有一种简单的方法来做到这一点?

有帮助吗?

解决方案

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

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 - 你的圆的半径参数

其他提示

相对容易:计算点和所述圆的中心之间的大圆距离。如果距离小于半径,该点是在圈内,如果不是没有。如果它是在圆的周长,你决定。已经有上大圆距离计算几个SO讨论,看看他们。

要加快东西你可以考虑存储,每个圆圈,在纬度/长“广场”它的最小边界框的定义。这会为你提供必要做的点是否可能是一个圆圈内的快速检查的信息,仅计算距离时的点是MBB里面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top