Sql Server - как запросить столбец географии на основе широты / долготы мин макс

У меня есть таблица со столбцом географии, которая хранит местоположение свойства.

У меня процедура примерно такая -

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, чтобы проверить, находится ли географическая точка в пределах широты / долготы min max? Это большой набор данных, поэтому производительность имеет решающее значение.

Должен ли я создавать тип Geography SQL в коде из границ и передавать его в процедуру как процедуру?

Я также подумывал о создании 2 вычисляемых столбцов типа int (широта / длина), которые будут создаваться при вставке, а затем просто < >, как я слышал, это быстрее, чем запросы Geography.

1 ответ

Решение

Если требуется, чтобы широта и долгота находились в пределах значений max/min, используйте свойства 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 Как отметил Бен Тул ниже, пространственные индексы могут поддерживать STWithin

Другие вопросы по тегам