PDI em TerraLib
Time TerraLib
TerraLib
Biblioteca de software para
construção de SIGs:
Código fonte aberto ( GNU Lesser
General Public License )
Público alvo: desenvolvedores de
software com conteúdo geográfico
Escrita em C++
Multi-plataforma ( Linux, Windows)
Utiliza outras bibliotecas livres
Arquitetura integrada (uma única base
de dados)
SIG
atributos
SGBD
TePDI
Módulo TerraLib para processamento de imagens.
Objetivo: Repositório de algoritmos de PDI.
APLICATIVOS
( código aberto – segue a
mesma licença da TerraLib )
C++
TePDI
TerraLib Kernel
SGBD
Não
vinculado à bases de
dados.
TePDI
Documentação On-line
http://www.terralib.org
Documentação embutida no código ( Doxygen ).
http://www.stack.nl/~dimitri/doxygen/
TePDI
Obtendo o código em http://www.terralib.org
Em um arquivo ZIP
Utilizando o repositório TerraLib (CVS)
Estrutura de diretórios
Raiz (zip ou CVS)
src
terralib
image_processing
terralibw
terralib
image_processing
terralibx
terralib
image_processing
exemplos
image_processing
Código Fonte
Projetos para Windows
Projetos para Linux
Exemplos (somente por CVS)
TePDI
Compilação
Windows Visual Studio .NET
Linux GCC
Raiz (zip ou CVS)
src
terralibw
terralib
terralib.vcproj
image_processing
terralibpdi.vcproj
terralibx
terralib
Makefile
image_processing
Makefile
Exemplos
image_processing
image_processing.sln
Makefile
Projetos para Windows
Projetos para Linux
TeRaster (Terralib kernel)
Funções
Prover uma interface única para manipulação de dados matriciais em TerraLib.
GTIFF, JPEG, SPRING, MRSID, etc.
Transparência quanto à forma de armazenamento.
Memória, disco ou banco de dados.
TeRasterParams
TeRaster
TeDecoder
TeDecoderTIFF
TeDecoderDatabase
?????
TeRaster (Terralib kernel)
Métodos mais utilizados:
init( TeRasterParams& ) Reinicializa a instância seguindo novos
parâmetros.
getElement( int col, int line, double& value, int band ) Provem uma
cópia do valor do elemento existente na posição indicada.
setElement( int col, int line, double value, int band ) Configura o valor
do elemento na posição indicada.
params() – Retorna a referência para os parâmetros atuais da instância.
TeRaster (Terralib kernel)
Exemplo 1 – Criando uma instância vinculada a um arquivo de imagem em
disco (somente leitura):
#include <TeRaster.h>
TeRaster raster_instance1( “nome_arquivo.tif”, “r” );
TeRaster raster_instance2( “nome_arquivo.jpeg”, “r” );
TeRaster (Terralib kernel)
Exemplo 2 – Criando uma instância vinculada a uma nova imagem em
memória:
#include <TeRaster.h>
TeRasterParams params;
params.nBands( 1 );
params.nlines_ = l0;
params.ncols_ = 10;
params.mode_ = “c";
params.decoderIdentifier_ = "MEM";
TeRaster raster_instance;
raster_instance.init( params );
TeRaster (Terralib kernel)
Exemplo 3 – Criando uma instância vinculada a um novo arquivo de
imagem em disco:
#include <TeRaster.h>
TeRasterParams params;
params.nBands( 1 );
params.nlines_ = l0;
params.ncols_ = 10;
params.mode_ = “c";
params.fileName_ = “nome_arquivo.tif";
params.decoderIdentifier_ = “TIF";
TeRaster raster_instance;
raster_instance.init( params );
Iteradores (TeRaster::iterator - Terralib kernel)
Função: Prover uma interface para acessar elementos de imagem de
formas diferenciadas.
Exemplo: TeRaster::iterator_poly.
TePolygon
TeRaster::iterator
TeRaster::iterator_poly
?????
Iteradores (TeRaster::iterator - Terralib kernel)
Exemplo/Aplicação:
Iterador 2
Iterador 1
Mosaico + Blending
IMAGEM A
IMAGEM B
Projeção A
IMAGEM A
Projeção B
Imagem Resultante
Projeção A
Iterador 3
Iteradores (TeRaster::iterator - Terralib kernel)
Exemplo/Código:
#include <TeRaster.h>
#include <TeGeometry.h>
TePolygon polygon_instance;
TeRaster raster_instance;
TeRaster::iteratorPoly it =
raster_instance.begin( polygon_instance, TeBoxPixelIn, 0 );
TeRaster::iteratorPoly it_end =
raster_instance.end( polygon_instance, TeBoxPixelIn, 0 );
While( it != it_end ) {
double valor_pixel = *it( 0 );
++it;
};
TePDI - Estrutura
Hierarquia de algoritmos Uma interface única para algoritmos.
TePDI - Estrutura
Para executar um algoritmo:
Método Reset ( TePDIParameters )
Método CheckParameters (TePDIParameters )
Método Apply()
TePDI - Estrutura
Exemplo (contraste):
#include <TePDIContrast.hpp>
TeRaster inRaster;
TeRaster outRaster;
TePDIParameters params;
params.SetParameter( "contrast_type", TePDIContrast::TePDIContrastMinMax; );
params.SetParameter( "input_image", inRaster );
params.SetParameter( "output_image", outRaster );
params.SetParameter( "band", (int)0 );
TePDIContrast contra_instance;
contra_instance.Reset( params );
contra_instance.Apply();
TePDI - Estrutura
Como criar um novo algoritmo:
Método CheckParameters (TePDIParameters )
Método ResetState()
Método RunImplementation()
TePDIAlgorithm
TePDIMyAlgorithm
CheckParameters (TePDIParameters )
ResetState()
RunImplementation()
TePDI - Estrutura
Exemplo (contraste):
#include <TePDIAlgorithm.hpp>
class TePDIMyAlgorithm : public TePDIAlgorithm
{
public :
TePDIMyAlgorithm();
~TePDIMyAlgorithm();
bool CheckParameters( const TePDIParameters& parameters ) const;
protected :
void ResetState( const TePDIParameters& params );
bool RunImplementation();
};
TePDI - Estrutura
Fábricas de algoritmos (Padrão de Projeto Factory)
Prover maior modularização
Facilitar a manutenção de código diante de atualizações ou adição
de novos algoritmos.
TeFactory< T >
Gabarito
TePDIAlgorithm
TePDIAlgorithmFactory
Abstrata
TePDIMosaic
TePDIMosaicFactory
Concreta
TePDI - Estrutura
Fábricas de algoritmos (Padrão de Projeto Factory)
Exemplo sem utilização da fábrica de algoritmos:
#include <TePDIMosaic.hpp>
TePDIParameters params;
TePDIMosaic mosaic_instance;
mosaic_instance.Reset( params );
mosaic_instance.Apply();
Exemplo com utilização da fábrica de algoritmos:
#include <TeAlgorithmFactory.hpp>
TePDIParameters params;
TePDIAlgorithm::pointer mosaic_pointer( TePDIAlgorithmFactory::make(
"TePDIMosaic", params ) );
mosaic_pointer->Apply();
TePDI - Estrutura
Estratégias de algoritmos (Padrão de Projeto Strategy)
Prover maior modularização.
Facilitar a manutenção de código diante de atualizações ou adição
de novos algoritmos.
Estratégia ???
Porções de código com comportamento semelhante mas que
executam uma mesma tarefa de formas distintas.
TePDINoBlendingStrategy
TePDIMosaic
TePDIGeoMosaicStrategy
TePDIEuclidianBlendingStrategy
TePDITieMosaic
TePDINoBlendingStrategy
TePDIEuclidianBlendingStrategy
?????
TePDI - Estrutura
Estratégias de algoritmos (Padrão de Projeto Strategy)
TePDIStrategy
TePDITieMosaicStrategy
TePDIMosaic
TePDIGeoMosaicStrategy
????
TePDIStrategy
TePDIParameters params;
params.SetParameter( “mosaic_type”, “geo_mosaic” );
TePDIAlgorithm::pointer mosaic_pointer( TePDIAlgorithmFactory::make(
"TePDIMosaic", params ) );
TePDI - Estrutura
Fábricas de estratégias de algoritmos
TeFactory< T >
Gabarito
TePDIStrategy
TePDIStrategyFactory
Abstrata
TePDIGeoMosaicStrategy
TePDIGeoMosaicStrategyFactory
Concreta
TerraPixel
Função:
Prover uma base de funções e classes para permitir e facilitar a construção de
plugin’s para a manipulação de dados raster TerraLib.
Prover mecanismos e facilidades para a integração daqueles plugin’s na forma de
código independente carregado dinamicamente.
Plugin’s ???
São mini-aplicativos que dependem de outro aplicativo para serem executados.
Recebem dados/parâmetros do aplicativo ao qual são vinculados.
Permitem interação com o aplicativo vinculado.
TerraPixel
Arquitetura
Usuário
Plugin
TerraPixel
TePDI
TerraLib
TerraPixel
Características
Escrito em linguagem C++.
Portabilidade ( Windows, Linux ).
Baseado em classes/funções TerraLib/TePDI ( TeRaster, TePDIAlgorithm, etc. ).
Utiliza classes/funções QT para prover a componente visual.
Utiliza classes/funções LibSPL para prover a funcionalidade de carregamento
dinâmico de código.
TerraPixel
Obtendo o código utilizando CVS:
cvs -d :pserver:[email protected]:/home/terralib co
aplicativos/terraPixel
Raiz (CVS)
aplicativos
terraPixel
terraPixel
Plugins
src
terralibw
terralibx
exemplos
Código do aplicativo
Código de plugin’s
TerraPixel
Arquitetura
Portabilidade
Limitações de
Memória Win32
Requisito:
Permitir compartilhamento de objetos ( TeRaster, TePolygon, etc. ) entre plugin’s e
o aplicativo principal.
Problema:
Código carregado dinamicamente não compartilha o mesmo HEAP do aplicativo.
Possível solução:
Copiar o objeto de uma área para a outra
Nem sempre é viável ( Ex: TeRaster ).
TerraPixel
Arquitetura
Exemplo:
TerraPixel vinculado a Terralib.
Plugin vinculado a Terralib.
Plugin instância um TeRaster e passa a sua referência para o aplicativo.
TerraPixel
TeRaster *
Plugin
TeRaster
Problema:
Objetos podem ser modificados somente na mesma área de código onde foram
criados.
Objetos podem ser destruídos somente na mesma área de código onde foram
criados.
TerraPixel
Arquitetura
Possível solução – Cópia de objetos de uma área para outra:
Nem sempre é viável ( Ex: TeRaster ).
Resolução: Gerente de objetos
TerraPixel
Plugin
ObjectsManager
ObjectsManager
Lista Visual
Algoritmo
Visualização
TerraPixel
Arquitetura
Resolução: Gerente de objetos
Gabarito em função do tipo de dado a ser armazenado.
BTree indexada por strings.
Armazena referências compartilhadas dos objetos ( TeSharedPtr ).
2 modos de operação (master,slave) sincronizados (TeCommunicator).
ObjectsManager< T >
RastersManager
PolygonsManager
TerraPixel
Arquitetura
Resolução: Gerente de objetos
TerraPixel
Plugin
RastersManager(Master)
RastersManager(Slave)
TeSharedPtr< TeRaster >
TeSharedPtr< TeRaster >
TeRaster1 *
TeRaster1
TeCommunicator<string>
TeRaster2
TeSharedPtr< TeRaster >
TeRaster2 *
TeSharedPtr< TeRaster >
TerraPixel
Plugin’s – Desenvolvimento
Utilização de um projeto QT base que provém :
Includes básicos necessários para plugins.
Link com as bibliotecas necessárias.
Definições de compilação necessárias.
Raiz (CVS)
aplicativos
terraPixel
terraPixel
plugins
source
base
base.pro
src
terralibw
terralibx
exemplos
TerraPixel
Plugins – Desenvolvimento
SPL_DEFINE_PLUGIN_INFO – Definição da interface informações sobre o
plugin.
Informações sobre a versão ( build, minor, major version).
Informações de identificação do Plugin (requisitadas pelo aplicativo).
Informações sobre o desenvolvedor.
Informação sobre a versão da interface esperada para receber dados do
aplicativo.
TerraPixel
Exemplo de código
SPL_DEFINE_PLUGIN_INFO(
1,
///< The build number.
1,
///< The major version (e.g. 1.xx).
0,
///< The minor version (e.g. 0.10).
true,
///< Plugins arguments to the public?
"Mosaic",
///< The plugin's name.
"INPE",
///< The plugin's vendor.
"TerraPixel Mosaic Plugin",
///< The plugin's general description.
PLUGINPARAMETERS_VERSION,
///< The expected plugin parameters version.
"http://www.dpi.inpe.br/terralib",
///< The plugin vendor's homepage.
"[email protected]",
///< The plugin vendor's email address.
"TerraPixelPlugin" );
///< The plugin's UUID.
TerraPixel
Plugins – Desenvolvimento
SPL_RUN_NAME_CODE - Definição do ponto de entrada do plugin.
Parâmetros passados pelo aplicativo:
Apontadores para as instâncias de todos os gerentes de objetos.
Interfaces de todas as instâncias de objetos que possibilitam interação
com o usuário (Navegadores visuais de raster, etc).
Apontador para a classe que guarda parâmetros globais.
TerraPixel
Exemplo de código
SPL_PLUGIN_API bool SPL_RUN_NAME_CODE( slcPluginArgs* a_pPluginArgs )
{
void* arg_ptrs[ 1 ];
a_pPluginArgs->GetArg( 0, arg_ptrs );
PluginParameters* plug_pars_ptr = ( PluginParameters* ) arg_ptrs[ 0 ];
static RastersManager slave_rm_instance(
*(plug_pars_ptr->rasters_manager_ptr_) );
..........
Código do plugin
..........
return true;
}
TerraPixel
Plugins – Exemplo: Mosaico
C++
Utiliza QT para prover a componente gráfica.
Utiliza LibSPL para a interface de carregamento dinâmico de código.
Utiliza classes TerraLib para armazenar dados ( matriciais e vetoriais ).
Utiliza classes TerraLibPDI para processar dados.
Dúvidas ???
http://www.terralib.org