Spatial Data: Desmembrando Polígonos!?

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 pensamentos sobre “Spatial Data: Desmembrando Polígonos!?

  1. Pingback: Trabalhando com SQL CLR e Spatial Data « SQL From Hell.com

  2. Pingback: Trabalhando com Spatial Data no SQL Server – Resumo « SQL From Hell.com

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s