SQL Server - 如何基于纬度/经度的最小值和最大值查询地理列?

4

我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我有一个表格,其中包含一个地理位置列,存储了属性的位置。

我的过程大致如下 -

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子句中需要什么来检查地理点是否在纬度/经度的最小值和最大值范围内?由于数据集很大,性能至关重要。

我应该在代码中从边界创建一个Geography SQL类型,并将其作为过程传递给存储过程吗?

我也考虑创建2个计算出的int列(纬度/经度),这些列将在插入时创建,然后使用简单的< >,因为我听说这比Geography查询更快。


为什么不尝试这两种方法呢? - Vamsi Prabhala
“在where子句中,我需要什么来检查地理点是否在纬度/经度的最小/最大范围内?” - 这是我的问题,我不知道尝试时应该使用哪个where语句... - Toby Holland
明白了..location列中的数据长什么样? - Vamsi Prabhala
这是SQL Server中的地理数据类型。 - Toby Holland
我对地理信息没有经验,但是快速查看网上的资料表明,您需要将坐标转换为多边形地理信息,然后使用.STWithin进行测试。请参见https://msdn.microsoft.com/en-us/library/ff929207.aspx和http://www.sql-server-helper.com/sql-server-2008/convert-latitude-longitude-to-geography-point.aspx。 - Turophile
1个回答

1
如果您只需要纬度和经度在最大/最小值之间,则使用Lat和Long属性:
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)

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

2
关于SARGability,空间索引支持STWithin。从文档中可以看到:“在某些条件下,空间索引支持以下集合几何方法:STContains()、STDistance()、STEquals()、STIntersects()、STOverlaps()、STTouches()和STWithin()”。 - Ben Thul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接