\documentclass[portuges]{article}
\usepackage{a4wide}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{graphicx}

\title{Mapper --- Editor de Meta-Informação sobre Mapas}
\author{Alberto Manuel B. Simões\\
  {\small albie@alfarrabio.di.uminho.pt}}
\date{}

\begin{document}
\maketitle

\begin{abstract}
  Este documento apresenta brevemente alguns dos pormenores de
  implementação da aplicação \texttt{Mapper}, que pretende ser um
  editor de meta-informação sobre mapas geográficos em formato
  \textit{raster}. Esta meta-informação pode ser usada posteriormente
  pela aplicação \texttt{Map-It} para criar um conjunto de documentos
  HTML que permitam a navegação sobre o mapa e respectivas zonas.
\end{abstract}

\section{Introdução}
\label{sec:intro}

É usual utilizar-se mapas digitalizados (em formatos de imagem
\textit{raster}) para apresentar na Internet localizações geográficas
de vários pontos de uma cidade, vila ou até de um Campus. Estas
imagens, embora possam conter muita informação, são usualmente
difíceis de usar: ou obtemos uma imagem enorme em que se consiga ler
perfeitamente todo o mapa, ou uma imagem pequena com menos
legibilidade. Para resolver este problema foi criada, à cerca de dois
anos, uma ferramenta (Map-It) que transforma um mapa gigante num
conjunto de pequenos extractos interligados por páginas WWW.

Esta ferramenta foi posteriormente enriquecida com a possibilidade de
definição de um ficheiro XML com pontos, linhas ou áreas sobre o mapa.
A estes objectos geográficos associaram-se URLs e títulos. Depois de
processar o mapa e o respectivo ficheiro XML a ferramenta gera um
conjunto de linhas e zonas hiper-activas sobre o mapa que assinalam os
objectos descritos. Estes objectos permitem ainda saltar para o URL
associado.

Embora num estado estável, a ferramenta Map-It tem o inconveniente de
obrigar à definição manual do ficheiro XML de áreas activas. Para
solucionar este problema, surgiu a ideia de construir uma aplicação
gráfica e interactiva para a definição destas áreas.

\section{Objectivos}
\label{sec:objectivos}

A aplicação deve ser capaz de ler uma imagem \textit{raster} e de
permitir a edição interactiva de pontos, áreas, linhas e caminhos.  A
conjuntos destes objectos deve ser possível associar um título,
descrição, URL e tipo. Este tipo deverá funcionar como agregador de
objectos, contendo um título de tipo e a sua descrição.

O conjunto de áreas definidas deverá ser gravado num ficheiro XML. A
aplicação deve também possibilitar a leitura de um ficheiro XML
anteriormente gravado para posterior completação.


\section{Análise do Problema}
\label{sec:analise}

Analisando de forma orientada a objectos os objectivos apresentados na
secção \ref{sec:objectivos} podemos encontrar as seguintes classes de
objectos:
\begin{itemize}
\item mapa --- imagem \textit{raster} com toda a meta-informação
  associada (Map);
\item objecto gráfico --- ponto, área, linha ou caminho a ser definido
  sobre o mapa (GraphicObject);
\item conjunto de objectos gráficos --- título, descrição, URL e tipo
  associados a um conjunto de objectos gráficos (GeographicElement);
\item tipo --- tipo de objecto que está a ser definido sobre o mapa.
  Este tipo permite agrupar objectos relacionados. Exemplos de tipos
  podem ser: monumentos, escolas, igrejas (Layer);
\end{itemize}
Nesta enumeração de objectos foram também apresentados os
identificadores em inglês escolhidos para representar os respectivos
elementos na implementação OO.

Em relação aos objectos gráficos, podemos ainda detalhar o seu
formato, criando uma hierarquia como a que é apresentada na figura
\ref{objgraf}.

\begin{figure}[hrb]
\begin{center}
\includegraphics[scale=0.4]{classes.eps}
\caption{\label{objgraf}Hierarquia dos objectos gráficos}
\end{center}
\end{figure}


\section{Implementação}
\label{sec:implementacao}

A implementação foi realizada de forma orientada a objectos (OO)
utilizando a linguagem de programação Java pela sua portabilidade e
pelo seu conjunto de bibliotecas disponíveis.

\subsection{Imagens raster}
\label{sec:raster}
O primeiro problema encontrado na implementação da aplicação poderia
vir a ser fatal no caso de não ter sido encontrada uma solução. De
facto, a linguagem Java não dispõe de fácil manuseamento sobre imagens
em formato raster. Em particular, existem algumas primitivas de base
na área dos JavaBean que manuseiam imagens Gif.

No caso em causa, as imagens Gif não são de todo desejáveis devido
quer à copyright do seu formato de compressão, quer ao número de cores
que disponibiliza.

Realizadas algumas pesquisas na Internet revelaram um grande conjunto
de extensões às bibliotecas base do Java para o uso de outros formatos
de imagens. Foi escolhida uma denominada \texttt{imageLoader} pela sua
boa documentação e pelo apoio do próprio autor. No entanto, o uso
desta biblioteca arruinou por completo a portabilidade da aplicação
por usar código C \textit{linkado} directamente no código máquina da
plataforma em causa.

Esta biblioteca permite a leitura de imagens em vários formatos, desde
o Gif, Tiff, Jpg e Png. Este último foi o formato escolhido por ser o
mais recente e também o mais poderoso.


\subsection{Interface Gráfica}
\label{sec:swing}

