SQL Server:如何找到最近的位置?

时间:2013-12-30 19:58:06

标签: sql sql-server-2008 geo

我有两张桌子,房子和商店。两者都有纬度和经度字段。我需要创建一个视图,它将返回Houses HouseId和StoreId中的每条记录,其中StoreId是最靠近房屋的商店的ID。我有一个函数CalculateDistance(float Long1,float Lat1,float Long2,float Lat2)。 但我无法想出能够提供我需要的视图的查询。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以在表中创建Error fn is not a function...行(地理编码),并从GeographyLatitude填充它:

Longitude

然后从坐标查询最近的位置:

UPDATE [dbo].[MyTable]
   SET [Geocode] = geography::Point(Latitude, Longitude , 4326)
GO

它将返回您的coordiantes中最接近的人。

答案 1 :(得分:0)

工作示例来自我的一个应用程序......您需要显式重新映射列和表。

DECLARE @Lat float= -83.555
DECLARE @Long float = 43.555
SELECT TOP 100 ID, Abbr, Distance FROM 
(
    SELECT NL.NodeLocationID AS ID, NL.NodeLocationAbbr AS Abbr, (ABS(NL.Latitude - @Lat) + ABS(NL.Longitude - @Long)) / 2 AS Distance 
    FROM NodeLocations AS NL
    WHERE (NL.Latitude IS NOT NULL) AND (NL.Longitude IS NOT NULL)
) AS D1 
ORDER BY Distance

以下查找相对于同一表中其他项的最近项(可以通过将NL2更改为另一个表来更改)。这可以找到最接近的项目,但是根据您处理的记录数量,性能很可怕。我建议你创建一个静态字段,并通过后台进程计算每个字段。

SELECT *
FROM 
    (
    SELECT TOP 100 PERCENT *
        , ROW_NUMBER () OVER (PARTITION BY ID ORDER BY Distance ASC) AS Rnk
    FROM 
        (
            SELECT NL.NodeLocationID AS ID, NL.NodeLocationAbbr AS Abbr
                , NL2.NodeLocationID AS ID2, NL2.NodeLocationAbbr AS Abbr2
                , (ABS(NL.Latitude - NL2.Latitude) + ABS(NL.Longitude - NL2.Longitude)) / 2 AS Distance 
            FROM NodeLocations AS NL
                JOIN NodeLocations AS NL2 ON NL.NodeLocationID<>NL2.NodeLocationID AND (ABS(NL.Latitude - NL2.Latitude) + ABS(NL.Longitude - NL2.Longitude)) / 2 <= 0.1
            WHERE (NL.Latitude IS NOT NULL) AND (NL.Longitude IS NOT NULL)
                AND (NL2.Latitude IS NOT NULL) AND (NL2.Longitude IS NOT NULL)
        ) AS D1 
    ) AS D2
WHERE D2.Rnk=1