我将创建一个应该发布“坐标”的应用程序,另一个函数是通过数据库并找到附近的坐标。假设我的数据库中有1.000.000个条目,使用什么算法?如何比较距离给定坐标100米的坐标?很多应用程序都在这样做,但似乎很难。
更新: 按坐标我的意思是lon-lat。 我不知道为什么你认为这不是“真正的”问题,但我需要一个起点,这就是我问这个“一般”问题的原因
由于
答案 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。别忘了检查象限。如果进行多次查找,您可能希望将搜索列表排序为二维搜索树。