Um código interessante que procuro utilizar para demonstrar a complexidade dos polígonos dos tipos geométricos / geográficos do SQL Server, desmembra estes polígonos encontrando todos os pontos que os formam.
O primeiro exemplo é uma CTE simples que desmembra os pontos de círculo gerado pela função STBuffer:
DECLARE @P geometry SET @P = geometry::Point(1, 1, 0).STBuffer(100) ;WITH AUX (ID) AS ( SELECT 1 UNION ALL SELECT ID + 1 FROM AUX ) SELECT TOP (@P.STNumPoints() - 1) ID, @P.STPointN(ID) AS Point FROM AUX OPTION(MAXRECURSION 0)

Sim, um círculo no SQL Server é formado ‘literalmente’ por muuuitos pontos, então é de se pensar duas vezes antes de armazená-lo no banco de dados.
Este segundo exemplo é uma consulta um pouco mais complexa, para desmembrar os pontos dos polígonos de todos os polígonos de uma tabela:
DECLARE @T TABLE (
Id INT IDENTITY,
Geo geometry NOT NULL
)
INSERT INTO @T
VALUES ('POLYGON((1 0, 2 1, 2 2, 3 3, 2 3, 1 2, 1 0))')
, ('POLYGON((3 2, 3 1, 5 1, 5 2 , 4 3, 3 2))')
;WITH AUX (ID) AS (
SELECT 1
UNION ALL
SELECT ID + 1
FROM AUX
)
SELECT Id, 0 AS Id2, Geo.STAsText() AS Descrição, Geo AS Binário
FROM @T
UNION ALL
SELECT Id, Geom.Id2, Geom.Point.STAsText(), Geom.Point.STBuffer(0.05)
FROM @T T
CROSS APPLY (
SELECT TOP (Geo.STNumPoints() - 1)
ID AS Id2,
Geo.STPointN(ID) AS Point
FROM AUX
) AS Geom
ORDER BY Id, Id2
OPTION(MAXRECURSION 0)

2 Respostas para “Spatial Data: Desmembrando Polígonos!?”