Sql Server - 如何根据Lat / Long min max查询地理列

时间:2015-07-23 01:27:37

标签: sql sql-server stored-procedures sqlgeography

我有一个包含地理列的表,用于存储属性的位置。

我有一个类似的程序 -

PROCEDURE dbo.spt_sold_property_search
(
@latitude_min   Decimal(9,6),
@latitude_max   Decimal(9,6),
@longitude_max  Decimal(9,6),
@longitude_min  Decimal(9,6)
)

AS BEGIN    

SET NOCOUNT ON

SELECT * FROM [dbo].[sold_property] AS p WITH(NOLOCK)
WHERE p.location ***is in the lat/long min max bounds***

END

我需要在where子句中检查地理点是否在Lat / Long min max的范围内?它是一个大型数据集,因此性能至关重要。

我是否应该在边界的代码中创建Geography SQL类型并将其作为过程传递给proc?

我还在考虑创建2个计算的int列(lat / long),这些列将在insert上创建,然后简单< >我听说这比地理查询要快。

1 个答案:

答案 0 :(得分:0)

如果您只要求纬度和经度在最大/最小值范围内,请使用Lat和长属性:

SELECT * FROM [dbo].[sold_property] AS p WITH(NOLOCK)
WHERE p.location.Lat BETWEEN @latitude_min and @latitude_max
  AND p.location.Long BETWEEN @longitude_min and @longitude_max

但是,在我看来,从提供的坐标构造多边形是正确的,然后使用STWithin方法检查表中的点是否在多边形内,如下所示:

DECLARE @g geography;
SET @g = geography::Parse('POLYGON (('+CONVERT(NVARCHAR(20),@latitude_min)+', '+
CONVERT(NVARCHAR(20),@latitude_max)+', '+CONVERT(NVARCHAR(20),@longitude_min)+', '+
CONVERT(NVARCHAR(20),@longitude_max)+'))');

SELECT * FROM [dbo].[sold_property] AS p WITH(NOLOCK)
WHERE @g.STWithin(p.location)

请注意,后一个查询可能不是sargable。正如Ben Thul在下面提到的,空间索引可能支持STWithin