Novo datatype do SQL Server 2008 – Spatial Data
Artigo SQL Magazine 64 - Novo datatype do SQL Server 2008 – Spatial Data
A proposta deste artigo é apresentar uma forma simples e bem prática da criação de uma aplicação Web que utiliza o SQL Server 2008 como base de dados e o Virtual Earth da Microsoft como sendo uma aplicação de terceiro para interação.
Uma das coisas que mais estão em evidência hoje em dia é o sincronismo de informações em tempo real dos nossos sistemas com aplicativos de terceiros. Uma prova disso é a necessidade cada vez maior de aplicativos/soluções baseadas em soluções web. Com o advento da Web 2.0, a maioria das empresas está solicitando que os aplicativos interajam com estas soluções externas para coletar informações importantes para o bom andamento do trabalho. A proposta deste artigo é apresentar uma forma simples e bem prática da criação de uma aplicação Web que utiliza o SQL Server 2008 como base de dados e o Virtual Earth da Microsoft como sendo uma aplicação de terceiro para interação.
Relembrando o que é Latitude e Longitude
No SQL Server 2008, foram incorporados diversos novos tipos de dados, e um dos segmentos são os Spatial Datas (Dados Espaciais). Com esses tipos de dados é possível trabalhar com dados geográficos, que são baseados em um ponto de coordenada de Latitude e Longitude, e com dados geométricos que são baseados em no mínimo dois pontos geográficos para traçar uma linha ou com três ou mais pontos para traçar um polígono.
Quando pensamos em encontrar algum ponto geográfico no mapa geodésico (em formato oval, como é o globo terrestre) precisamos encontrar este ponto através da Latitude e da Longitude. Para isso, é preciso voltar um pouco até o segundo-grau quando aprendemos como encontrar essa informação. Para facilitar a lembrança, vamos analisar a Figura 1 que explica como é gerada essa informação.
Figura 1. Linhas imaginárias de Latitude e Longitude
Na Figura 1, é possível visualizar diversas linhas verticais e horizontais cinzas, mas o que nos interessa são as linhas vermelha e preta centrais. A linha vermelha é a linha imaginária que representa a Longitude. Ela e suas paralelas são verticais e seguem ao meridiano de Greenwich (que está representado em vermelho), que por sua vez separa a Terra em hemisfério oriental (leste) e hemisfério ocidental (oeste). Os pontos de Longitudes chegam a no máximo 180 graus para cada lado, que somando ambos os hemisférios completam os 360 graus do globo.
Já a linha de cor preta representa a Latitude. Esta linha e suas paralelas são horizontais e acompanham a linha imaginária do Equador (que está de preto na Figura 1). Esta linha divide o planeta Terra em norte e sul, seus graus vão até no máximo 90 para cada lado, para somar e completar os 180 graus que são necessários para gerar os pontos e cobrir completamente o globo terrestre.
Para gerar os pontos de Latitude e Longitude, é necessário encontrar um ponto comum entre as duas coordenadas, chamado de ponto de colisão. Na Figura 1 o ponto comum entre a Latitude e a Longitude está em amarelo e indicando o ponto Zero-Zero. Para entender melhor como são gerados estes pontos, acompanha na Figura 2 que é explicado com mais detalhes a geração dos pontos de colisão das coordenadas.
Figura 2. Geração de um ponto de Latitude e Longitude
Para a geração de um ponto, são necessários três passos. Primeiro é traçado uma linha do centro da Terra até o ponto Zero-Zero, que é o cruzamento entre o Meridiano de Greenwich e a Linha do Equador. O segundo passo é levar a linha de Longitude até o ponto em Leste (direita) ou Oeste (esquerda). O terceiro passo é encontrar o ponto na Latitude, elevando a localização para Norte (cima) ou para Sul (baixo) da linha do equador. Estes pontos que foram criados geram graus de abertura de um raio para Longitude e Latitude, e eles que darão origem ao ponto localizado. No exemplo da Figura 2, foi aberto 60° pra Oeste e 45° para Norte, chegando até Sydney. O ponto azul no centro do globo indica o centro da Terra, a vértice vermelha indica a Longitude aberta com 60°, a vértice amarela indica a Latitude aberta com 45° e por final o ponto verde indica o Ponto Geográfico de Latitude e Longitude, representado por 60ºO e 45ºN.
No SQL Server 2008, o DataType Geography não armazena informações de direção (Norte, Sul, Leste e Oeste), a solução que a Microsoft encontrou para saber a direção que o ponto está sendo traçado é a utilização de valores positivos e negativos. Para traçar um ponto de Longitude para Oeste, o SQL Server armazenará este ponto negativo, e quando a Longitude for para Leste, será gravado o valor positivo. Para a Latitude segue o mesmo principio, quando o ponto vai para Norte o SQL armazena o valor positivo e quando vai para o Sul o armazenamento é negativo. Voltando ao exemplo da Figura 2, o SQL Server registraria os valores -60 e 45.
Os dados geográficos no SQL Server 2008
Este novo DataType armazena os valores de Latitude e Longitude em uma coluna do tipo Geography, porém quando se consulta os dados armazenados desta coluna, o retorno é um binário. Este efeito acontece justamente para a Engine do SQL Server conseguir armazenar os pontos de Latitude e Longitude em um único registro. Quando é preciso retornar os valores específicos de Latitude ou Longitude, entra em cena um dos grandes benefícios de se trabalhar com este novo DataType. É possível fazer a chamada específica de um ou dos pontos (de Latitude ou Longitude) utilizando um método já existente no SQL Server. Esta funcionalidade será apresentada ao longo deste artigo.
Para criar uma tabela que armazenará os dados geográficos, vamos precisar criar um banco de dados de exemplo, e em seguida a tabela com a coluna do tipo Geography. Veja esta criação na Listagem 1.
Listagem 1. Criação do Banco de Dados e da Tabela.
1. CREATE DATABASE dbSqlMagazine
3. USE dbSqlMagazine
5. CREATE TABLE tblPosicao
6. (posCodigo int not null identity(1,1)
7. ,posTitulo varchar(50)
8. ,posDescricao varchar(100)
9. ,posPosicao geography)
Na primeira linha da Listagem 1 é criado o banco de dados chamado dbSqlMagazine, que servirá de base para nossas tabelas de exemplos do artigo. Na terceira linha, é informada qual será a base a ser utilizada a partir de agora. E para fechar este bloco de códigos, da quinta à oitava linha é criada a tabela que armazenará um Titulo e uma descrição para este ponto, ambos do tipo varchar que já é bem conhecido. A grande novidade desde código é a última linha, que é do tipo Geography, e que será o foco principal do artigo.
Como gerar informações geográficas reais?
Para se trabalhar com informações de pontos geográficos, é possível inserir qualquer informação dentro do limite existente dos pontos. Isso é, para Latitude os pontos são de -90 até +90 e para Longitude de -180 até +180. Um exemplo de codificação que insere um registro na tabela que criamos de exemplo seria este apresentado na Listagem 2.
Listagem 2. Inserção de um registro na tabela.
INSERT INTO tblPosicao(posTitulo, posDescricao, posPosicao)
VALUES ('Titulo', 'Descrição', GEOGRAPHY::POINT(0,0,4326))
A codificação é simples: a sintaxe do INSERT é trivial. A parte que é novidade é a inserção de um registro geográfico baseado em ponto. Para esta inserção, é necessário trabalhar com um método próprio para a criação do ponto, representado pelo código "GEOGRAPHY::POINT(A,B,C)" que criará um ponto baseado nos três parâmetros A, B e C que representam respectivamente a Latitude, a Longitude e o SRID. O SRID é o ID da referência espacial, e não é necessário alterar o valor 4326 que é padrão para entender o funcionamento neste momento. No exemplo da Listagem 2, é criado o ponto imaginário Zero-Zero.
Se uma busca for feita na tabela neste momento, onde só este registro é existente, o campo posição retornará um valor binário em hexadecimal. Acompanhe na Listagem 3 a consulta e o resultado apresentado.
Listagem 3: Consulta à tabela de Posições e resultado esperado.
SELECT posPosicao FROM tblPosicao
0xE6100000010C00000000000000000000000000000000
Na linha 1 da Listagem 3 é feita uma busca simples pelo campo posPosicao, que armazena os dados geográficos. O registro apresentado na linha 2 com o resultado da consulta é binário, dificultando a leitura em um primeiro momento. Para resolver este problema de encontrar a posição de Latitude e Longitude, o SQL Server 2008 fornece dois métodos para este DataType retornar as posições separadas. Acompanhe na Listagem 4 a consulta e o resultado usando estes métodos."