Sql Server - как запросить столбец географии на основе Lat/Long min max

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

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

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 как процедуру?

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


person Toby Holland    schedule 23.07.2015    source источник
comment
почему бы вам не попробовать эти 2 подхода?   -  person Vamsi Prabhala    schedule 23.07.2015
comment
Что мне нужно в предложении where, чтобы проверить, находится ли географическая точка в пределах Lat/Long min max? - это мой вопрос, я не знаю, каким будет оператор where, чтобы попробовать...   -  person Toby Holland    schedule 23.07.2015
comment
понял... как выглядят данные в столбце location?   -  person Vamsi Prabhala    schedule 23.07.2015
comment
Это тип данных SQL-сервера Geography.   -  person Toby Holland    schedule 23.07.2015
comment
У меня нет опыта работы с geography, но быстрый поиск в Интернете показывает, что вам нужно преобразовать свои координаты в polygon geography, а затем использовать .STWithin для теста. См. msdn.microsoft.com/en-us/library/ff929207.aspx, а также sql-server-helper.com/sql-server-2008/   -  person Turophile    schedule 23.07.2015


Ответы (1)


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

person cha    schedule 23.07.2015
comment
В отношении возможностей SARG пространственные индексы поддерживают STWithin. Из документации: Пространственные индексы поддерживают следующие методы геометрии, ориентированные на множество, при определенных условиях: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() и STWithin(). - person Ben Thul; 23.07.2015