【问题标题】:Nearby coordinates [closed]附近坐标[关闭]
【发布时间】:2012-06-15 16:32:03
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 这个问题对于 Stack Overflow 来说太宽泛了。它也过于模糊,缺乏细节。
  • 坐标是指二维点吗?举例说明您的问题中的“坐标”是什么。以及@Oded 所说的。
  • 从数据库中获取数据,对数据使用搜索算法(不适用于空间数据库)
  • 似乎是一个“一般做法”广泛的问题,对于 StackOverflow 来说不够具体
  • 这个问题之前已经被问过(并且投票赞成,而不是反对)这里几次。它的措辞有点不同,但它仍然是相同的基本问题:“如何使用地理编码绘制附近的坐标?”。 (查看右侧的“相关问题”列。)我可以看到将其关闭为重复项,但这确实不是一个 不好的问题。

标签: database algorithm location geo


【解决方案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窃取。

【讨论】:

  • 在数据库中搜索邻居时,这可能会非常慢。对于 mssql,我推荐内置空间工具
  • 可能是这样。当我过去这样做时,它只是一次交易,因此没有任何性能考虑。我必须看到一个慢查询使用它来推荐一个加速它的解决方案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多