Banco de Dados - SQL Server

SQL Server 2008: Spatial Data (dados espaciais)

Algumas das novidades mais esperadas no SQL Server 2008 são os dados espaciais, que abrangem dados Geométricos e Geográficos e ambos são voltados para trabalhar com GeoProcessamento.

por Diego Nogare



Algumas das novidades mais esperadas no SQL Server 2008 são os dados espaciais, que abrangem dados Geométricos e Geográficos e ambos são voltados para trabalhar com GeoProcessamento.

Os dados geométricos são utilizados para a criação de áreas pré-definidas como polígonos (com 3 ou mais pontos), retas e pontos. Já os dados geográficos são utilizados para trabalhar com um determinado ponto baseado nas coordenadas delatitude (linhasparalelas ao meridiano de greenwich, na vertical)e longitude (linhas paralelasà linha do equador, na horizontal).

Exemplos que podem ser usados de um dado geográfico seria uma praça, um predio, um ponto de encontro. Já exemplos de dados geométricos são delimitações como cidades, estados, países, e até mesmo traçado de ruas ou rodovias.

Para criar um exemplo utilizando os novos tipos de dados, duas tabelas precisam ser criadas, uma para estados e uma para ruas. Ambas tabelas utilizarão um tipo de dado geometry, que é para dados geométricos, e neste caso armazenarão poligonos e linhas.

CREATE TABLE tblEstado

(estCodigo int identity(1,1)

,estNome varchar(50)

,estGeometrico geometry)

CREATE TABLE tblRua

(ruaCodigo int identity(1,1)

,ruaNome varchar(50)

,ruaGeometrico geometry)

Depois da criação destas tabelas, foram mapeadas(com pontos ficticios) os estados de São Paulo e Rio de Janeiro. Vejam as marcar que serão utilizadas para criar os dados no SQL Server 2008.

estados.png

Figura 1. Pontos de São Paulo (amarelo) e Rio de Janeiro (vermelho).

INSERT INTO tblEstado(estNome, estGeometrico) values

("São Paulo",geometry::STGeomFromText("POLYGON ((0 25,25 50, 55 48, 70 23, 85 25, 55 0, 30 23, 0 25))", 0))

INSERT INTO tblEstado(estNome, estGeometrico) values

("Rio de Janeiro",geometry::STGeomFromText("POLYGON ((80 29,95 35, 100 40, 110 38, 105 23, 83 20, 80 29))", 0))

Para inserir dados destes pontos na tabela estado, vale lembrar que o poligono necessita iniciar em um ponto e terminar neste mesmo ponto.  Caso isso não aconteça o SQL Server gera um erro semelhante a este, que informa o motivo do erro. O motivo está sublinhado e em negrito.

Msg 6522, Level 16, State 1, Line 1

A .NET Framework error occurred during execution of user-defined routine or aggregate "geometry":

System.FormatException: 24306: The Polygon input is not valid because the start and end points of the ring are not the same. Each ring of a polygon must have the same start and end points.

System.FormatException:

   em Microsoft.SqlServer.Types.Validator.Execute(Transition transition)

   em Microsoft.SqlServer.Types.Validator.EndFigure()

   em Microsoft.SqlServer.Types.ForwardingGeoDataSink.EndFigure()

   em Microsoft.SqlServer.Types.OpenGisWktReader.ParseLineStringText()

   em Microsoft.SqlServer.Types.OpenGisWktReader.ParsePolygonText()

   em Microsoft.SqlServer.Types.OpenGisWktReader.ParseTaggedText(OpenGisType type)

   em Microsoft.SqlServer.Types.OpenGisWktReader.Read(OpenGisType type, Int32 srid)

   em Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid)

   em Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)

Agora que já temos dados de estados armazenados, podemos inserir dois novos registros na tabela de ruas, que na verdade são de rodovias. Veja na Figura 2 os pontos de duas rodovias, uma que vai de São Paulo até o Rio de Janeiro e outra que vai do Rio de Janeiro até Minas Gerais.

rodovias.png

Figura 2. Estrada de São Paulo, Rio de Janeiro e Minas Gerais.

Para inserir estes dados, vamos utilizar uma linha começando em um ponto e terminando em outro, reparem que neste exemplo não é necessário iniciar e terminar no mesmo ponto.

INSERT INTO tblRua(ruaNome, ruaGeometrico) values

("São Paulo - Rio", geometry::STGeomFromText("LINESTRING (45 5, 63 18, 82 27, 93 23)", 0));

INSERT INTO tblRua(ruaNome, ruaGeometrico) values

("Rio - Minas", geometry::STGeomFromText("LINESTRING (93 23, 95 29, 87 38, 86 48)", 0));

Agora já existem os dados na tabela de Estados e Ruas. Se realizar um SELECT nestas duas tabelas, os dados estarão lá, mas não é tão simples de se interpretar. Os dados geométricos são armazenados como Binary.

Mas para provar que os dados realmente existem e funcionam, uma consulta retornando a intersecção entre as ruas e os estados é realizado, e seus retornos provam o que existe em banco.

SELECT ruaNome, estNome

FROM estado e, rua r

WHERE r.ruaGeometrico.STIntersects(estGeometrico) = 1

ORDER BY ruaNome

Um método de intersecção baseado na rua, verifica os dados dos pontos criados pelos polígonos e retorna “1” para quando os dados são válidos.

Repare que o resultado somente mostra os dados das ruas que passam pelos estados que foram criados anteriormente.

ruaNome                   estNome

------------------------- -------------------------------------

Rio - Minas               Rio de Janeiro                                   

São Paulo - Rio           São Paulo                                        

São Paulo - Rio           Rio de Janeiro                                   

(3 row(s) affected)

Com isso, é possível ver a pequena ponta o ice-berg que temos em mãos agora. Com o SQL Server 2008 será possível integrar os dados geográficos com serviços de mapas como o Virtual Earth. Assim que possível monto um artigo abordando esta integração. Por enquanto, vão estudando estas interecções.

Até o proximo artigo.

Diego Nogare

Diego Nogare - Graduado em Ciência da Computação e Pós-Graduado em Engenharia de Computação com ênfase em Desenvolvimento Web com .NET, Colaborador do Portal Linha de Código, co-Líder do grupo de usuários Codificando .NET, co-Líder dos Microsoft Student Partners [MSP] de São Paulo e Microsoft Most Valuable Professional [MVP] em SQL Server, possui certificações MCP e MCTS em SQL Server 2005, é palestrante em eventos da Microsoft, Codificando .NET e INETA BR, mantém o site: www.diegonogare.net.