Создать географический полигон из точек в T-SQL - PullRequest
7 голосов
/ 16 марта 2012

В моем 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 ]

6 голосов
/ 17 июня 2014

Предположим, у нас есть таблица, заполненная упорядоченными длинными и латами в этой таблице:

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

Насколько я знаю, нет встроенной функции, которая принимает таблицу в качестве параметра и преобразует ее в многоугольник.

Лучше всего объединить скалярную пользовательскую функцию, чтобы объединить столбец результатов в одну строку, разделенную запятой, с STPolyFromText, о котором вы уже читали.

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

MSDN - STPolyFromText

...