Создание полигона географии из точек в 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, о котором вы уже читали.

UDF для объединения столбца в строку CSV

MSDN-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 очка.
  • порядок пунктов важны. Он должен следовать " правилу левой руки / ноги "(области, лежащие с левой стороны нарисованной линии между точками считаются находящимися внутри многоугольника)