附近的坐标

时间:2012-06-12 18:31:32

标签: database algorithm location geo

我将创建一个应该发布“坐标”的应用程序,另一个函数是通过数据库并找到附近的坐标。假设我的数据库中有1.000.000个条目,使用什么算法?如何比较距离给定坐标100米的坐标?很多应用程序都在这样做,但似乎很难。

更新: 按坐标我的意思是lon-lat。 我不知道为什么你认为这不是“真正的”问题,但我需要一个起点,这就是我问这个“一般”问题的原因

由于

2 个答案:

答案 0 :(得分:1)

我过去曾使用过Great Circle Distance之类的东西来做这件事。它将地球视为一个完美的球体(它不是),并使用两组纬线来确定该球体上两点之间的距离。由于地球不是一个完美的球体,这些距离并不完全准确。如果你正在处理小距离并且计算和实际之间的差异很小,那么这对你来说可能没问题。这是一个计算GCD的函数:

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
CREATE FUNCTION dbo.GreatCircleDistance
(
    @Latitude1 float = NULL,
    @Longitude1 float = NULL,
    @Latitude2 float = NULL,
    @Longitude2 float = NULL
)
RETURNS float
AS
BEGIN
    IF @Latitude1 IS NULL RETURN 0.0
    IF @Longitude1 IS NULL RETURN 0.0
    IF @Latitude2 IS NULL RETURN 0.0
    IF @Longitude2 IS NULL RETURN 0.0

    DECLARE @sin1 float
        ,@sin2 float
        ,@sind float
        ,@cos1 float
        ,@cos2 float
        ,@cosd float

    SELECT @sin1 = SIN(RADIANS(@Latitude1))
        ,@sin2 = SIN(RADIANS(@Latitude2))
        ,@sinD = SIN(RADIANS(@Longitude2 - @Longitude1))
        ,@cos1 = COS(RADIANS(@Latitude1))
        ,@cos2 = COS(RADIANS(@Latitude2))
        ,@cosD = COS(RADIANS(@Longitude2 - @Longitude1))

    RETURN ATN2     (SQRT(SQUARE(@cos2 * @sinD) + SQUARE(@cos1 * @sin2 - @sin1 * @cos2 * @cosD))
                ,@sin1 * @sin2 + @cos1 * @cos2 * @cosD
            ) * 3959.871
END
GO

here被盗。

答案 1 :(得分:0)

纬度,经度以度 - 分 - 秒还是十进制度数?如果是小数则然后dist ^ 2~ = lat ^ 2 + lon ^ 2。别忘了检查象限。如果进行多次查找,您可能希望将搜索列表排序为二维搜索树。