Я свободно владею SQL, но новичок в использовании функций SQL Geometry. У меня есть то, что, вероятно, является очень простой проблемой для решения, но я не нашел никаких хороших ресурсов в Интернете, которые объясняют, как использовать объекты геометрии. (Technet - это отвратительный способ узнать новые вещи ...)SQL Geometry найти все точки в радиусе
У меня есть набор 2d точек на картезианской плоскости, и я пытаюсь найти все точки, находящиеся в пределах радиуса.
Я создал и заселена таблицу, используя синтаксис, как:
Update [Вещи] установите [Location] = геометрия :: Point (@X, @Y, 0)
(@ X, Y @ являются только значениями x и y, 0 - произвольное число, разделяемое всеми объектами, которое позволяет установить фильтрацию, если я правильно понимаю)
Здесь я схожу с рельсов ... Я пытаюсь построить какой-то многоугольник сбор и запрос с помощью этого или есть простой способ проверки пересечения нескольких радиусов без создания кучи круглых полигонов?
Приложение: Если никто не имеет ответа на вопрос с несколькими радиусами, что такое решение с одним радиусом?
UPDATE
Вот некоторые примеры я работал вверх, используя воображаемую базу данных звезды, где звезды хранятся на ху сетки в точках:
Выбирает все точки в коробке:
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
(
@GameId,
@Name,
@StarTypeId,
GEOMETRY::Point(@LocationX, @LocationY, 0),
)
Интересное второе решение, мне нужно немного поиграть и подумать об этом. Два незначительных момента: я уверен, что, если вы не работаете на изогнутой поверхности, вы не хотите использовать GEOGRAPHY 4326, которая является неевклидовой поверхностью. Это проблема с плоским пространством, поэтому использование GEOMETRY, вероятно, является правильным выбором. Во-вторых, в вашем примере вы предлагаете использовать таблицу sql temp, когда было бы намного лучше (быстрее) использовать переменную таблицы. Таблицы Temp записывают на диск, в памяти хранятся таблицы vars. – MadTigger
@MadTigger Я не мог больше согласиться на использование переменных таблицы, но если честно, я не тратил времени на оптимизацию, а больше теорию, чтобы помочь вам на вашем пути - учитывая, что уже 4 недели у вас уже есть решил! :-) Простите предположение на 4326, опять же, если вы работаете над проблемой с плоским пространством, вы совершенно правы, чтобы не использовать 4326 и использовать Geometry. Я просто привык к людям, использующим Geometry, как копункт для реальных проблем с «Землей», когда они должны использовать Географию, и ваш вопрос был неясным в этом отношении. Предполагаемая привычка - это то, что я должен пинать. –