Post on 17-Sep-2019
FACULDADE FARIAS BRITO
CIÊNCIA DA COMPUTAÇÃO
CICERO ROBSON BARROS FEITOSA
MANIPULAÇÃO DE INFORMAÇÕES GEOGRÁFICAS EM UM BANCO DE DADOS ESPACIAL
Fortaleza
2013
CICERO ROBSON BARROS FEITOSA
MANIPULAÇÃO DE INFORMAÇÕES GEOGRÁFICAS EM UM BANCO DE DADOS ESPACIAL
Monografia apresentada para obtenção dos créditos da disciplina Trabalho de Conclusão de Curso da Faculdade Farias Brito, como parte das exigências para graduação no Curso de Ciência da Computação.
Orientador: MSc. Ricardo Wagner Cavalcante Brito.
Fortaleza
2013
F142m Feitosa, Cícero Robson Barros Manipulação de informações geográficas em um banco de dados espacial / Cícero Robson Barros Feitosa 65 f. : il. : color. Monografia (Graduação) – Faculdade Farias Brito, Fortaleza, 2013. Orientador: Prof. Msc. Ricardo Wagner Cavalcante Brito
1. Espacial. 2. Geometria. I. Brito, Ricardo Wagner Cavalcante. (orient.) II. Faculdade Farias Brito. Graduação em Ciência da Computação. III. Título.
CDD 005
MANIPULAÇÃO DE INFORMAÇÕES GEOGRÁFICAS EM UM BANCO DE DADOS ESPACIAL
Cicero Robson Barros Feitosa
PARECER ____________________________
NOTA: FINAL (0-10): ______
Data: ____/____/_______
BANCA EXAMINADORA
______________________________
Prof. Msc. Ricardo Wagner Cavalcante Brito (Orientador)
______________________________
Prof. Dr. Daniel de Matos Alves (Examinador)
______________________________
Prof. Msc. Murilo Eduardo Ybanez Nascimento (Examinador)
AGRADECIMENTOS
Agradeço primeiramente a Deus por esta conquista, por iluminar-me e guiar-me ao
longo desta jornada no Curso de Ciência da Computação.
Aos meus pais, Geralda e Januário, minha avó Edite e meu tio-avô Damião, que me
apoiaram neste percurso e, que sem Deus e eles não teria sido possível alcançar esta
conquista.
À minha irmã Rejane pelo seu incentivo e apoio.
Ao meu orientador, Ricardo Wagner pela paciência e dedicação ao longo no
desenvolvimento deste trabalho.
Aos professores Maikol, Sérgio, Daniel, Lúcio, Leopoldo, Flaúdio, Paulo Benício e
Elizabeth e também aos ex-professores Aragão, Ernani, Sales, Wietske e Eugênia pelas
contribuições para a minha formação profissional e pelas experiências repassadas ao longo
das disciplinas.
À minha namorada Josiane pelo seu amor, apoio e dedicação.
Aos meus ex-colegas de estágio da Caixa Econômica Federal e Justiça Federal pelas
experiências repassadas e pelos conhecimentos adquiridos, que contribuíram para minha
formação profissional.
A todos os meus amigos que participaram desta conquista e que contribuíram para que
esta fosse alcançada, com os diversos trabalhos, provas e conhecimentos adquiridos ao longo
do curso.
RESUMO
A criação do Modelo Relacional no final da década de 1960 por Edgar Frank Codd
possibilitou o armazenamento de dados em sistemas computacionais. Desde sua concepção,
este modelo de dados vem evoluindo para implementações mais robustas. Na tentativa de
integração entre o paradigma da orientação a objetos e os sistemas de bancos de dados
relacionais, surgiu o banco de dados Objeto-Relacional. Este tornou possível a criação de
tipos abstratos de dados (TADs) em Sistemas Gerenciadores de Bancos de Dados (SGBDs).
Por meio desta técnica, foram desenvolvidos novos tipos de bancos de dados de propósitos
específicos. Um destes tipos foi o Banco de Dados Espacial. Este, por sua vez, provê diversas
funcionalidades para a manipulação de elementos do mundo real por meio da geometria
euclidiana, além de outros recursos de vetorização de imagens digitais. Diante disto, o
presente trabalho visa à criação de um conjunto de rotinas na linguagem procedural
PL/pgSQL, para manipulação de elementos geográficos por meio da geometria euclidiana.
Estes elementos serão criados com base no modelo espacial de dados, utilizando os recursos
da extensão espacial PostGis, proveniente do SGBD PostgreSQL. Este conjunto de
funcionalidades será aplicado em um problema do mundo real, onde será tratado um cenário
relativo à distribuição de preços de combustíveis em diversos postos de gasolina.
Palavras chave: Relacional. Objeto-relacional. Espacial. Geometria. PostgreSQL. Type.
Procedure. PostGis.
SUMÁRIO
INTRODUÇÃO ..................................................................................................................................... 9
1. BANCOS DE DADOS RELACIONAIS.................................................................................... 12
1.1 MODELO RELACIONAL ......................................................................................................................... 12 1.2 MODELAGEM ........................................................................................................................................ 13 1.3 SQL-92................................................................................................................................................. 16 1.4 SGBD................................................................................................................................................... 18
2. BANCO DE DADOS OBJETO-RELACIONAL...................................................................... 21
2.1 ORIENTAÇÃO A OBJETOS ...................................................................................................................... 21 2.2 BANCO DE DADOS ORIENTADO A OBJETOS .......................................................................................... 22 2.3 BANCO DE DADOS OBJETO RELACIONAL.............................................................................................. 23
3. BANCO DE DADOS ESPACIAL .............................................................................................. 25
3.1 SISTEMA DE INFORMAÇÕES GEOGRÁFICAS (SIG) ................................................................................. 25 3.2 CARACTERÍSTICAS DO BDE.................................................................................................................. 26 3.3 POSTGIS................................................................................................................................................ 31
4. SOLUÇÃO PROPOSTA............................................................................................................. 36
4.1. CRIAÇÃO DOS NOVOS TIPOS DE DADOS ................................................................................................. 38 4.2. CRIAÇÃO DAS FUNCIONALIDADES......................................................................................................... 39 4.3. COMPARATIVO DE FUNCIONALIDADES: BDR, BDE E SOLUÇÃO PROPOSTA:......................................... 48
5. ESTUDO DE CASO .................................................................................................................... 53
5.1 CENÁRIO............................................................................................................................................... 54 5.2 ELABORAÇÃO DA BASE DE DADOS ....................................................................................................... 55
5.2.1. Elaboração do Diagrama Entidade-Relacionamento ................................................................. 55 5.2.2. Elaboração do Diagrama Relacional ......................................................................................... 55 5.2.3. Criação do script SQL................................................................................................................. 57
6. CONCLUSÃO.............................................................................................................................. 62
REFERERÊNCIAS BIBLIOGRÁFICAS......................................................................................... 64
LISTA DE FIGURAS
Figura 1 – Exemplo de DER (REZENDE, 2006). ............................................................................. 15
Figura 2 – Exemplo de DR (REZENDE, 2006). ................................................................................ 15
Figura 3 – Visão contínua e visão discreta (SPACCAPIETRA, 2007)............................................ 27
Figura 4 – Mapa do Brasil em termos de suas latitudes e longitudes (Maps of World, 2012)...... 28
Figura 5 – Tipos de Dados Primitivos da extensão Geometry (FERREIRA, QUEIROZ & CÂMARA, 2007).................................................................................................................................. 29
Figura 6 – Hierarquia de classes da extensão espacial Geometry (MEDEIROS, 2012)................. 30
Figura 7 – Relacionamentos entre elementos espaciais (SPACCAPIETRA, 2007). ...................... 31
Figura 8 – A comunicação entre a BDG e o PostgreSQL por meio do PostGis (IBIS, 2012). ....... 32
Figura 9 – Visualização dos Distritos de São Paulo (FERREIRA & QUEIROZ, 2005). .............. 34
Figura 10 – Visualização dos bairros de São Paulo (FERREIRA & QUEIROZ, 2005)................ 35
Figura 11 – Distância entre dois pontos (Martins, 2013). ................................................................ 50
Figura 12 – DER Postos de Gasolina. ................................................................................................ 56
Figura 13 – DR Postos de Gasolina. ................................................................................................... 57
LISTA DE TABELAS
Tabela 1 – Características do DER (GUIMARÃES, 2008)................................................................... 14
Tabela 2 – Principais comandos DDL e DML da linguagem SQL (MILANI, 2008). .......................... 17
Tabela 3 – Comparativo de criação da tabela de ruas............................................................................ 48
LISTA DE ABREVIATURAS E SIGLAS
Sigla Significado
ACID Atomicidade, Consistência, Isolamento e Durabilidade
BDE Banco de Dados Espacial
BDOO Banco de Dados Orientado a Objetos
BDOR Banco de Dados Objeto-Relacional
BDR Banco de Dados Relacionais
CEP Código de Endereçamento Postal
CPF Cadastro de Pessoa Física
CRUD Create, Read, Update, Delete
DDD Discagem Direta de Longa Distância
DDL Data Definition Language
DER Diagrama Entidade-Relacionamento
DML Data Manipulation Language
DR Diagrama Relacional
GPS Global Positioning System
SGBD Sistema Gerenciador de Banco de Dados
SGBDOR Sistema Gerenciador de Banco de Dados Objeto-Relacional
SIG Sistema de Informações Geográficas
SQL Structured Query Language
TAD Tipo Abstrato de Dados
UF Unidade Federativa
9
INTRODUÇÃO
Nas últimas décadas, o fluxo intenso de veículos nos perímetros urbanos do país
aumentou consideravelmente. Este fator provocou um aumento no tempo de deslocamento de
uma região a outra e o transporte de mercadorias entre duas regiões tornou-se mais
dispendioso. Com o aumento na variação de preços de produtos por região, muitas empresas
estão criando sistemas computacionais para administrar melhor a distribuição de preços de
seus produtos. Esses sistemas estão servindo também como uma estratégia na tentativa de
prover alguma forma de economia para seus clientes.
Além disso, muitas empresas disponibilizam, em seus sites, recursos extras para seus
clientes. Um destes recursos permite que o cliente digite o tipo de produto desejado. A partir
desta informação, o site realiza uma busca, retornando estabelecimentos dos afiliados da
empresa que possuem o item desejado pelo cliente, mostrando o preço e a descrição do
mesmo. Com isso, os clientes poderão saber aonde ir para comprar o produto que está
procurando. As informações da empresa que são mostradas na busca feita pelo cliente vão
desde um simples número de telefone, até a localização física da empresa, contendo endereço
e a visualização do mesmo em um mapa.
Com a tecnologia de representação de dados reais em um mapa, os estudiosos da
ciência da informação obtiveram uma nova perspectiva: a criação de sistemas para
armazenamento de informações geográficas. Estes sistemas visam tratar a representação de
elementos geográficos por meio da geometria. Exemplos desses elementos podem ser uma
rua, uma avenida, um estabelecimento comercial ou uma indústria.
10
Devido a isso, uma questão precisou ser levada em consideração: como armazenar
dados geográficos em um sistema? Os sistemas computacionais comumente se utilizam de
bancos de dados para armazenar suas informações.
O modelo mais comumente utilizado para o armazenamento de dados, o Modelo
Relacional, surgiu no final da década de 1960 e continua sendo preponderante. Esse modelo
manipula os dados em tabelas, formadas por linhas e colunas. As colunas representam
atributos, as características de uma entidade do banco de dados. As linhas contêm os valores
desses atributos, para cada elemento da tabela.
Para a utilização de informações geográficas, o Modelo Relacional, apesar de sua
ampla difusão, não se mostrou suficientemente adequado. Para tanto, surgiu uma variação
chamada de Banco de Dados Espacial (BDE), oriunda do Banco de Dados Objeto-Relacional
(BDOR) e, conseqüentemente, do Banco de Dados Relacionais (BDR). O BDE diferencia-se
dos anteriores pelo armazenamento de informações que o BDR e o BDOR não suportam.
Através da criação de funções e de novos tipos de dados, é possível armazenar, nesse tipo de
banco, representações geométricas de elementos geográficos.
Diante da perspectiva de sistemas apresentada, esse trabalho visa criar um conjunto de
funcionalidades para facilitar a manipulação de dados geográficos em um sistema
computacional. A pesquisa apresentará novos tipos de dados que permitirão mapear estes
dados geográficos, além de diversas rotinas que tornarão possível executar operações
matemáticas sobre estes tipos de dados. Estas operações matemáticas utilizarão princípios da
geometria euclidiana.
Depois de implementados os novos tipos de dados e funções, será elaborado um
modelo de dados que contém informações relacionais e espaciais. Esse modelo será um
diagrama relacional, acrescido de atributos cujo tipo é um dado espacial, além de um conjunto
de funções para manipulação destes dados. Juntamente a isso, será desenvolvido um script de
modelo de dados, composto por um código na linguagem de manipulação de dados SQL
(Structured Query Language). Esse código poderá ser executado em um Sistema Gerenciador
de Banco de Dados (SGBD) para criação da base de dados. Nesta pesquisa, será adotado o
SGBD PostgreSQL. O modelo de dados será construído com base em um cenário real no qual
será a aplicado o conjunto de funcionalidades que será desenvolvido.
11
O trabalho está dividido em seis capítulos. No primeiro capítulo são detalhadas as
características do BDR. No segundo capítulo, são apresentados os elementos que compõem o
BDOR. O terceiro capítulo descreve as tecnologias relativas ao Banco de Dados Espaciais e
apresentará trechos de código na linguagem SQL para este tipo de banco. Estes trechos de
código seguem a sintaxe do SGBD PostgreSQL e de sua extensão espacial PostGis. No quarto
capítulo serão apresentados os tipos de dados e as funcionalidades que serão desenvolvidos
nesta pesquisa. No quinto capítulo será ilustrada a aplicação das funcionalidades
implementadas através de um estudo de caso, no qual será tratada uma situação do mundo real
e uma possível solução para a mesma. O último capítulo apresentará as conclusões finais do
projeto, bem como sugestões para trabalhos futuros.
12
1. BANCOS DE DADOS RELACIONAIS
A seguir, serão elencados os aspectos teóricos relativos ao Banco de dados Relacional
(BDR). Além disto, serão apresentados exemplos de diagramação e trechos de códigos na
linguagem de manipulação de dados SQL.
1.1 Modelo Relacional
Em 1969, o matemático Edgar Frank Codd criou o Modelo Relacional. Esse modelo
consiste no armazenamento de dados em forma de tabelas. Cada tabela possui atributos de
diferentes tipos. Esses atributos correspondem às características do elemento que está sendo
modelado. Cada atributo corresponde a uma coluna da tabela. Cada linha de uma tabela é
chamada de registro ou tupla.
Assim, por meio da publicação da obra de Codd (CODD,1969), iniciou-se o
desenvolvimento de sistemas mais robustos para armazenamento de dados, sistemas estes
que, nas quatro últimas décadas, tornaram-se predominantes no mercado mundial: o Banco de
Dados Relacional.
Uma das características fundamentais do BDR diz respeito às restrições de
integridade, que servem para garantir a consistência e exatidão dos dados. Exemplos destas
regras são as chaves primárias e as chaves estrangeiras.
13
1.2 Modelagem
Antes de ser implementado um novo banco de dados, deve-se criar um modelo de
dados. Esse modelo trata-se da diagramação do banco de dados, com todos os elementos que
o compõem. Segundo Silberschatz, Korth & Sudarshan (1999, p.7), um modelo de dados é
“um conjunto de ferramentas conceituais usadas para a descrição de dados, relacionamentos
entre dados, semântica de dados e regras de consistência”. Ou seja, no modelo de dados estão
descritos os elementos que devem estar presentes na base de dados, bem como os
relacionamentos entre eles.
O primeiro passo do processo de diagramação da base de dados relacional corresponde
à criação do Diagrama Entidade-Relacionamento (DER). Neste modelo, os elementos que
compõem a base de dados são representados por meio de figuras geométricas. Isto servirá de
documento base para a elaboração do Diagrama Relacional (DR). No DER, os elementos
principais são denominados de entidades. Cada entidade representa um elemento do mundo
real, como empresas, veículos, cidades. Além disso, cada entidade possui atributos, que são
suas características. As diversas entidades do modelo podem ser interligadas por meio de
relacionamentos. (GUIMARÃES, 2008).
O DER também possui as seguintes características: As entidades são representadas por
retângulos. Os atributos, que podem ser do tipo simples, composto, derivado ou
multivalorado, são representados por círculos. Neste caso, se o atributo for simples, ele é
representado por uma única elipse; se ele for do tipo composto, o mesmo será representado
por elipses interligadas; por sua vez, se o atributo for do tipo derivado, ele deve ser
representado por uma elipse com seus contornos pontilhados; por fim, se o atributo for do tipo
multivalorado, ele deve ser representado por uma elipse dupla (GUIMARÃES, 2008).
Já os relacionamentos entre entidades devem ser representados por losangos, contendo
suas cardinalidades. Estas cardinalidades são pares formados pelos elementos 1 e N, que são
utilizados para determinar como as tabelas se relacionam. Além destes, existem as
especializações e generalizações. Estes são mecanismos para identificar se uma entidade
herdará atributos de outra entidade. No DER, as especializações/generalizações são
representadas por triângulos. Na Tabela 1, estão representadas as características do DER.
14
Tabela 1 – Características do DER (GUIMARÃES, 2008).
Para a construção do DER, existem algumas ferramentas disponíveis no mercado.
Exemplos delas são o SQL Power Architect, O Gliffy, o brModelo e o Dia Portable. Um
exemplo de DER pode ser encontrado na Figura 1.
Elemento Representação
Entidade
Atributo simples
Atributo composto
Atributo multivalorado
Atributo derivado
Relacionamento
Especialização/
Generalização
15
Figura 1 – Exemplo de DER (REZENDE, 2006).
O segundo passo consiste na criação do Diagrama Relacional (DR). Diferente do
DER, no DR são especificados o tipo de dado e tamanho de cada atributo, além de seu
conteúdo e suas restrições de integridade. Os relacionamentos entre as tabelas também são
representados neste modelo por meio de linhas que interligam as tabelas. Para a construção do
DR, existem diversas ferramentas disponíveis no mercado. Além das ferramentas já citadas
para a construção do DER, com exceção da Gliffy, é possível citar também o Sybase Power
Designer, a DB Designer, a EMS SQL Manager e o CA ERwin Data Modeling. Um exemplo
de DR pode ser encontrado na Figura 2.
Aluno
mat_aluno nome endereco turma
1 Cecília Ortiz Rezende Rua dos Ipês, 37 1
2 Abílio José Dias Avenida Presidente Jânio Quadros, 357 2
Turma
cod_turma sala período
1 8 Manhã
2 5 Noite
Figura 2 – Exemplo de DR (REZENDE, 2006).
16
Concluída a etapa de modelagem, deve ser gerado um script na linguagem SQL. O
código será utilizado para a implementação do modelo de dados em um SGBD. Nesta
pesquisa, os scripts a serem apresentados serão adaptados para a sintaxe do SGBD
PostgreSQL.
1.3 SQL-92
A criação dos diagramas DER e DR tornou possível o armazenamento de informações
do mundo real em uma base de dados relacional. Para tanto, foi elaborada uma linguagem de
manipulação de dados específica para este fim.
Uma linguagem de manipulação de dados é constituída de comandos para a criação,
atualização e exclusão dos elementos que compõem a base de dados do sistema, também
chamados de comandos DDL (Data Definition Language); além destes, existem comandos
para a inserção e manipulação de dados armazenados na base, denominados de comandos
DML (Data Manipulation Language). Ou seja, Os comandos DDL servem para tanto para a
criação e exclusão da base de dados, como para a criação, alteração e exclusão das tabelas e
atributos que irão compor esta base; já os comandos DML são utilizados para inserir,
consultar, remover e alterar dados que estão armazenados nas tabelas da base de dados.
(SILBERSCHATZ, KORTH & SUDARSHAN, 1999).
Com a criação dos comandos para a manipulação e criação de elementos de uma base
de dados, surgiram linguagens especificas para este fim. Exemplos disto são as linguagens
QEL, OQL e SQL. As duas primeiras não se firmaram no mercado; já a SQL, pela sua
robustez e simplicidade de seus comandos DDL e DML, tornou-se o padrão adotado nos
principais SGBDs comerciais existentes. A Tabela 2 lista os principais comandos DDL e
DML da SQL-92.
17
Tabela 2 – Principais comandos DDL e DML da linguagem SQL (MILANI, 2008).
Comandos DML
Comando Utilização Exemplos de Código (PostgreSQL)
CREATE Criação de bases de dados, tabelas, views e procedures.
CREATE DATABASE Teste;
CREATE SEQUENCE seq_pessoa
START 1, INCREMENT 1; 1
CREATE TABLE Pessoa (
id integer default nextval (seq_pessoa),
Nome varchar(100),
CPF varchar(11)
);
CREATE VIEW dadosPessoas AS SELECT * FROM Pessoa;
CREATE FUNCTION atualizaNome (varchar, integer) RETURNS VOID AS $$
BEGIN;
UPDATE pessoas SET nome = $1 WHERE id = $2;
END; $$LANGUAGE plpgsql;
ALTER Alterar as propriedades de uma sequence ou de uma tabela.
ALTER SEQUENCE seq_pessoa RESTART WITH 1;
ALTER TABLE Pessoa ADD COLUMN rg varchar(20);
DROP Excluir uma sequence, uma tabela ou uma base de dados por completo.
DROP SEQUENCE seq_pessoa;
DROP TABLE Pessoa;
DROP DATABASE Teste;
1 As sequences são campos cujo valor é auto-incrementável. Ou seja, o valor deste campo obedece a uma sequência ordenada. No PostgreSQL, para atribuir um auto-incremento em um campo de uma tabela, faz-se necessária à criação de sequences. Já no SBGD SQL Server, não há necessidade de criação desse tipo de estrutura, devido à existência da clausura Identity.
18
Comandos DML
INSERT Inserir dados nas tabelas da base de dados
INSERT INTO Pessoa (nome, CPF) values (‘José’, ‘11111111122’);
SELECT Realizar uma consulta nos dados de uma tabela.
Fazer chamadas de views e procedures.
SELECT * FROM Pessoa;
SELECT * FROM dadosPessoa;
SELECT atualizaDados( ‘João’,1);
UPDATE Atualizar os valores dos registros de uma tabela.
UPDATE Pessoa SET nome = ‘João’ WHERE id = 1;
DELETE Excluir os valores dos registros de uma tabela.
DELETE FROM Pessoa WHERE id = 1;
1.4 SGBD
Segundo Silberschatz, Korth & Sudarshan (1999, p.1):
Um Sistema Gerenciador de Banco de Dados (SGBD) é constituído por um conjunto
de dados associados a um conjunto de programas para acesso a estes dados. O
conjunto de dados, comumente chamado banco de dados, contém informações sobre
uma empresa em particular. O principal objetivo de um SGBD é proporcionar um
ambiente tanto conveniente quanto eficiente para a recuperação e armazenamento
das informações do banco de dados.
Assim, o SGBD é uma ferramenta capaz de gerenciar diversos bancos de dados
criados pelo usuário. O SGBD possui diversas funcionalidades, dentre as quais é possível
destacar:
· O gerenciamento das informações dos bancos de dados;
· A criação e o gerenciamento de usuários e grupos de usuários;
· Execução de comandos da linguagem procedural SQL.
19
O recurso de execução e criação de consultas permite, nos SGBDs a manipulação de
dados por meio das funcionalidades da linguagem SQL. Entre estas operações, podem ser
citadas:
· A criação e manutenção de tabelas e da base de dados;
· Criação de views, e procedures e triggers;
· Realização de diversas consultas aos dados por meio de comandos SQL.
As views são tabelas virtuais para o armazenamento das consultas mais importantes do
sistema (ELMASRI, NAVATHE & SHAMKANT, 2005). Por exemplo, em um sistema de
cadastro de ponto eletrônico, uma consulta importante se refere ao relatório de horas por mês
de um funcionário qualquer. É possível criar uma visão para armazenar este relatório; assim,
durante o desenvolvimento da aplicação, será necessário apenas utilizar essa visão para emitir
o relatório de horas mensais do funcionário.
As procedures são funções escritas em uma linguagem procedural derivada da
linguagem SQL para a manipulação de dados. No sistema de ponto eletrônico citado, é
possível criar uma procedure para atualizar o número de horas do funcionário toda vez que o
mesmo registrar o ponto de saída. Nesta pesquisa, será utilizada a linguagem procedural
PL/pgSQL.
A trigger é um procedimento que é disparado toda vez que é feita uma operação sobre
uma tabela específica do banco de dados. No sistema de ponto eletrônico mencionado
anteriormente, pode ser criada uma trigger para, cada vez que for alterada a quantidade de
horas do funcionário, a view com o relatório de horas registradas seja automaticamente
atualizada.
Os Bancos de Dados Relacionais destacam-se também pela garantia em suas
operações internas de quatro principais propriedades: Atomicidade, Consistência, Isolamento
e Durabilidade, formando um conjunto chamado de ACID (SILBERSCHATZ, KORTH &
SUDARSHAN, 1999). Estes quatro princípios são utilizados para controle de transações nos
SGBDs.
20
Segundo Silberschatz, Korth & Sudarshan (1999, p.13): “Uma transação é uma
coleção de operações que desempenha uma função lógica única dentro de uma aplicação do
sistema de banco de dados. Cada transação é uma unidade de atomicidade e consistência.”.
Assim, uma transação pode ser definida como qualquer seqüência de eventos que são
disparados no BD para manipulação e/ou criação de bases de dados, constituindo-se
basicamente de operações de criações, consultas, atualizações e exclusões nas mesmas,
também chamadas de operações CRUD (Create, Read, Update, Delete). A consistência do
banco de dados deve ser mantida após o processamento de cada transação; ou seja, as
operações executadas durante uma transação devem manter a consistência dos dados.
Já as propriedades ACID podem ser definidas da seguinte forma: a atomicidade
garante que durante uma transação, ou todas as operações são feitas, ou nenhuma é realizada.
A consistência garante que as operações foram realizadas de maneira que os dados não sejam
corrompidos. O isolamento garante que as operações de uma transação não interfiram nas
operações de outra transação qualquer que esteja executando paralelamente a ela. Por sua vez,
a durabilidade é utilizada para garantir que, se todas as operações de uma transação foram
concluídas com sucesso, as alterações que essas fizeram nos dados do banco não serão
perdidas (SILBERSCHATZ, KORTH & SUDARSHAN, 1999). Nos últimos 30 anos, o
Modelo Relacional tem sido cada vez mais adotado como o modelo de dados utilizados por
quase todos os Sistemas Gerenciadores de Bancos de Dados (SGBDs) comerciais existentes
como, por exemplo, Microsoft SQL Server, Oracle, DB2, PostgreSQL, MySQL e Firebird.
21
2. BANCO DE DADOS OBJETO-RELACIONAL
Com a criação do Banco de Dados Relacional, cientistas da informação começaram a
pesquisar técnicas para utilizar esta tecnologia na resolução de problemas do mundo real. A
seguir, será apresentada a integração dos BDR com a Orientação a Objetos, uma técnica de
programação para representação de elementos do mudo real por meio de objetos.
2.1 Orientação a Objetos
A metodologia orientada a objetos consiste na representação de elementos do mundo
real por meio de estruturas de código contendo ações e características deste elemento. Estas
estruturas foram denominadas de classes. Uma classe pode representar a abstração de um
elemento do mundo real, contendo suas características e ações que pode executar. As
características correspondem aos atributos da classe; As ações correspondem aos métodos da
classe.
A Orientação a Objetos destaca-se também por suas quatro principais propriedades,
também chamadas de “pilares”: encapsulamento, abstração, herança e polimorfismo. A
abstração. O encapsulamento “é a técnica de proteger as propriedades e os métodos de um
objeto” (Kaupa, 2008). Ou seja, por meio do encapsulamento, os detalhes da criação do
sistema ficam ocultos para seus usuários. Já a abstração é a representação de um elemento do
mundo real, com suas propriedades, que são seus atributos; e seus métodos, que são as ações
que este elemento pode executar. Por sua vez, a herança é a propriedade que permite a
reutilização de informações de uma classe qualquer para outra classe. (KAUPA, 2008)
22
2.2 Banco de Dados Orientado a Objetos
Com o advento do paradigma de orientação a objetos, o desenvolvimento de sistemas
computacionais vem evoluindo. É cada vez mais frequente a adoção, nos sistemas
empresariais, dos princípios da orientação a objetos. Com isso, os fabricantes dos principais
SGBDs existentes perceberam a importância da adaptação entre os bancos de dados e a
tecnologia orientada a objetos. Diversas tecnologias surgiram ao longo dos anos com o
propósito dessa integração. Um exemplo disso foi o Banco de Dados Orientado a Objetos
(BDOO).
O BDOO permitiu aos projetistas de bancos mapearem os dados como objetos
(SILBERSCHATZ, KORTH & SUDARSHAN, 1999). Isto possibilitou a integração de duas
tecnologias: Banco de Dados e Orientação a Objetos. Nessa última, os elementos dos sistemas
são tratados como objetos, sendo estes criados pela instanciação de classes. Cada classe é uma
estrutura que possui atributos e métodos. Essa classe pode também ser vista e utilizada como
um novo tipo de variável. Para os sistemas de bancos de dados, os métodos das classes não
são necessários. Esses métodos não são utilizados na criação das tabelas. Entretanto, os
métodos das classes podem ser mapeados no SGBD na forma de procedures.
O BDOO fomentou alguns recursos que são muito utilizados atualmente, como o
controle de versão por parte dos SGBDs. Entretanto, o BDOO trouxe problemas de
implementação, tornando-se um banco de dados de difícil manutenção. Isso ocorreu devido ao
fato do BDOO apresentar uma perda na durabilidade das consultas SQL.
Com isso, esse modelo não se firmou no mercado. Ainda assim, foram criadas
algumas ferramentas e SGBDs voltados para esta tecnologia. Entre estas ferramentas, é
possível citar: DB4O, Objectivity/DB e O2; mesmo assim, as pesquisas sobre esta tecnologia
continuaram, evoluindo para o Banco de dados Objeto-Relacional (BDOR).
23
2.3 Banco de Dados Objeto Relacional
O BDOR tornou possível o desenvolvimento de técnicas para criação de TADs dentro
dos SGBDs. Estes TADs são denominados de types, que são tipos de dados definidos pelo
usuário (RAMAKRISHNAN & JOHANNES, 2008). Com isto, podem-se criar atributos com
seu tipo definido por um type. Além disso, é possível utilizar um type como um objeto dentro
do SGBD. O SGBD PostgreSQL não possui suporte à manipulação de types como objetos.
Para exemplificar o funcionamento da técnica do BDOR, suponha-se uma tabela
“Funcionário”, com os atributos (código, CPF, nome, endereço, telefone). Código e nome são
atributos simples das tabelas, ou seja, são elementos de um só tipo de dados; o campo código,
neste caso, representa a chave primária da tabela “Funcionário”; na modelagem de dados
relacionais, o atributo que representa a chave primária é destacado como sublinhado. O
Cadastro de Pessoa Física (CPF) é um número de onze caracteres que representam um código
único para cada pessoa no país. Já os atributos endereço e telefone são atributos compostos de
mais de um tipo de dados. Um telefone é constituído por um código para Discagem Direta de
Longa Distância (DDD), que corresponde ao código de área estadual a qual o número de
telefone está associado, e o número, que é a seqüência de algarismos que são utilizados para
realizar uma chamada local. Por sua vez, o endereço é composto pelas seguintes informações:
número da residência, que é um valor numérico; rua, bairro, complemento e cidade, que são
valores alfanuméricos; um Código de Endereçamento Postal (CEP), que identifica cada rua de
uma cidade no sistema dos Correios.
Em um Banco de Dados Relacional, os atributos endereço e telefone da tabela
“funcionário” mencionada anteriormente são armazenados em tabelas a parte, contendo uma
chave estrangeira para a tabela “funcionário”. Com o BDOR, estes atributos podem ser
tratados como novos tipos de dados, bastando apenas serem criados os types endereço e
telefone. Assim, não se faz necessário criar tabelas separadas para eles. Na tabela funcionário,
o campo endereço será uma instância de type endereço. O atributo telefone será uma instância
de type telefone. Esse recurso fornece uma maior robustez aos bancos de dados, provendo
diversas possibilidades para a integração entre bancos de dados e aplicações orientadas a
objetos. Essas aplicações necessitam de uma base de dados que possua recursos para mapear
os dados como instâncias de classes da orientação a objetos.
24
A criação de colunas das tabelas de um banco de dados como um objeto type quebra
um dos princípios fundamentais dos bancos de dados relacionais: a Primeira Forma Normal.
Nesta propriedade, cada atributo de uma tabela é atômico, ou seja, não são permitidos que, em
uma coluna de uma tupla, seja armazenado mais de um dado. Dessa maneira, não é possível
utilizar TADs dentro dos SGBDs. As estruturas de dados são conjuntos formados por dados
de diversos tipos, podendo ser reutilizados como um novo tipo de dado em diversas
aplicações.
Os SGBDs com suporte ao BDOR são denominados de Sistema Gerenciador de Banco
de Dados Objeto-Relacional (SGBDOR). Com este tipo de SGBD, é possível criar diversos
Tipos Abstratos de Dados (TAD). Estes TADs permitem a manipulação de novos tipos de
dados dentro dos SGBDs. Assim, em uma tabela, pode-se criar um atributo cujo tipo possuirá
as características do novo tipo de dados que foi criado. Em alguns SGBDs, como o Oracle, é
possível utilizar os novos tipos de dados como um objeto.
O advento do BDOR trouxe para os desenvolvedores de sistemas um conjunto de
novas possibilidades. Com a implementação de bases de dados com bases nos princípios da
orientação a objetos, a robustez do armazenamento de dados tornou-se cada vez maior. No
entanto, a linguagem SQL-92, linguagem padrão para a implementação de bases de dados
relacionais, não possuía os recursos necessários para suprir a robustez do BDOR. Diante
disso, foi preciso implantar os recursos do BDOR na linguagem SQL-92. Com isso, surgiu
uma nova versão da linguagem SQL: a SQL:1999.
A SQL:1999 possui os mesmos comandos DDL e DML da sua antecessora SQL-92. A
diferença entre elas é que a SQL:1999 possui recursos adicionais, como criação de TADs, que
são implementados como types. Estes types são tipos de dados definidos pelo usuário. Além
destes, a SQL:1999 permite: a criação de funções para a manipulação de novos tipos de
dados; a criação de atributos das tabelas como vetores e a inserção de blocos de dados de
vários bytes2 nas colunas das tabelas.
2 O Byte é um conjunto de 8 algarismos formado pela combinação dos números 0 e 1. Cada 0 ou 1 é chamado de bit. Exemplo: 00110011
25
3. BANCO DE DADOS ESPACIAL
Neste capítulo, serão apresentadas as características do Banco de Dados Espacial
(BDE) e as tecnologias relacionadas com este tipo específico de banco de dados.
3.1 Sistema de Informações Geográficas (SIG)
Em meados da década de 1960 foi criado o Sistema de Informações Geográficas
(SIG). Segundo Oliveira (2004, p. 1), o SIG é “um conjunto de softwares, métodos,
dados e usuários integrados, possibilitando o desenvolvimento de uma aplicação capaz
de coletar, armazenar e processar dados georreferenciados”. Com a criação do SIG,
abriu-se uma nova possibilidade: o desenvolvimento de sistemas para armazenar dados
geográficos por meio da geometria.
Segundo Câmara (2005, p. 3), “A principal diferença de um SIG para um
sistema de informação convencional é sua capacidade de armazenar tanto os atributos
descritivos como as geometrias dos diferentes tipos de dados geográficos.”. Dessa
forma, é possível operar informações não suportadas pelos sistemas convencionais
como, por exemplo, representações matemáticas de figuras geométricas.
Dessa forma, os sistemas que utilizam SIG podem mapear figuras geométricas
de elementos que são representados em mapas. Um exemplo disso pode ser um mapa
das indústrias de uma cidade, onde as indústrias de uma cidade podem ser representadas
como polígonos.
26
Segundo Câmara & Queiroz (2000, p.1), “Para cada objeto geográfico, o SIG necessita
armazenar seus atributos e as várias representações gráficas associadas”. Com base nesse
princípio, cada indústria pode ser representada no banco de dados como um tipo de dado que
possui um polígono, sendo este mapeado por meio das coordenadas de seus vértices.
O SIG torna possível a criação de sistemas computacionais para operar dados
georreferenciados. As operações sobre esses dados podem ser de captura, modelagem,
manipulação, recuperação e análise dos dados (WOR apud LISBOA FILHO, 2000).
A aplicação mais popular do SIG é o Global Positioning System (GPS). O GPS
fornece a posição do planeta que um determinado dispositivo ocupa no momento. Ou seja, por
meio do GPS, uma pessoa que esteja de posse de um dispositivo móvel pode ser facilmente
localizada, desde que o dispositivo móvel possua o recurso do GPS. Esta tecnologia é
amplamente utilizada por empresas transportadoras, para que as mesmas saibam onde está no
momento o veículo com a carga transportada. Esta técnica é útil para determinar se esse
veículo saiu da rota para a qual ele foi programado.
Entretanto, esta nova alternativa trouxe um problema: como armazenar os dados
geográficos em um banco de dados? Até então, o conjunto de instruções e tipos de variáveis
aceitos pelos SGBDORs não eram suficientes para armazenar esses tipos de dados.
Com o objetivo da integração entre o SIG e os bancos de dados, começaram a surgir
implementações de propósito específicas do BDOR, como é o caso do BDE.
3.2 Características do BDE
O BDE é uma extensão do BDOR. Além de possuírem as propriedades deste, o BDE
permitem a manipulação de dados espaciais por meio de funções matemáticas próprias para
este fim.
Com o advento do Banco de Dados Espacial, tornou-se possível armazenar em um
banco de dados representações matemáticas de elementos geográficos, por meio da criação de
tipos de dados específicos para este propósito. Esta representação pode ser feita tanto em
27
termos da localização geográfica desses elementos, incluindo latitude e longitude, como seus
limites na forma de figuras geométricas (CÂMARA & QUEIROZ, 2000).
Para a representação em um banco de dados das informações geográficas, é possível
trabalhar com dois tipos de visões: os objetos do espaço e o próprio espaço (GÜTING, 1994).
No primeiro tipo de visão, chamada de visão discreta, os objetos são vistos por sua
representação espacial, em termos de sua área e localização. No segundo tipo de visão,
chamada de visão contínua, os objetos são caracterizados por meio da sequência de valores
contínuos de suas propriedades, na forma de uma matriz de células (SPACCAPIETRA,
2007). Um exemplo no nível da primeira visão pode ser a cidade de Fortaleza. Neste caso, a
região que compreende a dimensão da cidade pode ser modelada como um polígono; as ruas e
avenidas como linhas; os domicílios residenciais e lojas comerciais como pontos. A dimensão
da cidade, neste caso, pode ser calculada com base nos seus limites territoriais; a localização
pode ser mapeada em função de suas coordenadas geográficas de latitude e longitude. Já no
nível da segunda visão, a cidade é vista em sua forma global como uma matriz. Nesta matriz,
cada célula corresponde a um elemento geográfico da cidade. Neste caso, são considerados os
valores em graus das coordenadas geográficas – latitude e longitude – de cada ponto da cidade
que, no âmbito da cartografia, indicam a posição que esse elemento possui no globo terrestre.
Na Figura 3, são mostrados os dois níveis de visão anteriormente citados, juntamente
com a comparação destes em relação à representação gráfica do mundo real.
Figura 3 – Visão contínua e visão discreta (SPACCAPIETRA, 2007).
28
Para que seja feita a modelagem dos dados geográficos em uma ferramenta própria
para este fim, foram criadas duas técnicas: a representação matricial e a representação
vetorial.
A representação matricial, segundo Câmara (2005, p.34):
Nesta representação, o espaço é representado como uma matriz P(m, n) composto de
m colunas e n linhas, onde cada célula possui um número de linha, um número de
coluna e um valor correspondente ao atributo estudado e cada célula é
individualmente acessada pelas suas coordenadas.
Um exemplo da representação matricial pode ser visualizado na Figura 4:
Figura 4 – Mapa do Brasil em termos de suas latitudes e longitudes (Maps of World, 2012).
Conforme a Figura 4, o mapa do Brasil pode ser representado na cartografia como
uma matriz de coordenadas, caracterizadas por latitude e longitude.
29
Na representação vetorial, segundo Lisboa Filho (2001, p. 7):
Na estrutura vetorial, cada fenômeno geográfico é representado, no banco de dados,
por um objeto com identificação própria e representação espacial o tipo ponto, linha,
polígono ou um objeto complexo. A posição de cada objeto definida por sua
localização no espaço, de acordo com um sistema de coordenadas. Objetos vetoriais
não preenchem todo o espaço, ou seja, nem todas as posições do espaço necessitam
estar referenciadas na base de dados.
Durante a criação da base de dados, pode ser criado um novo tipo de dados para a
manipulação das coordenadas geográficas, que possuirá os atributos latitude e longitude.
As operações mais importantes na representação geométrica de elementos espaciais
dizem respeitos aos relacionamentos existentes entre diferentes objetos. Exemplos disso
podem ser consultas topológicas, envolvendo a interseção entre dois objetos e se estes são
vizinhos; a direção do objeto no mapa; a distância de um objeto a outro em uma região do
mapa (GÜTING, 1994). Durante a pesquisa, a representação matricial será utilizada como
modelo de representação das informações geográficas.
A fim de prestarem suporte aos BDE, vários SGBDs incorporaram elementos da
extensão espacial Geometry. Esta extensão possui uma hierarquia de classes que permitem
manipular geometricamente os dados espaciais. Na Figura 5, são representados os tipos
primitivos desta extensão:
Figura 5 – Tipos de Dados Primitivos da extensão Geometry (FERREIRA, QUEIROZ &
CÂMARA, 2007).
30
Na Figura 5, são apresentados os tipos de dados espaciais correspondentes às
primitivas básicas de um BDE. Esses tipos de dados representam, respectivamente, um ponto,
uma linha e um polígono (ALESSIO, 2009). Em um BDE, um ponto pode ser visto como um
elemento qualquer no mapa. Uma rua qualquer de uma cidade pode ser vista como uma linha.
Por sua vez, o polígono pode representar tanto uma praça de um bairro ou a Faculdade Farias
Brito, como a cidade de Fortaleza. Além disso, a partir dos tipos de dados primitivos, é
possível criar diversos outros tipos, tanto primitivos quanto tipos abstratos.
Figura 6 – Hierarquia de classes da extensão espacial Geometry (MEDEIROS, 2012).
Com base nas classes da extensão espacial Geometry, representadas na Figura 6, foram
criados relacionamentos entre os elementos geométricos. Esses relacionamentos servem para
identificar conexões entre eles. Por exemplo, no mapa da cidade de Fortaleza, essa técnica
será útil para identificar os cruzamentos entre ruas e avenidas da cidade. Isso pode ser
utilizado para indicar as ruas que passam pelos limites da Faculdade Farias Brito, além de
identificar se, por exemplo, a Praça Portugal está próxima à Faculdade Farias Brito; nesse
caso, é possível também, por meio das operações de conexão, calcular a distância entre esses
dois pontos mencionados. Outra operação possível é determinar se dois elementos
representados no mapa são iguais ou, ainda, se eles se tocam em uma determinada região do
mapa.
31
Figura 7 – Relacionamentos entre elementos espaciais (SPACCAPIETRA, 2007).
Na Figura 7, estão representados os tipos de conexões possíveis entre os elementos
geométricos. Essas conexões são nomes de funções implementadas em SGBDs com suporte à
manipulação de dados espaciais. Essas funções foram implementadas nesses SGBDs a fim de
que seja possível realizar diversas operações sobre os dados espaciais. A operação disjoint
avalia se um elemento está longe de outro; isso pode ser útil para identificar se, por exemplo,
os estados do Ceará e de São Paulo estão próximos um do outro. A touch identifica se um
elemento ‘toca’ outro, ou seja, se eles se interceptam em um determinado ponto do mapa. A
cross identifica se há um cruzamento entre dois objetos; essa operação é útil para determinar
cruzamentos entre avenidas e ruas de uma cidade. A overlap identifica se uma parte de um
elemento está contida em outro elemento; isso é amplamente utilizado para a localização de
prédios, hospitais e farmácias em qualquer rua ou avenida da cidade. A contains determina se
um elemento está totalmente contido em outro; essa técnica é importante para localizar
praças, açudes, indústrias em uma determinada região da cidade. A equal define a
equivalência entre dois elementos.
3.3 PostGis
O SGBD PostgreSQL, a partir de sua versão 8.3, possui diversas rotinas matemáticas
para manipulação de dados geográficos. Estas funções permitem uma manipulação direta
32
desses dados por meio de sua representação geométrica, proveniente da extensão PostGis. O
PostGis foi implementado com base nas extensões espaciais Geometry e Geography, cujas
classes possuem diversos tipos de dados geométricos e geográficos, desde uma simples reta
até polígonos e áreas de superfície, além de funções para manipulação de dados espaciais. Na
Figura 8, está representada a comunicação entre o SGBD PostgreSQL e sua extensão espacial.
Nesta Figura 8, a base de dados espacial é chamada de Banco de Dados Geográfico (BDG). A
utilização da extensão PostGis no SGBD PostgreSQL permitirá que este reconheça os tipos
de dados espaciais.
Figura 8 – A comunicação entre a BDG e o PostgreSQL por meio do PostGis (IBIS, 2012).
Além disso, a extensão espacial PostGis possui diversas funcionalidades tanto para a
representação de dados geográficos, em ambientes 2D e 3D, como funções para tratamento
vetorial de imagens digitais. Nesta pesquisa, algumas destas funções foram utilizadas,
principalmente as funções que operam dados da extensão Geometry.
A utilização da extensão PostGis permitirá a criação de diversas views e procedures
para a manipulação dos dados espaciais. Muitas funcionalidades já estão incluídas nesta
extensão, como funções matemáticas euclidianas. Exemplos disso podem ser: a distância entre
dois pontos; a área de uma região, representada como um polígono; além de diversas funções
para a criação dos objetos geométricos, como pontos, linhas, polígonos e círculos.
33
Para demonstrar a implementação de um BDE no SGBD PostgreSQL, será
apresentado a seguir um código escrito na linguagem SQL para a representação dos distritos e
bairros do estado de São Paulo no PostgreSQL (FERREIRA & QUEIROZ, 2005).
CREATE TABLE distritossp ( cod SERIAL, sigla VARCHAR(10), denominação VARCHAR(50), PRIMARY KEY(cod) ); SELECT AddGeometryColumn (‘public’,‘distritossp’,‘spatial_data’,-1,‘POLYGON’, 2);
CREATE TABLE bairrossp ( cod SERIAL, sigla VARCHAR(10), denominação VARCHAR(50), PRIMARY KEY(cod)
); SELECT AddGeometryColumn (‘public’, ‘bairrossp’, ‘spatial_data’, -1, ‘POINT’, 2);
Nos exemplos apresentados no trecho de código anterior, foram criadas tabelas
relacionais para representar os distritos e bairros de São Paulo. Em seguida, foi adicionada
uma coluna espacial a esta tabela. Essa coluna corresponde a um elemento geométrico com as
coordenadas especificadas no comando select. Nesse caso, a informação espacial é
representada por um polígono. No próximo trecho de código SQL, será mostrado como inserir
dados nas tabelas distritossp e bairrossp:
INSERT INTO distritossp (denominação, sigla, spatial_data) VALUES ('MARSILAC', ‘MAR’, GeometryFromText (
'POLYGON ((335589.530575,7356020.721956,335773.784959,7355873.470174, …))', -1)
); INSERT INTO bairrossp (denominação, sigla, spatial_data) VALUES ('JARDIM DOS EUCALIPTOS', 'JD_EUC', GeometryFromText ('POINT (321588.628426 7351166.969244)',-1)
);
34
Durante a inserção de dados mostrada anteriormente, são repassados os valores das
colunas da tabela. Para o campo que representa o dado geométrico, o insert recebe as
coordenadas matemáticas necessárias para a criação de um polígono e de um ponto. No
primeiro insert, essas coordenadas matemáticas representam os vértices do polígono que irá
representar os distritos. No segundo insert, são repassadas as coordenadas dos pontos que
constituirão os bairros. O método de consulta aos dados das tabelas é feito da mesma forma
com a qual se consultam dados relacionais, alterando apenas a utilização de uma função do
PostGis para realizar a busca da informação espacial, conforme apresentado no código a
seguir:
SELECT bairro, AsText (spatial_data) geom FROM distritossp WHERE denominação = ‘MARSILAC'; SELECT bairro, AsText (spatial_data) geom FROM bairrossp WHERE denominação = ‘JARDIM DOS EUCALIPTOS';
A visualização do resultado dos códigos SQL anteriormente apresentados pode ser
encontrada na Figura 9 e na Figura 10.
Figura 9 – Visualização dos Distritos de São Paulo (FERREIRA & QUEIROZ, 2005).
35
Figura 10 – Visualização dos bairros de São Paulo (FERREIRA & QUEIROZ, 2005).
36
4. SOLUÇÃO PROPOSTA
A criação do Banco de Dados Espacial possibilitou aos desenvolvedores de sistemas o
armazenamento de informações do mundo real em um SGBD. Os principais SGBDs do
mercado passaram a suportar a implementação de elementos espaciais, possuindo diversas
funcionalidades para a manipulação destes tipos de dados. O SGBD PostgreSQL, a partir de
sua versão 8.3, possui uma extensão chamada de PostGis, que suporta a criação e
manipulação de atributos, consultas e funções para tratamento de dados espaciais.
Diante disso, esta pesquisa tem como solução proposta a criação de diversas rotinas
para a manipulação de dados espaciais. Serão criados novos types e procedures, para
tratamento de dados do mundo real por meio da geometria euclidiana e do uso das
funcionalidades da extensão espacial PostGis.
As funcionalidades criadas nesta pesquisa serão úteis para facilitar a utilização do
BDE em aplicações que utilizem dados geográficos. Ou seja, com a implementação destes
novos recursos, será possível criar uma camada de abstração que facilite a utilização do BDE
em um sistema que mapeie dados geográficos. Por exemplo, aplicações que utilizam mapas
como Google Maps, Wikimapia e Google Earth, poderão utilizar os novos types e procedures
para tratamento de ruas, avenidas, bairros, distritos, cidades e estados por meio do BDE.
O conjunto de funcionalidades desenvolvido concentra-se em funções de manipulação
de elementos geográficos, como ruas, bairros, cidades e estados. Estas funções estão divididas
em rotinas de criação de elementos, cálculos de distâncias e interseções entre eles.
37
Além disso, o conjunto de funcionalidades será aplicado em um cenário real, que
abordará um problema do mundo real e uma possível solução para o mesmo. Para tanto, será
construída uma base de dados para o problema. Este cenário real será apresentado no item 5 –
Estudo de Caso.
Um possível problema no qual as funcionalidades são aplicáveis poderá ser um
sistema que mostre as farmácias que fiquem localizadas até uma determinada distância de um
determinado local que ofereceram, por exemplo, o serviço de coleta de exames de sangue.
Neste caso, o desenvolvedor criará as tabelas relacionais com as características e produtos das
farmácias, além de uma tabela contendo todos os tipos de serviços que estas possuem. Além
disso, ele poderá criar views e procedures que utilizem as funcionalidades criadas nesta
pesquisa para otimizar a criação das tabelas, consultas e atualizações da base de dados.
No problema de serviços de farmácias anteriormente apresentado, podem ser criadas
rotinas para listar os tipos de exames que cada farmácia disponibiliza, juntamente com os
valores de cada um. Suponha-se que uma paciente queira localizar as farmácias que oferecem
o serviço de coleta de exame de sangue, a fim de descobrir a taxa de diabetes que está contida
em seu sangue. Este paciente poderá utilizar o sistema para localizar estas farmácias. Além
disso, o paciente poderá localizar farmácias que estejam até uma determinada distância de sua
residência. Para tanto, o sistema deverá prover rotinas que utilizem as funções de cálculo de
distância que foram desenvolvidas nesta pesquisa.
Outra funcionalidade que poderá ser implementada no sistema de farmácias será a
localização daquelas que possuam um maior custo/benefício de um determinado
medicamento, e que fiquem localizadas em um bairro X. Esta funcionalidade poderá ser
desenvolvida utilizando as funções de interseções que foram desenvolvidas nesta pesquisa.
A seguir, serão apresentados os novos tipos de dados e funções que foram elaborados
nesta pesquisa, com seu código na linguagem procedural PL/pgSQL e uma breve descrição
dos mesmos. Estas novas funcionalidades poderão ser aplicadas em diversos problemas que
envolvam dados geográficos, facilitando a utilização do BDE na resolução destes problemas.
38
4.1. Criação dos novos tipos de dados
Durante a pesquisa, foram criados novos TADs. Estes TADs são tipos de dados
definidos pelo usuário criados obedecendo à sintaxe do SGBD PostgreSQL, sendo
denominados de types. Foram criados os seguintes types: telefone, localidade, rua, região,
bairro, cidade e estado.
A seguir, serão apresentados estes novos tipos de dados, com seu código na linguagem
SQL, especificamente, a linguagem procedural PL/pgSQL, juntamente com uma breve
descrição de alguns deles. Estes novos types serão importantes para a representação dos
elementos do mundo real.
CREATE TYPE LOCALIDADE AS (coordenadas geometry);
O type localidade possui o atributo coordenadas, que indica a
latitude e a longitude de um determinado ponto. Este atributo é um
elemento do tipo geometry. Durante a inserção de dados na tabela
cujo atributo for do tipo localidade, deverá ser inserido um point.
CREATE TYPE RUA AS (nome varchar (100), extensão double
precision, limites geometry);
O type rua possui os atributos nome, extensão e limites. O nome
serve para identificar a rua e indicar se esta é uma rua, travessa
ou avenida. A extensão indica o comprimento da rua, equivalente à
distância entre seu ponto inicial e final. Por sua vez, o atributo
limites indica o ponto inicial e o ponto final da rua. Durante a
inserção de dados na tabela cujo atributo for do tipo rua, deverá
ser inserida uma line no campo limites, expressa pelas coordenadas
de seu ponto inicial e ponto final.
CREATE TYPE REGIAO AS (nome varchar(100), AREA geometry);
O type região possui os atributos nome e área. O nome
identifica a região que está sendo tratada. A área indica o polígono
que geograficamente representa a região. Durante a inserção de dados
39
na tabela cujo atributo for do tipo regiao, deverá ser inserido um
polygon no campo área, expresso pelas coordenadas de seus vértices.
Os types bairro, cidade e estado possuem o atributo descrição,
que indica o nome e a representação geográfica de cada um. Durante a
inserção de dados na tabela cujo atributo for do tipo bairro, cidade
ou estado, deverá ser inserido, no campo descrição, um registro que
contenha um nome e as coordenadas dos vértices de um polígono. O
type estado diferencia-se dos outros dois por possuir o atributo
sigla, que indica a Unidade Federativa (UF) relativa ao estado.
4.2. Criação das funcionalidades
Além dos tipos de dados anteriormente apresentados, foram criadas diversas
procedures para a manipulação destes types. Basicamente, estas procedures dividem-se em
funções de instanciação de types, de cálculo de distâncias e de interseção de elementos
geográficos, mapeados por meio da geometria euclidiana.
A seguir, serão apresentadas as novas funções criadas, com seu código na linguagem
procedural PL/pgSQL, juntamente com uma breve descrição de cada uma delas.
CREATE FUNCTION gerarLocal(x double precision, y double precision)
RETURNS localidade AS $$
DECLARE
l localidade;
BEGIN
l := ROW(ST_MakePoint($1,$2));
RETURN l;
END; $$LANGUAGE plpgsql;
A procedure gerarLocal recebe por parâmetro a latitude e
longitude de um lugar geográfico. Esta procedure cria uma
40
localidade utilizando a função ST_MakePoint, que gera um point
utilizando as variáveis de entrada.
CREATE FUNCTION gerarRua
(nome varchar, xA double precision, xB double precision, yA double precision, yB double precision)
RETURNS rua AS $$
DECLARE
limites geometry; extensao double precision; r rua;
BEGIN
limites:=(SELECT ST_MakeLine(ST_MakePoint($2,$3), ST_MakePoint($4, $5)));
extensao:=(SELECT ST_Distance_Sphere (st_startpoint(limites),st_endpoint(limites)));
r := ROW($1, extensao, limites);;
RETURN r;
END; $$LANGUAGE plpgsql;
CREATE FUNCTION gerarRua
(nome varchar,pontoInicial geometry, pontoFinal geometry)
RETURNS rua AS $$
DECLARE
limites geometry; extensao double precision; r rua;
BEGIN
limites := (SELECT ST_MakeLine($2,$3));
extensao := (SELECT ST_Distance_Sphere
(st_startpoint(limites),st_endpoint(limites)));
r := ROW ($1, extensao, limites);
RETURN r;
END; $$LANGUAGE plpgsql;
A procedure gerarRua recebe por parâmetro as coordenadas dos
pontos inicial e final de uma rua. A variável limites recebe uma
41
linestring construída por meio da função ST_MakeLine. A extensão da
rua é calculada utilizando a função ST_Distance_Sphere, que retorna
em metros a distância entre dois pontos. Assim, a procedure cria e
retorna uma rua com base nos parâmetros de entrada. O trecho de
código SQL anteriormente apresentado contém duas representações
desta função. Na primeira representação, são passadas as coordenadas
X e Y de cada ponto; na segunda, são repassados dois pontos do tipo
geometry. As rotinas de criação de ruas apresentadas neste trecho de
código exemplificam o uso da sobrecarga de métodos no SGBD
PostgreSQL, que representa dois métodos com o mesmo nome, mas com
parâmetros diferentes.
CREATE FUNCTION gerarRegiao(varchar,geometry[])
RETURNS regiao AS $$
DECLARE
geo geometry; vertices integer; reg regiao;
BEGIN
vertices := (SELECT ST_NPoints($2));
FOR i in 1..vertices
LOOP
geo := (select ST_MakeLine($2));
geo := (select ST_AddPoint(geo,$2[1],vertices));
geo := (select ST_MakePolygon(geo));
END LOOP;
reg := ROW($1, geo);
RETURN reg;
END; $$LANGUAGE plpgsql;
A procedure gerarRegiao recebe por parâmetro o nome da região e
um vetor com as coordenadas dos vértices do polígono que representa
esta região. A procedure possui a variável vértices, que recebe o
número de pontos da geometria passada por parâmetro, calculados por
meio da função ST_NPoints. Já a variável geo recebe uma linestring
construída a partir dos valores do vetor passado por parâmetro. Em
42
seguida, é adicionado no final da variável geo o primeiro ponto da
linestring. Esta operação de adição é fundamental para a criação do
polígono que representa a região, pois na criação de polígonos no
PostGis, o ponto inicial deverá ser o último ponto a ser inserido no
polígono, a fim de formar uma geometria fechada (convexa). Dessa
forma, a procedure cria e retorna uma região, armazenando as
informações desta na variável reg.
CREATE FUNCTION gerarBairro (nome varchar, area geometry []) RETURNS bairro AS $$
DECLARE
geo regiao; b bairro;
BEGIN
geo = gerarRegiao($1,$2);
b := ROW(ROW($1, geo));
RETURN b;
END; $$LANGUAGE plpgsql;
As procedures gerarBairro, gerarCidade e gerarEstado tem código
similar. Todas recebem por parâmetro o nome destes e um vetor com as
coordenadas dos vértices do polígono que os representam. Estas
procedures possuem a variável geo, que é utilizada para criação de
uma região, recebendo o nome e o vetor de coordenadas passado por
parâmetro. Dessa forma, a procedure cria e retorna uma região, que
será o valor a ser armazenado no atributo descrição de ambos os
types bairro, cidade e estado. Vale ressaltar que, na procedure
gerarEstado, deve ser passado por parâmetro o valor da sigla que
representa a UF do estado.
CREATE FUNCTION distanciaLocalidades (localidade, localidade)
RETURNS SETOF double precision AS $$
BEGIN
RETURN QUERY SELECT ST_Distance_Sphere($1.coordenadas,$2.coordenadas);
END; $$LANGUAGE plpgsql;
43
A procedure distanciaLocalidades recebe por parâmetro duas
localidades e implementa a rotina da geometria euclidiana do cálculo
da distância entre dois pontos, utilizando a função
ST_Distance_Sphere.
As demais procedures relativas ao calculo de distâncias, como
as procedures distanciaRuas, distanciaRegioes, distanciaLocalRua,
distanciaLocalRegiao e distanciaRuaRegiao tem comportamento similar,
recebendo por parâmetro duas ruas e implementando a rotina da
geometria euclidiana para o cálculo da distância entre as
geometrias, utilizando a função ST_Distance_Sphere.
CREATE FUNCTION cruzamentoRuas(rua, rua) RETURNS text AS $$
DECLARE
message text;
BEGIN
IF (ST_CROSSES($1.limites,$2.limites) = true) OR (ST_TOUCHES($1.limites,$2.limites) = true)
THEN
message := (SELECT ST_AsText (ST_Intersection ($1.limites,$2.limites)));
ELSE IF ST_Disjoint($1.limites, $2.limites)= TRUE
THEN RETURN NULL;
END IF;
END IF;
RETURN message;
END; $$LANGUAGE plpgsql;
A procedure cruzamentoRuas recebe por parâmetro duas ruas e
implementa a rotina da geometria euclidiana para o cálculo da
interseção entre duas retas. Para tanto, são utilizadas as funções
ST_Crosses, que determina se duas retas se cruzam em algum ponto, e
a função ST_Touches, que determina se existem algum ponto onde as
retas se tocam. Caso exista alguma interseção, será retornada a
geometria com esta interseção, utilizando a função ST_Intersection.
44
Em caso negativo, será verificado se não há nenhum ponto em comum
entre as ruas, retornando uma geometria vazia.
CREATE FUNCTION intersecaoRuas(rua, rua)
RETURNS TEXT AS $$
DECLARE
intersecao TEXT;
BEGIN
IF ST_EQUALS($1.area,$2.area)= TRUE) THEN RETURN NULL;
ELSE
IF (ST_OVERLAPS($1.area, $2.area) = TRUE) OR (ST_INTERSECTS($1.area, $2.area) = TRUE)THEN
intersecao := (SELECT ST_AsText (ST_INTERSECTION($1.area,$2.area)));
RETURN 'Região de interseção :||intersecao;
ELSE
IF ST_Disjoint($1.area, $2.area) = true THEN RETURN NULL;
END IF;
END IF;
END IF;
END;
$$LANGUAGE plpgsql;
A procedure intersecaoRuas recebe por parâmetro duas ruas e
implementa a rotina da geometria euclidiana para o cálculo da
interseção entre duas retas. Para tanto, são feitas duas
verificações: na primeira, a função ST_Equals é utilizada para
determinar se não foi passado por parâmetro duas retas iguais. Após
isto, as funções ST_Overlaps e ST_Intersects são utilizadas para
determinar se há uma interseção entre as ruas. Em caso positivo,
será retornada a geometria com esta interseção, utilizando a função
ST_Intersection. Em caso negativo, será verificado se não há nenhum
ponto em comum entre elas, retornando uma geometria vazia.
45
CREATE FUNCTION intersecaoRegioes(regiao, regiao)
RETURNS TEXT AS $$
DECLARE
intersecao TEXT;
BEGIN
IF ST_EQUALS($1.area, $2.area)= TRUE) THEN RETURN NULL;
ELSE
IF (ST_OVERLAPS($1.area, $2.area) = TRUE) OR (ST_INTERSECTS($1.area, $2.area) = TRUE) THEN
intersecao := (SELECT ST_AsText (ST_INTERSECTION($1.area,$2.area)));
RETURN 'Região de interseção :||intersecao;
ELSE IF ST_Disjoint($1.area, $2.area) = true
THEN RETURN NULL;
END IF;
END IF;
END IF;
END; $$LANGUAGE plpgsql;
A procedure intersecaoRegioes recebe por parâmetro duas regiões
e implementa a rotina da geometria euclidiana para o cálculo da
interseção entre dois planos. Para tanto, são feitas duas
verificações: na primeira, a função ST_Equals é utilizada para
determinar se não foi passado por parâmetro dois planos iguais. Após
isto, as funções ST_Overlaps e ST_Intersects são utilizadas para
determinar se há uma interseção entre as regiões. Em caso positivo,
será retornada a geometria com esta interseção, utilizando a função
ST_Intersection. Em caso negativo, será verificado se não há nenhum
ponto em comum entre as regiões, retornando uma geometria vazia.
46
CREATE FUNCTION intersecaoLocalidadeRua (localidade, rua)
RETURNS BOOLEAN AS $$
BEGIN
IF ST_INTERSECTS($1.coordenadas, $2.limites)= TRUE THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END; $$LANGUAGE plpgsql;
A procedure intersecaoLocalidadeRua recebe por parâmetro uma
localidade e uma rua e determina se há interseção entre elas,
utilizando a função ST_Intersects.
CREATE FUNCTION diferencaRuas (rua,rua)
RETURNS SETOF TEXT AS $$
BEGIN
RETURN QUERY SELECT ST_AsText (ST_Difference($1.limites, $2.limites));
END; $$LANGUAGE plpgsql;
A procedure diferencaRuas recebe por parâmetro duas ruas e
implementa a rotina da geometria euclidiana para o cálculo da
diferença A - B, utilizando a função ST_Difference.
CREATE FUNCTION diferencaRegioes (regiao,regiao)
RETURNS SETOF TEXT AS $$
BEGIN
RETURN QUERY SELECT ST_AsText (ST_Difference($1.area, $2.area));
END; $$LANGUAGE plpgsql;
A procedure diferencaRegioes recebe por parâmetro duas regiões
e implementa a rotina da geometria euclidiana para o cálculo da
47
diferença A – B entre elas, utilizando a função ST_Difference. A
procedure diferencaRuaRegiao possui comportamento similar.
CREATE FUNCTION containsLocalidadeRua (localidade, rua)
RETURNS SETOF TEXT AS $$
BEGIN
RETURN QUERY SELECT ST_AsText (ST_WITHIN($1.coordenadas,$2.limites));
END; $$LANGUAGE plpgsql;
A procedure containsLocalidadeRua recebe por parâmetro uma
localidade e uma rua e determina se a localidade está totalmente
contida na rua, utilizando a função ST_Within. As procedures
containsLocalidadeRegiao e containsRuaRegiao possuem comportamento
similar.
CREATE FUNCTION distantePontoPonto (localidade,localidade,double precision)
RETURNS BOOLEAN AS $$
BEGIN
IF ST_DWITHIN($1.coordenadas,$2.coordenadas,$3)= TRUE
THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END;
$$LANGUAGE plpgsql;
A procedure distantePontoPonto recebe por parâmetro duas
localidades e determina se elas estão distante de até X metros uma
da outra, utilizando a função ST_DWithin. As procedures
distantePontoRua, distantePontoRegiao e distanteRuaRegião possuem
comportamento similar.
48
4.3. Comparativo de funcionalidades: BDR, BDE e Solução proposta:
Os types e as procedures criados neste capítulo tiveram como base os recursos do
BDE. Caso estas tivessem sido desenvolvidas com base no BDR, a criação delas seria mais
complexa e dispendiosa. A seguir, serão mostrados alguns exemplos comparativos da
implementação de algumas das funcionalidades desenvolvidas neste trabalho utilizando BDR
e BDE. Para tanto, será ilustrada a criação de uma rua e funções para manipular desta
utilizando BDR, BDE e as funcionalidades desenvolvidas neste trabalho. Este comparativo
será importante para mostrar a importância do BDE nesta pesquisa. Ou seja, por meio das
comparações, será possível mostrar a complexidade de implementação das funcionalidades
demonstradas nos itens anteriores, caso o BDR tivesse sido adotado como metodologia
padrão, em contraste com os recursos que o BDE possui. A seguir, serão mostrados trechos de
código SQL para demonstração deste comparativo.
Tabela 3 – Comparativo de criação da tabela de ruas.
- Tabela Ruas
BDR CREATE TABLE rua ( id integer primary key not null, nome varchar(100) );
CREATE TABLE quarteirao ( id integer primary key not null, x0 double precision, x1 double precision, y0 double precision, y1 double precision, rua integer references rua (id) );
BDE CREATE TABLE rua ( id integer PRIMARY KEY NOT NULL, nome varchar(100), limites geometry );
49
Solução
proposta
CREATE TABLE rua ( id integer PRIMARY KEY NOT NULL, descricao rua );
A Tabela 3 representa a criação da tabela de ruas utilizando os recursos do BDR, BDE
e das funcionalidades desenvolvidas nesta pesquisa. No BDR, faz-se necessária a criação de
duas tabelas: quarteirão, que armazenará as divisões das ruas, que são seus quarteirões, em
termos das coordenadas x e y de seus pontos iniciais e finais; rua, que armazenará o nome da
rua. No BDE será preciso apenas adicionar a coluna limites, que armazenará a geometria
correspondente às informações de seus quarteirões. Já pela solução proposta, a coluna limites
do BD e será substituída pela coluna descrição, do tipo rua. Este tipo de rua é um type com as
informações da rua, correspondentes ao seu nome, seus limites e sua extensão, sendo esta
última a distância entre o ponto inicial e final da rua.
Nos trechos de código da Tabela 3, foram apresentados exemplos de representação
geométrica de uma rua. Suponha-se a existência de uma tabela x de relacionamento entre duas
ruas, com as colunas id e dist. Considerando que, nesta tabela, a coluna dist será utilizada para
armazenar a distância entre as ruas, como este cálculo poderá ser realizado? Para responder a
este questionamento, serão mostrados alguns trechos de código SQL representando a
comparação da criação de rotinas para calcular a distância entre ruas. Serão utilizadas como
base as implementações apresentadas na Tabela 3.
· Comparação 1: BDR x BDE
· BDR
CREATE FUNCTION distanciaPontos (x1 double precision, y1 double precision, x2 double precision, y2 double precision)
RETURNS double precision AS $$
DECLARE
raiz double precision; expoente double precision;
50
BEGIN
expoente := ((SELECT power($1-$3,2)) +
(SELECT power($2-$4,2)));
raiz := sqrt(expoente);
RETURN raiz;
END; $$LANGUAGE plpgsql;
· BDE:
SELECT ST_Distance_Sphere(p1 geometry, p2 geometry);
Na comparação 1, foram apresentados códigos SQL do cálculo de
distância entre dois pontos. A procedure distanciaPontos utiliza as
coordenadas x e y dos pontos e calcula a distância entre estes
utilizando a seguinte fórmula matemática de distância presente na
Figura 11:
Figura 11 – Distância entre dois pontos (Martins, 2013).
Já no BDE, existe uma função especifica da extensão PostGis para cálculo da
distância, não sendo necessária a criação de uma nova procedure. Basta passar por parâmetro
os dois pontos.
51
· Comparação 2: BDE x Solução proposta:
· BDE
SELECT ST_Distance_Sphere(p1 geometry, p2 geometry);
· Solução proposta:
SELECT distanciaLocalidades(localidade, localidade);
Na comparação 2, foram apresentados códigos SQL do cálculo de distância entre dois
pontos utilizando BDE e as funcionalidades criadas nesta pesquisa. Similar à comparação 1, o
BDE utiliza a ST_Distance_Sphere para cálculo da distância. Na solução proposta, foi
desenvolvida uma procedure que recebe suas localidades, com a sua geometria, e calcula a
distância entre elas.
A partir das comparações 1 e 2, é possível notar a vantagem de utilização do BDE em
relação ao BDR no tratamento de dados geográficos por meio da geometria. Os SGBDs com
suporte ao BDE possuem uma extensão espacial com diversas rotinas para manipulação de
dados geográficos. No BDR, faz-se necessária a criação destas rotinas. Em relação ao BDE e
a solução proposta, esta apresenta novas técnicas de utilizar os recursos que aquela provê em
sua extensão espacial.
Vale ressaltar que a solução proposta desenvolvida nesta pesquisa não tem como
objetivo recriar a extensão espacial, mas sim, criar funcionalidades que facilitem o uso de
seus recursos em um sistema com suporte ao BDE. Um exemplo disso pode ser encontrado na
procedure gerarRua. Esta procedure recebe as coordenadas x e y dos pontos inicial e final de
uma rua. A procedure então cria uma rua a partir destas coordenadas, com o auxilio das
funções ST_Makeline e ST_Makepoint. No BDE, a ST_Makeline recebe por parâmetro dois
atributos do tipo geometry. Para um desenvolvedor que irá utilizar BDE em seu sistema,
torna-se menos dispendioso utilizar uma função na qual ele tenha que passar apenas as quatro
coordenadas por parâmetro, do que utilizar uma função na qual este desenvolvedor precise
52
passar uma geometria. No trecho de código SQL a seguir, serão mostrados exemplos das
chamadas das funções ST_Makeline e gerarRua, sendo passados por parâmetro as
coordenadas relativas à Avenida Engenheiro Santana Júnior. Através deste exemplo, é
possível notar outra vantagem da utilização da procedure gerarRua: a possibilidade de passar
por parâmetro o nome da rua, ao invés de somente os valores de sua geometria.
SELECT ST_MakeLine(ST_MakePoint(-3.729082,-38.477957), ST_MakePoint(-3.756695,-38.491454));
SELECT gerarRua ('Avenida Engenheiro Santana Júnior',
-3.729082, -38.477957, -3.756695, -38.491454);
53
5. ESTUDO DE CASO
No capitulo anterior, foi apresentada a criação de um conjunto de funcionalidades para
a manipulação de dados geográficos por meio da linguagem procedural PL/pgSQL . O
conjunto de funcionalidades inclui diversas funções e novos tipos de dados específicos para
BDE.
A aplicação das funcionalidades desenvolvidas será demonstrada na resolução de um
problema do mundo real. Neste problema, todos os recursos disponíveis no conjunto de
funcionalidades serão utilizados como forma de solução do problema e, caso possível, uma
otimização desta solução. Vale ressaltar que o conjunto de funcionalidade está restrito aos
recursos do SGBD PostgreSQL e de sua extensão PostGis.
Diante disso, foi proposto um estudo de caso para aplicação das funcionalidades. Para
tanto, um cenário real será utilizado. Este cenário terá como base a situação problema que foi
apresentada na introdução deste trabalho, onde foi relatado o problema da divergência de
preços finais de produtos em algumas regiões do país.
Depois de apresentado o cenário, serão listados os passos necessários para a criação da
base de dados do problema. Esta base de dados conterá as tabelas, procedures e demais
elementos que forem identificados durante a análise do problema. Para tanto, será gerado um
código na linguagem SQL, que deverá ser adaptado para a sintaxe de comandos do SGBD
PostgreSQL, sendo este o SGBD a ser adotado nesta solução.
54
5.1 Cenário
Durante o capitulo de introdução, foi apresentado um problema real, relativo à
divergência de preços de mercadorias em diversos estabelecimentos do país. Naquele
momento, foi relatado que, dependendo da região onde o produto será comercializado, este
terá um preço alto ou baixo.
Este trabalho propõe um conjunto de tipos e rotinas a serem utilizadas em um sistema
geográfico que permita ao usuário uma maior facilidade no momento da implementação da
solução. Diferentemente da maioria das soluções comumente encontradas que se utilizam
puramente do Modelo Relacional, a solução proposta faz uso do Banco de Dados Espacial e
suas funcionalidades referentes a elementos geográficos.
Como exemplo, foi criada uma base de dados na qual foram mapeados diversos postos
de gasolina, com as informações destes. Os critérios adotados para a coleta de informações
foram dados relativos a tipos de combustíveis comercializados, formas de pagamento, tipos de
serviços fornecidos e lojas conveniadas. Os tipos de produtos são combustíveis, como etanol,
gasolina comum, gasolina aditivada, etanol, gás natural (GNV) e diesel. Vale ressaltar que,
durante a pesquisa, não foram localizados postos de gasolina na cidade de Fortaleza que
possuíssem algum tipo de biocombustível. As formas de pagamento mapeiam os tipos de
cartões de credito que o posto aceita como pagamento da quantidade de combustível que cada
cliente utilizou para abastecer seu veículo. Os tipos de serviço indicam se o posto possui
banco 24 horas, se possui troca de óleo, estacionamento, loja de conveniência do próprio
posto, etc. As lojas conveniadas indicam os estabelecimentos comerciais que ficam
localizados no mesmo espaço geográfico no qual o posto está localizado.
O mapeamento anteriormente apresentado será útil para proprietários de moto, carro,
caminhão e demais veículos, além de moto-taxistas e taxistas cujos veículos possam ser
abastecidos com um dos tipos de combustíveis anteriormente listados. Eles poderão utilizar
um sistema no qual a solução apresentada nesta pesquisa esteja implementada, no sentido de
que localizem postos de gasolina que possam prover uma maior economia ao abastecerem
seus veículos. Nos itens seguintes, serão apresentadas as tabelas e procedures que foram
criadas para a resolução do problema.
55
5.2 Elaboração da Base de Dados
Com base no cenário anteriormente apresentado, será criada uma base de dados
contendo as tabelas, com seus atributos relacionais e espaciais, além de funções específicas
para a resolução do problema relativo a postos de gasolina localizados na cidade de Fortaleza.
Os atributos espaciais da tabela serão criados com base no type geometry, da extensão
PostGis, e nos types que foram criados na solução proposta. Já as funções específicas
utilizarão tanto as funcionalidades do PostGis como das procedures criadas no capitulo
anterior. Além disso, estas procedures desenvolvidas na etapa anterior serão utilizadas
durante a inserção de dados nas tabelas. Nos itens a seguir, serão apresentados o DER e o DR
da base de dados, além de sua implementação na linguagem PL/pgSQL.
5.2.1. Elaboração do Diagrama Entidade-Relacionamento
Na Figura 12, será apresentado o DER da base de dados do sistema, com as entidades
e seus atributos. Vale ressaltar que no DER não são especificados os tipos de dados dos
atributos. Esta Figura 12 ilustra a representação do DER referente ao problema analisado, com
os elementos necessários para tanto.
5.2.2. Elaboração do Diagrama Relacional
Na Figura 13, será apresentado o DR da base de dados do sistema, com as entidades e
seus atributos. Vale ressaltar que os alguns atributos utilizam os tipos criados na solução
proposta. Esta Figura 13 ilustra a diagramação do DR com a representação gráfica das tabelas,
atributos e tipos.
56
Figura 12 – DER Postos de Gasolina.
57
Figura 13 – DR Postos de Gasolina.
5.2.3. Criação do script SQL
A seguir, serão apresentados alguns dos elementos mais importantes que compõem a
base de dados dos postos de gasolina, com as tabelas e procedures mais representativas
· Tabelas:
CREATE TABLE ruas(
idRuas integer PRIMARY KEY NOT NULL,
descricao rua
);
58
CREATE TABLE enderecos(
idEnderecos integer PRIMARY KEY NOT NULL,
rua integer REFERENCES ruas (idRuas),
numero integer,
bairro integer REFERENCES bairros (idBairros),
complemento character varying (100),
cidade integer REFERENCES cidades (idCidades),
estado integer REFERENCES estados (idEstados),
cep character varying (9),
localizacao localidade
);
CREATE TABLE postos(
idPostos integer PRIMARY KEY NOT NULL,
nome character varying(100) NOT NULL,
endereco integer REFERENCES enderecos (idEnderecos),
telefone telefone,
grupo character varying (50)
);
CREATE TABLE combustiveis(
idCombustiveis integer PRIMARY KEY NOT NULL,
tipo character varying(50),
preco double precision NOT NULL,
posto integer REFERENCES postos (idPostos)
);
59
· Procedures:
CREATE FUNCTION distanciaPostoPreco (localidade, combustivel varchar(50)) RETURNS SETOF double precision AS $$ BEGIN RETURN QUERY SELECT distanciaLocalidades ($1, (SELECT e.localizacao FROM enderecos e, postos p WHERE p.endereco = e.idEnderecos AND p.idpostos = (SELECT c.posto FROM combustiveis c WHERE c.tipo = $2 AND c.preco =
(SELECT min(preco) FROM combustiveis WHERE tipo = c.tipo) ) ) );
END; $$LANGUAGE plpgsql;
A procedure distanciaPostoPreco recebe por parâmetro uma
localidade e um tipo de combustível. Internamente, uma consulta é
realizada para localizar os postos de gasolina que e retorna a
distância entre eles, utilizando a função distanciaLocalidades.
CREATE FUNCTION buscaPostosCartao (cartao varchar,ponto localidade, distancia double precision) RETURNS SETOF varchar (100) AS $$ DECLARE registro RECORD; BEGIN FOR registro IN SELECT DISTINCT p.nome AS Posto
FROM pagamentos pg, postos p WHERE pg.posto = p.idpostos AND pg.empresa = (SELECT idcartoes FROM cartoes WHERE descricao= $1) AND p.idpostos IN
(SELECT p.idpostos FROM postos p,enderecos e WHERE e.idenderecos = p.endereco
AND (distantePontoPonto( (SELECT ed.localizacao FROM enderecos ed WHERE ed.idenderecos = e.idenderecos), $2,$3))= TRUE )
ORDER BY p.nome LOOP RETURN NEXT registro.Posto; END LOOP; RETURN; END; $$LANGUAGE plpgsql;
60
A procedure buscaPostosCartao recebe por parâmetro um tipo de
cartão, uma localidade e uma distância e retorna os postos que
aceitem este tipo de cartão, mas que fiquem no máximo a uma
distância x de uma localidade, utilizando a função
distantePontoPonto, que verifica se duas localidades estão distantes
uma da outra em até x metros.
CREATE FUNCTION buscaPostosPreco(coord localidade, preco double precision, combustivel varchar(100), dist double precision) RETURNS SETOF VARCHAR(100) AS $$ $$ DECLARE registro RECORD; BEGIN
FOR registro IN
SELECT DISTINCT p.nome AS Posto, c.tipo AS Combustivel FROM combustiveis c, postos p
WHERE c.posto = p.idpostos AND c.preco < $2 AND c.tipo = $3 AND p.idpostos IN (
SELECT p.idpostos FROM postos p, enderecos e WHERE e.idenderecos = p.endereco AND (SELECT distantePontoPonto( (SELECT ed.localizacao FROM enderecos ed WHERE ed.idenderecos = e.idenderecos), $1.coordenadas,$4)) = TRUE) ORDER BY p.nome, c.tipo DESC
LOOP RETURN NEXT registro.Posto; END LOOP;
END; $$ LANGUAGE plpgsql;
A procedure buscaPostosPreco recebe por parâmetro uma
localidade, um preço de referência, um tipo de combustível e uma
distância e retorna os postos que possuam este tipo de combustível
cujo valor esteja abaixo de um preço x, mas que fiquem no máximo a
uma distância y de uma localidade, utilizando a função
distantePontoPonto.
CREATE FUNCTION buscaPostosPrecoCartao (coord localidade, preco double precision, combustivel varchar(100),dist double precision, cartao varchar) RETURNS SETOF VARCHAR(100) AS $$ DECLARE registro RECORD;
61
BEGIN FOR registro IN SELECT distinct p.nome AS Posto, c.tipo AS Combustível
FROM combustiveis c, postos p, pagamentos pg WHERE pg.posto = p.idpostos
AND pg.empresa = (SELECT idcartoes FROM cartoes WHERE descricao = $5)
AND c.posto = p.idpostos AND c.preco < $2 AND c.tipo = $3 AND p.idpostos IN ( SELECT idpostos FROM postos pt, enderecos e WHERE e.idenderecos = endereco AND(distantePontoPonto( (SELECT ed.localizacao FROM enderecos ed
WHERE ed.idenderecos = e.idenderecos), $1,$4)) = TRUE )
ORDER BY p.nome, c.tipo DESC LOOP RETURN NEXT registro.posto; END LOOP; END; $$ LANGUAGE plpgsql;
A procedure buscaPostosPrecoCartao recebe por parâmetro uma
localidade, um preco de referência, um tipo de combustível , uma
distância e um tipo de cartão e retorna os postos que possuam este
tipo de combustível cujo valor esteja abaixo de um preço x, e que
aceitem este cartão, mas que fiquem no máximo a uma distância y de
uma localidade, utilizando a função distantePontoPonto.
CREATE FUNCTION ruasLocalizacao(endereco localidade) RETURNS SETOF varchar AS$$ DECLARE registro text; contador integer;
BEGIN contador := (SELECT COUNT(*) FROM RUAS);
FOR i IN 1..contador LOOP
registro := (SELECT (r.descricao).nome AS RUA FROM enderecos e, ruas r WHERE e.rua = r.idruas AND (SELECT ST_Intersects( (SELECT (descricao).limites FROM ruas r WHERE idruas = i),$1.coordenadas)) = TRUE );
END LOOP; RETURN registro; END; $$LANGUAGE plpgsql;
A procedure ruasLocalizacao recebe por parâmetro uma localidade
e retorna o nome das ruas que passam por esta localidade, utilizando
a função ST_Intersects.
62
6. CONCLUSÃO
A pesquisa teve como objetivo principal a criação de um conjunto de rotinas para
mapear geometricamente dados geográficos do mundo real. As funcionalidades criadas nesta
pesquisa poderão auxiliar desenvolvedores de sistemas na utilização dos recursos dos bancos
de dados espaciais. Exemplo disso é a rotina de criação de uma região. Para criar a área da
região no PostGis, faz-se necessário inserir os pontos das coordenadas dos vértices, com a
condição de que o vértice final seja também o vértice final pois, em caso negativo, será
disparada uma exceção de que os valores passados não retornam uma geometria convexa. Na
solução proposta, foi criada uma procedure que recebe um vetor de pontos e criada o
polígono correspondente à área desta região. Para um desenvolvedor, torna-se menos
dispendioso utilizar uma rotina na qual ele possa apenas passar o vetor com os vértices do
polígono, do que utilizar outra rotina na qual ele precise estar sempre atento para não passar
por parâmetro uma geometria inválida.
Em suma, a pesquisa objetiva criar uma camada de abstração que possa facilitar o
desenvolvimento de aplicações que utilizem a robustez do banco de dados espacial. Algumas
aplicações, como Google Maps, Google Earth, Wikimapia e demais aplicações que utilizam
mapas possuem alguns dos recursos disponíveis nesta pesquisa. No entanto, durante a
pesquisa, não foi identificado se estas aplicações comerciais utilizam dados relacionais ou
espaciais. Vale ressaltar que esta pesquisa não tem como objetivo reimplementar estas
aplicações, mas criar recursos que facilitem a utilização da robustez do BDE nestas
aplicações.
63
Como trabalhos futuros, podem ser sugeridos:
· Criação de um software que utilizem todos os recursos apresentados nesta pesquisa,
mapeando não apenas postos de gasolina, mas farmácias, hospitais, entre outros
problemas do mundo real. Este mapeamento deverá ser feito não apenas na cidade de
Fortaleza, mas em todo o país.
· Integrar a técnica do banco de dados espacial ao processamento de imagens. O
PostGis possui um conjunto de funções que permitem a vetorização de imagens
digitais, incluindo funções de vetorização e de histograma.
· Desenvolvimento de um framework ou de um gerenciador de conteúdo que
contenham uma interface gráfica para manipulação dos dados geográficos. Esta
ferramenta poderá ser fundamental para a criação de novas procedures e types com
informações espaciais. Este trabalho futuro seria, portanto, uma extensão desta
pesquisa.
· Implementação de uma framework para integração dos recursos do BDE com a API
openGL. O openGL é uma API para a linguagem de programação C que representa
dados do mundo real por meio da geometria.
64
REFERERÊNCIAS BIBLIOGRÁFICAS
ALESSIO, Augusto Colombelli. Bancos de Dados Espaciais. Foz do Iguaçu:
CESUFOZ, 2009.
CÂMARA, Gilberto. Representação computacional de informações geográficas. São
José dos Campos: INPE, 2005.
CÂMARA, Gilberto; QUEIROZ, Gilberto Ribeiro de. Arquitetura de Sistemas de
Informação Geográfica. Belém: UFPA, 2000.
CODD, Edgar Frank. A Relational Model of Data for Large Shared Data Banks. San
José, Califórnia: IBM Research Laboratory, 1969.
ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados. 4ª Ed.
São Paulo: Pearson Addison-Wesley, 2005. cap. 20-22, p. 459-524.
FERREIRA, Karine Reis; QUEIROZ, Gilberto Ribeiro de. Bancos de Dados
Geográficos. Brasília: INPE, 2005.
GUIMARÃES, Célio Cardoso. Fundamentos de Bancos de Dados: Modelagem,
projeto e linguagem SQL. São Paulo: Unicamp, 2008. p. 231-242.
GÜTING, Ralf Hartmut. An Introduction to Spatial Database System. Hagen,
Alemanha: Praktische Informatik IV, Fernuniversität Hagen, 1994.
IBIS. Simple Freatures. Disponível em:
<http://ibis.colostate.edu/WebContent/IBIS/BlueSpray/UsersGuide/Script_SimpleFeat
ures.html>. Acesso em: 30, maio. 2012.
KAUPA, Paulo. Os 4 pilares da Programação Orientada a Objetos. Disponível em: <
http://www.devmedia.com.br/os-4-pilares-da-programacao-orientada-a-objetos/9264>.
Acesso em: 20, abril. 2013.
LISBOA FILHO, Jugurta. Projeto de Banco de Dados para Sistemas de Informação
Geográfica. Viçosa: Universidade Federal de Viçosa, 2000.
65
MAPS OF WORLD. Disponível em:
<http://www.mapsofworld.com/lat_long/brazil-lat-long.html>.
Acesso em: 31, maio. 2012.
MARTINS, Lucas. Introdução à Geometria Analítica. Disponível em:
<http://www.infoescola.com/matematica/introducao-a-geometria-analitica-bissetriz-
plano-cartesiano/>. Acesso em: 15, junho. 2013.
MEDEIROS, Anderson. O Geoprocessamento e suas tecnologias – Parte 2.
Disponível em:
<http://andersonmedeiros.com/2010/03/13/geotecnologias-parte2/#.T8VjiWXFbIU>.
Acesso em: 15, maio. 2012.
MILANI, André. PostgreSQL: Guia do programador. 1ª Ed. São Paulo: Novatec,
2008.
OLIVEIRA, Evaldo. Introdução a Sistemas de Informações Geográficas. Ed. 14. São
Paulo: Revista SQL Magazine, 2004.
QUADRO, Fernando. Introdução ao PostGis. Disponível em:
<http://www.slideshare.net/fernandoquadro/introduo-ao-PostGis>. Acesso em: 7,
maio. 2012.
RAMAKRISHNAN, Raghu; JOHANNES, Gehrke. Sistemas de Gerenciamento de
Banco de Dados. 3ª Ed. São Paulo: McGraw-Hill, 2008. cap. 23; 28, p. 642-678; 803-
822.
REZENDE, Ricardo. Conceitos Fundamentais de Bancos de Dados. Disponível em:
<http://www.devmedia.com.br/conceitos-fundamentais-de-banco-de-dados/1649>.
Acesso em: 11, abril. 2013.
SILBERSCHATZ, Abraham; KORTH, Henry F; SUDARSHAN, S. Sistemas de
Banco de Dados. 3ª Ed. São Paulo: Pearson Makron Books, 1999. cap. 1-4, p. 1-150;
cap. 8-9, p. 249-290.
SPACCAPIETRA, Stefano. Space Modeling. Lausanne, Bélgica: Laboratoire de Bases
de Données, 2007.