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