Microsoft SQL Server上的地理数据

时间:2015-09-06 10:08:37

标签: sql sql-server tsql geospatial geography

我有一个SQL Server表,其地理点类型为 [纬度,经度] 。目前,我只有几点,但是,随着时间的推移,我希望我的桌子能够显着增长。

稍后,我需要通过接近另一个点来查询我的表。有没有标准化的方法来有效地做到这一点?某种地理空间索引例如?你最好的做法是什么?

我需要的查询在伪代码中看起来像这样:

-- lat0, lng0 and radius0 are search parameters
-- distance() is function which computes distance between two points
SELECT id, lat, lng 
FROM myTable 
WHERE distance(lat, lng, lat0, lng0) < radius0

2 个答案:

答案 0 :(得分:2)

要添加到alroc的答案,您还可以创建带索引的计算持久列。

ALTER TABLE my_table ADD geo AS GEOGRAPHY::Point (
        latitude
        ,longitude
        ,4326
        ) persisted;
CREATE spatial INDEX SI_my_table__geo ON my_table (geo);

SELECT TOP 5 @point.STDistance(geo) as distance_meters 
    ,id
    ,location_name
    ,latitude
    ,longitude
FROM my_table;

答案 1 :(得分:1)

正如marc_s所提到的,SQL Server 2008+具有您可以使用的地理空间类型。如果你想保持纬度和经度在myTable上分开,但也有一个表示这些坐标的地理空间列,您可以使用计算列(但要注意由此产生的可能的性能问题),这样您就不会在表上有重复的数据本身。

[latlong] AS ([geography]::Point([Latitude],[Longitude],(4326)))

然后,要查找另一个点半径范围内的任何点,您可以使用STDistance类型的geography方法。

declare @radius int = 100000;
declare @p1 geography = geography::STGeomFromText('POINT(-122.33365 47.612033)',4326);
select * from myTable where @p1.STDistance(latlong) <= @radius;

请注意,距离以米为单位计算。