Uma vez que a aplicação deve permitir a edição interactiva sobre um
mapa, é necessário o uso de um \textit{toolkit} gráfico. Neste campo,
o Java traz de base dois toolkits com esta finalidade: um mais antigo
(AWT) e um outro, construido sobre o anterior (SWING). Foi escolhido o
SWING por ser mais recente e conter determinados objectos gráficos que
o AWT não contempla.

Em relação à implementação gráfica, podemos referir como classes base
construídas: 
\begin{itemize}
\item About --- Encapsula o funcionamento de uma janela de informação
  sobre a aplicação;
\item MapAddLayer --- Encapsula o funcionamento de uma janela de
  edição de propriedades de um Layer a adicionar ao mapa;
\item LayerAddElement --- Encapsula o funcionamento de uma janela de
  edição de propriedades de um elemento geográfico a adicionar ao
  Layer actual;
\item MapCanvas --- Canvas sobre o qual vai ser apresentado a imagem
  raster e vai ser desenhado o conjunto de objectos gráficos;
\item MapViewer --- Janela que engloba o MapCanvas e respectiva linha
  de estado, menu e barra de ferramentas;
\item Message --- Encapsula o funcionamento de uma janela de diálogo
  com mensagens informativas;
\item JColorMenuItem --- Classe que extende o funcionamento de um
  JMenuItem para apresentar uma cor e permitir a escolha interactiva
  dessa mesma cor;
\item Teste --- Classe principal do programa;
\end{itemize}


\subsection{Maps}
\label{sec:maps}

O objecto Map é o topo da árvore de instanciações. Os Mapas contêm
Layers, que por sua vez contêm Elementos gráficos. Estes, são
constituídos por elementos gráficos.

Desta forma, além de conter o conjunto de Layers (organizados num
Vector) contém o nome do ficheiro de imagem a que se refere o mapa que
está a ser editado, e um buffer onde a imagem é descomprimida.

A criação deste objecto pode ser feita indicando apenas o nome do
ficheiro de imagem que se pretende editar, on então passando um
documento XML. Esta segunda opção é especialmente útil para a leitura
do ficheiro XML do mapa, e recriação dos objectos em memória.

Ainda em relação aos ficheiros XML, esta classe implementa a
\textit{interface} XML que significa que contém um método que retorna
um elemento \texttt{org.jdom.Element} XML pronto a ser gravado.

Além destes métodos e dos habituais métodos para aceder ás variáveis
existentes, foi desenvolvido um método para permitir adicionar novos
Layers, sem para isso o utilizador ter de lidar directamente com esta
classe.

\subsection{Layers}
\label{sec:layers}

Segundo nível na hierarquia de instanciações, o objecto layer pode ser
visto como \textit{tipo} dos objectos a incluir sobre o mapa. Desta
forma, contém o nome (ou título) do tipo (do Layer), a sua descrição e
um vector de todos os elementos geográficos que pertencem a esse tipo
(ou Layer).

Para maior facilidade na edição do mapa, foram providenciadas opções
para esconder o mapa (para não atrapalhar a edição noutros Layers) e
para alterar a cor das linhas desenhadas.

Os Layers podem ser construídos usando uma String como título (nome do
tipo) ou então usando um elemento XML. Esta classe implementa a
\textit{interface} XML, o que implica que também disponibiliza um
método para guardar a sua informação como XML.

Além dos acessores a atributos privados do objecto, existe ainda a
possibilidade de adicionar elementos geográficos usando para isso
apenas o nome desse mesmo elemento.

Existe também um método que desenha todo o Layer (objectos contidos)
num objecto Graphics.

\subsection{GeographicElements}
\label{sec:geo}

Este objecto agrega um conjunto de elementos gráficos. Contém também
um nome, descrição e URL como foi referido durante a análise do
problema. Convém referir que também existe uma referência para o Layer
a que este elemento pertence de forma a aumentar a velocidade da
interface gráfica.

Mais uma vez, estes elementos podem ser construídos usando o título do
elemento a definir, ou usando um elemento XML que contenha a
informação respectiva ao elemento. Também implementa a
\textit{interface} XML porque deve ser capaz de captar a sua
informação num elemento XML.

Além dos acessores a atributos privados do objecto, existe ainda a
possibilidade de adicionar elementos gráficos. Existe também um método
que desenha todos os elementos gráficos contidos.

\subsection{GraphicElements}
\label{sec:ge}

Esta classe abstracta é o topo da árvore já apresentada na figura
\ref{objgraf}. Cada um dos filhos desta classe contêm informação
relativa aos objectos que representam. Além desta informação, um
destes objectos pode estar activo (está a ser editado
interactivamente) ou não.

Em relação aos métodos que estes objectos devem implementar: um
constructor a partir de um element XML; um método para colocar a sua
informação num objecto XML; um método para desenhar o elemento que
representa; opções para alterar o estado da variável booleana que
indica se está activo; um método para adicionar pontos; e um outro
para retornar a lista de pontos que o objecto representa.

\section{Conclusões e trabalho futuro}

Esta aplicação está completamente funcional mas muitas opções úteis
podem ainda ser implementadas. Entre elas devo salientar:
\begin{itemize}
\item possibilidade de apagar Layers, elementos geográficos ou
  gráficos;
\item possibilidade de alterar a informação relativa a Layers e
  elementos geográficos;
\item possibilidade de voltar a editar os objectos gráficos;
\item maior variedade no tipo de imagens raster suportadas;
\item maior controlo na memória usada pelas imagens;
\end{itemize}

No entanto, a aplicação está usável e atinge os objectivos propostos
de edição de mapas para a aplicação Map-It. No entanto, para que este
processo esteja realmente completo será necessário adaptar a aplicação
Map-It ao novo formato XML adopatado visto que o existente não suporta
a existência de Layers nem de linhas e percursos.

\end{document}

