Microsoft SQL 服务器上的地理数据
Geographic data on Microsoft SQL Server
我有一个 SQL 服务器 table,其地理点类型为 [纬度、经度]。目前,我只有几分,但是,随着时间的推移,我预计我的 table 会显着增长。
稍后,我需要根据与另一点的接近程度来查询我的 table。有没有标准化的方法可以有效地做到这一点?例如某种地理空间索引?您的最佳做法是什么?
我需要的查询伪代码如下所示:
-- 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
如 marc_s 所述,SQL Server 2008+ 具有您可以使用的地理空间类型。如果你想在 myTable
上保持纬度和经度分开,但也有一个代表这些坐标的地理空间列,你可以使用一个计算列(但要注意它可能导致的性能问题)所以你没有table 本身的重复数据。
[latlong] AS ([geography]::Point([Latitude],[Longitude],(4326)))
然后,要查找另一点半径范围内的任何点,可以使用 geography
类型的 STDistance
方法。
declare @radius int = 100000;
declare @p1 geography = geography::STGeomFromText('POINT(-122.33365 47.612033)',4326);
select * from myTable where @p1.STDistance(latlong) <= @radius;
请注意,距离以米为单位计算。
要添加到 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;
我有一个 SQL 服务器 table,其地理点类型为 [纬度、经度]。目前,我只有几分,但是,随着时间的推移,我预计我的 table 会显着增长。
稍后,我需要根据与另一点的接近程度来查询我的 table。有没有标准化的方法可以有效地做到这一点?例如某种地理空间索引?您的最佳做法是什么?
我需要的查询伪代码如下所示:
-- 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
如 marc_s 所述,SQL Server 2008+ 具有您可以使用的地理空间类型。如果你想在 myTable
上保持纬度和经度分开,但也有一个代表这些坐标的地理空间列,你可以使用一个计算列(但要注意它可能导致的性能问题)所以你没有table 本身的重复数据。
[latlong] AS ([geography]::Point([Latitude],[Longitude],(4326)))
然后,要查找另一点半径范围内的任何点,可以使用 geography
类型的 STDistance
方法。
declare @radius int = 100000;
declare @p1 geography = geography::STGeomFromText('POINT(-122.33365 47.612033)',4326);
select * from myTable where @p1.STDistance(latlong) <= @radius;
请注意,距离以米为单位计算。
要添加到 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;