Spatial Data: Introdução aos tipos geométricos

Boa tarde pessoas!

Algumas funcionalidades para tratamentos de “dados espaciais” foram introduzidos no SQL Server 2008 (e no 2005 sem muito suporte, por meio de um assembly CLR opcional). Mas o que são estes tipos de dados? Bem, eles são tipos CLR nativos da engine de banco de dados do SQL Server 2008. O suporte a estes tipos de dados possibilita inserir dentro da engine tratamento a dados geométricos e geográficos. Basicamente, agora você pode armazenar pontos, linhas e polígonos como um único tipo de dado dentro do banco de dados, indexar, executar cálculos dos simples aos mais complexos.

Bom, creio que eu já tenha vendido a idéia, então vamos ao nosso primeiro exemplo:

SELECT geometry::Point(1,1,0)

E temos como resultado:

0x00000000010C000000000000F03F000000000000F03F

Interessante, não é? Bem antes que me chamem de louco, no resultado desta consulta é possível verificar que existirá uma aba “Spatial results”:

Nesta aba, você poderá acompanhar os resultados de suas consultas com tipos geométricos.

Geometry presente na sintaxe é a “classe” que define os tipos geométricos e Point é um “método estático” que permite criar por meio de coordenadas a posição do ponto, como no exemplo “1, 1”. Já “0” é um “número mágico” (como disse o Javier Loria na palestra de Spatial Data no TechEd de 2009), pois por enquanto não há muita utilidade falarmos sobre ele.

Visto que um ponto não possui uma ‘área visível’, vamos utilizar o método STBuffer para determinar uma área, exemplo:

SELECT geometry::Point(1,1,0).STBuffer(1)

Resultado:

Uma forma de exibir vários resultados de tipos geométricos juntos é utilizando UNION ALL, exemplo:

SELECT geometry::Point(10,10,0).STBuffer(1)
UNION ALL
SELECT geometry::Point(20,20,0).STBuffer(1)
UNION ALL
SELECT geometry::Point(25,10,0).STBuffer(1)

Resultado:

Para trabalhar com variáveis ou criar colunas do tipo geométrico, você pode declarar simplesmente como “geometry”, exemplo:

DECLARE @Ponto geometry
SET @Ponto = geometry::Point(10,10,0)
SELECT @Ponto.STBuffer(1)

Uma dica importante: STBuffer cria poligono sobre o tipo geométrico, criando um dado bem maior que o original (como é possível ver na aba Results dos exemplos anteriores), desta forma, se você deseja salvar um ponto, linha ou polígono no banco de dados, não salve-o com o método STBuffer, ou você estará salvando um dado muito maior e mais complexo do que é dado realmente é. Limite o uso do método STBuffer para cálculos e exibição de consultas.

Caso você possua alguma identificação para seus dados geométricos, por exemplo, um nome, você pode visualizar este nome no resultado de suas consultas:

Exemplo:

SELECT geometry::Point(10,10,0).STBuffer(1), 'Meu Ponto' AS Titulo

Por enquanto é uma introdução, nos próximos artigos estarei trabalhando melhor outras funcionalidades presentes no SQL Server para estes tipos de dados.

Caso você deseje conhecer um pouco mais:
http://msdn.microsoft.com/en-us/library/bb933876.aspx

7 pensamentos sobre “Spatial Data: Introdução aos tipos geométricos

  1. Fala Paulo.
    Tipos espaciais também são muito usados no postgreS. Tanto que o projeto amazonia legal e o ministério do meio ambiente utilizam este tipo de dado no postgres para mapear as regiões de queimadas, derrubadas de árvores e também verificar se há sobreposição de terras nas propriedades rurais privadas brasileiras.
    Quando estudei geoestatística tive que utilizar este tipo ‘vetor’ para mapear apartamentos aqui em curitiba. Também existem muitas propriedades matemáticas por trás dos tipos especiais, já que um grande conjunto de informações pode ser denotado como uma grande matriz e podemos utilizar uma gama de aplicações de algebra linear para resolver problemas reais.

  2. Discordo do Javier Loria… existe sim muita utilidade com tipos espaciais (senão isso não teria sido inventado). Talvez ele não tenha aplicado alguma técnica real e tenha apenas conhecimentos técnicos sobre o sql server.
    Na prática os programas(softwares) para mapeamento de terras demoram dias e dias para realizarem seu trabalho (em grande escala é claro), com o uso dos tipos espaciais esse tempo diminui muito… na prática esse ganho tempo é utilizado para que as autoridades possam agir de forma antecipada na prisão de criminosos ambientais.

    • E ai Cleibson!

      Escreveu um artigo no meu artigo!rsss

      Seguinte… o que falei sobre o Javier era somente do “número mágico” que é utilizado além do X e Y, aquele 0 do Point(X,Y,0), que se refere ao tipo de cordenada (que é muito chato de explicar).

      Se tiver algum algoritmo legal (tipo aqueles de identificar área com maior volume de pontos, visto que você é o cara de estatística), pode me passar que dou um jeito de implementar!

      Vou postar algumas coisas sobre bancos livres em breve, principalmente MySQL.

      Valeu pelos comentários!!!

  3. Só pra justificar o comentário anterior.
    Lembre-se que em casos reais a localização exata de uma propridade são dadas por coordenadas de latitude e longitude (x,y) que formam um ponto e sua área é dada pelo vetor de pontos (x,y) combinados entre si, formando o polígono como você explicou aí no post.

  4. Paulo. Aqui vai uma idéia para você complementar este post.

    Seja o seguinte conjunto

    x y npt ptx pty

    Sendo:
    x=coordenada inicial x (tipo real)
    y=coordenada inicial y (tipo real)
    npt=numero de pontos que formam o poligono de determinada região (tipo inteiro)
    ptx=coordenadas x em cada ponto do poligono (tipo espacial)
    pty=coordenadas y em cada ponto do poligono (tipo espacial)

    ex:
    x y npt ptx pty
    -25.89 -49.38 5 (-25.89 -25.90 -25.92 -25.87 -25.89) (-49.38 -49.42 -49.45 -49.40 -49.38)
    … (invente umas 30 amostras)

    E depois escreva um algoritmo que diga se há sobreposição de área e mostre quais áreas estão sobrepostas. Esta é uma aplicação básica e muito interessante para mostrar o uso deste tipo de dado. Imagine se tivesse montar arrays a partir de reais para formar cada ponto do poligono? Muito trabalho não!!!

    Sobre o comentário eu tinha entendido outra coisa. Foi mal.

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

  6. 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