Я свободно владею SQL, но плохо знаком с функциями SQL Geometry. Мне нужно решить, вероятно, очень простую проблему, но я не нашел в Интернете хороших ресурсов, объясняющих, как использовать объекты геометрии. (Технет — паршивый способ узнавать что-то новое...)
У меня есть набор 2d точек на декартовой плоскости, и я пытаюсь найти все точки, находящиеся в пределах набора радиусов.
Я создал и заполнил таблицу, используя синтаксис вроде:
Обновить [Вещи] установить [Местоположение] = геометрия::Точка(@X, @Y, 0)
(@X, @Y — это просто значения x и y, 0 — это произвольное число, разделяемое всеми объектами, которое позволяет установить фильтрацию, если я правильно понимаю)
Вот где я схожу с рельсов ... Пытаюсь ли я создать какую-то коллекцию полигонов и запрос, используя это, или есть какой-то простой способ проверки пересечения нескольких радиусов без создания группы круговых полигонов?
Приложение: Если ни у кого нет ответа на вопрос о нескольких радиусах, то каково решение с одним радиусом?
ОБНОВИТЬ
Вот несколько примеров, которые я разработал, используя воображаемую базу данных звезд, где звезды хранятся в координатной сетке x-y в виде точек:
Выбирает все точки в поле:
DECLARE @polygon geometry = geometry::STGeomFromText('POLYGON(('
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + ','
+ CAST(@MaxX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + ', '
+ CAST(@MaxX AS VARCHAR(10)) + ' ' + CAST(@MaxY AS VARCHAR(10)) + ','
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MaxY AS VARCHAR(10)) + ','
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + '))', 0);
SELECT [Star].[Name] AS [StarName],
[Star].[StarTypeId] AS [StarTypeId],
FROM [Star]
WHERE @polygon.STContains([Star].[Location]) = 1
используя это в качестве шаблона, вы можете делать всевозможные интересные вещи, такие как определение нескольких полигонов:
WHERE @polygon1.STContains([Star].[Location]) = 1
OR @polygon2.STContains([Star].[Location]) = 1
OR @polygon3.STContains([Star].[Location]) = 1
Или проверка расстояния:
WHERE [Star].[Location].STDistance(@polygon1) < @SomeDistance
Образец заявления о вставке
INSERT [Star]
(
[Name],
[StarTypeId],
[Location],
)
VALUES
(
@Name,
@StarTypeId,
GEOMETRY::Point(@LocationX, @LocationY, 0),
)