2

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

ID   Latitude   Longitude
1       50         70
2       30         40

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

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

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

4

3 回答 3

4

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

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;
于 2012-04-30T12:19:30.187 回答
2

我只会对差异的总和做一分钟。我试过了,效果很好。

SELECT MIN(ABS(s.Latitude - 47) + ABS(s.Longitude - -122)), s.ID FROM Sites as s Group By ID;
于 2012-04-30T12:00:58.183 回答
1

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

于 2012-04-30T12:19:30.620 回答