【问题标题】:T-SQL: Finding the closest location of an object on a map gridT-SQL:在地图网格上查找对象的最近位置
【发布时间】:2012-04-30 20:22:33
【问题描述】:

我在地图上显示了网格。我知道您的位置以及地图上 2 个对象的位置。对象出现在网格线交叉的地方。考虑一下世界是平的而不是圆的,因为地图上的区域只有很短的距离。出于性能原因,我想在不使用三角函数和乘法的情况下确定哪个对象离你最近。我不是在寻找准确性,而是仅仅获得一个球场指示。我应该能够确定我当前位置的纬度和经度差之间的最短距离。我的表 Locations 如下所示:

ID   Latitude   Longitude
1       50         70
2       30         40

如果我的位置是纬度 = 40 和经度 = 60,那么 ID = 1 的位置会离我更近。

如果我的位置是纬度 = 30 和经度 = 60,可能两个位置的距离大致相同,所以只需选择一个。

如果我的位置是纬度 = 30 和经度 = 50,那么 ID = 2 的位置会更近。

【问题讨论】:

  • 你有什么版本的SQL?如果 2008 年你可以使用几何函数
  • 2008.几何函数的性能不会比直接进行整数比较差吗?我的坐标总是整数。
  • 是的,它们通常会,但会提供比整数更准确的比较 - 例如比较 51.5228,-0.1028 和 50.5374,-3.5173 与 51.228,-0.1028 和 52.5374,-1.5173 之间的旅程

标签: sql-server-2008 tsql min


【解决方案1】:

您确实需要使用一些三角函数来获得任何精度:

DECLARE @LocationTable TABLE(ID int, Latitude int, Longitude int)
INSERT INTO @LocationTable(ID, Latitude, Longitude)
VALUES
    (1,50,70),
    (2,30,40)

DECLARE
    @MyLatitude int = 90,
    @MyLongitude int = 40

WITH DistanceTable AS
(
    SELECT ID, Latitude, Longitude,
        SQRT(POWER(Latitude - @MyLatitude,2) + POWER(Longitude - @MyLongitude, 2)) AS Distance
    FROM @LocationTable
)
SELECT ODT.ID, ODT.Latitude, ODT.Longitude, ODT.Distance
FROM (SELECT ID, Latitude, Longitude, Distance, ROW_NUMBER() OVER(ORDER BY Distance) AS Position
    FROM DistanceTable) AS ODT
WHERE ODT.Position = 1;

【讨论】:

  • 谢谢,但我在帖子中说我不是在寻找准确性。如果我需要精度,那么我将使用内置的几何函数。
  • @AndroidDev,除非这些点在赤道附近,否则如果没有三角函数,结果将完全错误。例如,在莫斯科(北纬 55°)1 纬度 = 111.13 公里(与其他地方一样),但是由于纬度远离赤道,1 经度只有 63.7 公里。因此,如果您在莫斯科,并且有 2 个点,一个向北 110 公里,另一个向西 64 公里,那么您的方法会说 110 公里比 64 公里更近。
【解决方案2】:

我只计算差异的总和。我试过了,效果很好。

SELECT MIN(ABS(s.Latitude - 47) + ABS(s.Longitude - -122)), s.ID FROM Sites as s Group By ID;

【讨论】:

  • 这也是我在发布问题后想出的。非常感谢!
  • 它也会定期返回错误答案。例如,我的 latitude=90 和我的经度 40,这将说 ID 2 是最近的(60 远),而实际上 ID 1(实际上是 50 远而不是返回的 70)是。
  • 这不是 x,y 点之间距离的方程式
  • CodeByMoonlight:我的应用程序中的纬度位于人口密集的位置,而不是北极或南极。此外,任意两点之间的差异最多为 50 公里,因此 bnieland 的解决方案对于球场数据来说绰绰有余。
  • Blam:我不是在寻找准确的距离,而是在寻找某个位置是否在同一个球场内的指示,最多 50 公里。 bnieland 的解决方案在世界上大多数人口稠密的地方都能很好地做到这一点。
【解决方案3】:

SELECT MIN(((s.Latitude - @lat)(s.Latitude - @lat)) + ((s.Longitude - @lon)(s.Longitude - @lon)) ), s.ID FROM Sites as s Group By ID;

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2011-02-13
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多