我将创建一个应该发布“坐标”的应用程序,另一个功能是通过数据库查找附近的坐标。假设我的数据库中有 1.000.000 个条目,使用什么算法?如何比较距给定坐标 100m 的坐标?很多应用程序都在这样做,但这似乎很困难。
更新:通过坐标我的意思是经纬度。我不知道你为什么认为这不是“真正的”问题,但我需要一个起点,这就是我问这个“一般”问题的原因
谢谢
过去,我使用了一种叫做大圆距离的方法来做到这一点。它将地球视为一个完美的球体(它不是),并使用两组纬度来确定该球体上两点之间的距离。由于地球不是一个完美的球体,这些距离并不完全准确。如果您正在处理小距离并且计算和实际之间的微小差异是可以的,这对您来说可能没问题。这是一个计算 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
从这里偷来的。
纬度,经度以度-分-秒还是十进制度?如果是十进制,则 dist^2 ~= lat^2 + lon^2。不要忘记检查象限。如果进行多次查找,您可能希望将搜索列表排序到 2d 搜索树中。