Создание полигона географии из точек в T-SQL
в моем SQL Server (2008 R2) на Azure есть таблица, содержащая много географических Points
(широта/долгота):
CREATE TABLE MyPoints
(
Region uniqueidentifier NOT NULL,
Number int NOT NULL,
Position geography NOT NULL,
CONSTRAINT PK_MyPoints PRIMARY KEY(Region, Number)
)
теперь я хочу создать Polygon
из этой точки определить, какие из моих магазинов расположены в области, определенной точками.
есть ли собственный и быстрый способ построить многоугольник из заданных точек в T-SQL? решения, которые я нашел С помощью STGeomFromText
/STGeomFomWKB
методы создания полигона, который кажется очень громоздко и медленно для меня.
что-то типа:
SET @POLY = geometry::STPolyFromPoints(SELECT Position FROM MyPoints)
2 ответов
насколько я знаю, нет собственной функции, которая принимает таблицу в качестве параметра и преобразует ее в полигон.
лучше всего объединить скалярную пользовательскую функцию для объединения столбца результатов в одну запятую с отдельной строкой со STPolyFromText, о котором вы уже читали.
предполагая, что у нас есть таблица, полная упорядоченных лонгов и латов в этой таблице:
CREATE TABLE [dbo].[LongAndLats](
[Longitude] [decimal](9, 6) NULL,
[Latitude] [decimal](9, 6) NULL,
[SortOrder] [int] NULL
)
это преобразует эти точки в многоугольник:
DECLARE @BuildString NVARCHAR(MAX)
SELECT @BuildString = COALESCE(@BuildString + ',', '') + CAST([Longitude] AS NVARCHAR(50)) + ' ' + CAST([Latitude] AS NVARCHAR(50))
FROM dbo.LongAndLats
ORDER BY SortOrder
SET @BuildString = 'POLYGON((' + @BuildString + '))';
DECLARE @PolygonFromPoints geography = geography::STPolyFromText(@BuildString, 4326);
SELECT @PolygonFromPoints
некоторые замечания:
- полигон должен быть закрыт. то есть. первый и последний пункт должны быть одинаковыми.
- должен иметь минимум 4 очка.
- порядок пунктов важны. Он должен следовать " правилу левой руки / ноги "(области, лежащие с левой стороны нарисованной линии между точками считаются находящимися внутри многоугольника)