【问题标题】:Sql Server - How do I query a geography column based on Lat/Long min maxSql Server - 如何根据 Lat/Long min max 查询地理列
【发布时间】:2015-07-23 01:27:37
【问题描述】:

我有一个带有地理列的表格,用于存储房产的位置。

我有一个类似这样的程序 -

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 的范围内?这是一个大型数据集,因此性能至关重要。

我是否应该在代码中从边界创建地理 SQL 类型并将其作为过程传递到 proc 中?

我还在考虑创建 2 个计算的 int 列(纬度/经度),它们将在插入时创建,然后是简单的 ,因为我听说这比地理查询要快。

【问题讨论】:

  • 为什么不试试这两种方法?
  • “我需要在 where 子句中检查地理点是否在最大纬度/经度最小值的范围内?” - 这是我的问题,我不知道 where 语句会是什么来尝试...
  • 知道了。location 列中的数据是什么样的?
  • SQL-server 地理数据类型。
  • 我没有使用geography 的经验,但是在网上快速浏览一下建议您需要将坐标转换为polygon geography 然后使用.STWithin 进行测试。见msdn.microsoft.com/en-us/library/ff929207.aspxsql-server-helper.com/sql-server-2008/…

标签: sql sql-server stored-procedures sqlgeography


【解决方案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)

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

【讨论】:

  • 关于:SARGability,空间索引支持STWithin。来自文档:“空间索引在某些条件下支持以下面向集合的几何方法:STContains()、STDistance()、STEquals()、STIntersects()、STOverlaps()、STTouches() 和 STWithin()”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
相关资源
最近更新 更多