-3

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

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

谢谢

4

2 回答 2

1

过去,我使用了一种叫做大圆距离的方法来做到这一点。它将地球视为一个完美的球体(它不是),并使用两组纬度来确定该球体上两点之间的距离。由于地球不是一个完美的球体,这些距离并不完全准确。如果您正在处理小距离并且计算和实际之间的微小差异是可以的,这对您来说可能没问题。这是一个计算 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

从这里偷来的。

于 2012-06-12T18:38:42.083 回答
0

纬度,经度以度-分-秒还是十进制度?如果是十进制,则 dist^2 ~= lat^2 + lon^2。不要忘记检查象限。如果进行多次查找,您可能希望将搜索列表排序到 2d 搜索树中。

于 2012-06-12T18:44:56.547 回答