Kernel - TerraLib

Propaganda
Agosto, 2005
Introdução
a TerraLib II
Karine Reis Ferreira – [email protected]
Gilberto Ribeiro de Queiroz – [email protected]
Gilberto Câmara – [email protected]
Disponível em http://www.dpi.inpe.br/cursos/ser303
Estrutura da TerraLib

As principais classes e funções da TerraLib são
agrupadas em 5 módulos:
 Kernel
 Drivers
 Funções
(Functions)
 Algoritmos de Estatística Espaço-Temporal (Stat)
 Algoritmos de Processamento de Imagens (PDI)
Kernel

Estruturas de dados

Geometrias vetoriais e raster
 Ex.: TeCoord2D, TePoint, TePolygon e TeRaster

Atributos Descritivos
 Ex.: TeTable, TeAttribute e TeProperty

Metadados
 Ex.: TeLayer, TeTheme, TeProjection e TeLegend

Elementos espaço-temporais
(atributos+geometrias+tempo)
 Ex.: TeSTInstance, TeSTElement e TeSTElementSet
Kernel

API para acesso a uma base de dados TerraLib


Algoritmos geométricos


TeDatabase e TeDatabasePortal
operadores topológicos, métricos e de conjunto
Controle de visualização
OBS: DPI/INPE é responsável por prover um Kernel
estável, incorporando modificações e correções
recomendadas por seus parceiros e usuários em geral
Kernel - Geometrias

Geometrias vetoriais
TeGeometry
TeVector
TePoint
TeLine2D
TeLinearRing
TePolygon
TePolygonSet
TeLineSet
TePointSet
Kernel - Geometrias

Outras geometrias vetoriais

TeCell e TeCellSet

TeArc e TeArcSet

TeNode e TeNodeSet

TeSample e TeSampleSet

TeContourLine e TeContourLineSet

TeText e TeTextSet
Kernel - Geometrias
// Cria um polígono simples
TeLine2D line;
line.add(TeCoord2D(900,900));
line.add(TeCoord2D(900,1000));
line.add(TeCoord2D(1000,1000));
line.add(TeCoord2D(1000,900));
line.add(TeCoord2D(900,900))
TeLinearRing r1(line);
TePolygon poly1;
poly1.add(r1);
poly1.objectId("spoli");
Kernel - API Raster

A API Raster é formada por 3 classes básicas:

TeRaster
classe genérica
 TeRasterParams

Estrutura de dados que representa os parâmetros
que caracterizam um dado raster
 TeDecoder


Classe genérica de decodificação de formatos e
acesso a dispositivos de armazenamento
Kernel - API Raster

TeRaster

Manipula valores de pixel como
double
 Métodos getElement e
setElement dão acesso ao valor
escrito em cada pixel, em cada
banda, em uma resolução,
indexados por: (col, lin,
banda,res).
TeRaster::getElement(col,lin,band,val)
{ decoder_->getElement(col,lin,band,val ) }
TeRaster::setElement(col,lin,band,val)
{ decoder_->setElement(col,lin,band val) }
TeGeometry
Kernel - API Raster

TeRasterParams





Dimensão
 Número linhas, colunas e bandas
Informações geográficas
 Projeção, resolução e retângulo
envolvente
Características dos elementos
 Tamanho digital e interpretação
Armazenamento
 Nome do arquivo ou tabela
Forma de decodificação
 Mecanismo usado para ler e
escrever
TeGeometry
Kernel - API Raster

Decoders
 Encapsulam
o acesso aos elementos de um raster,
independentemente do formato e organização
 Podem ser instanciados explicitamente ou inferidos a
partir de parâmetros (p.ex. extensão de um arquivo)
Arquivo JPEG
Dados matriciais
como uma matriz
de valores em
memória
Arquivo binários raw
Dados matriciais
armazenados em
um banco TerraLib
Arquivo TIFF ou
GeoTIFF
Kernel - API Raster
TeInitRasterDecoders();
// inicializa decodificadores
TeRaster rasterTIF("d:/Dados/TIFF/brasM.tif");
TeRaster rasterJPEG("d:/Dados/JPEG/brasilia.jpg");
TeDatum sad69 = TeDatumFactory::make("SAD69");
TeUtm* proj = new TeUtm(sad69,-45.0*TeCDR);
TeRasterParams par;
par.fileName_ = "D:/Dados/RAW/grade.raw";
par.decoderIdentifier_ = "MEMMAP";
par.nBands(1);
par.mode_ = 'r';
par.setDummy(-9999.9);
par.setDataType(TeFLOAT);
par.topLeftResolutionSize(1850.0,8200.0,10,50,10,1,true);
par.projection(proj);
TeRaster grade(par);
Kernel - API Raster

Memória Virtual (cache)
 Otimiza
o acesso a dados raster que podem ser
acessados por blocos:


Modelo raster em banco da TerraLib
GeoTIFF usando a libtiff : acesso por linha
Aplicação
Cache
Bloco
Bloco W
X
(i,j) ?
elemento
Bloco Y
Bloco Z
bloco
Decoder
Kernel - API Raster

Manipulação
 Classe TeRasterRemap:
remapeia um raster de
entrada para um de saída resolvendo diferenças de
geometria:

Diferentes número de linhas ou colunas

Diferentes resoluções

Diferentes retângulos envolventes

Diferentes projeções
Kernel - API Raster

Manipulação

TeRasterRemap usa
getElement e setElement para
“copiar” um raster para outro.
Exemplos:





Passar de um dispositivo para
outro
Recortar um pedaço de um
raster
Mosaicar vários pedaços em
um raster único
Visualização
Reprojetar um raster
Kernel - Metadados

Metadados
Kernel - Metadados
Kernel - Metadados
Kernel – Elementos Espaço-Temporais

Os elementos ou objetos geográficos estão divididos em
várias tabelas em um banco de dados TerraLib

Cada representação geométrica está armazenado em
uma tabela
 Os atributos descritivos podem estar divididos em várias
tabelas de atributos

Mecanismo para recuperar de um banco TerraLib todos
os elementos espaço-temporais de um layer ou tema
 Querier

Estruturas para armazenar esses elementos
Kernel – Elementos Espaço-Temporais

Estruturas

TeSTInstance
representa uma instância temporal de um elemento ou
objeto geográfico. Uma instância possui um tempo e
um conjunto de atributos e geometrias válido para esse
tempo
 TeSTElement

representa todas as instâncias temporais de um
determinado elemento
 TeSTElementSet


representa todas as instâncias temporais de todos os
elementos espaciais pertencentes a um tema
Kernel – Elementos Espaço-Temporais

Estruturas

Arm1
Ex.: armadilhas
Arm2
uniqueId
objectId
time
num_ovos
1
Arm1
Jan/2001
100
2
Arm1
Fev/2001
50
3
Arm1
Marc/2001
70
4
Arm2
Jan/2001
120
5
Arm2
Fev/2001
60
TeSTInstance
TeSTElement
TeSTElementSet
Kernel – Elementos Espaço-Temporais

Estruturas
Kernel – Elementos Espaço-Temporais

Mecanismo de recuperação: TeQuerier

Recupera instâncias espaço-temporais a partir de
diferentes fontes (banco TerraLib ou shapefile)

É construído a partir de um conjunto de parâmetro


TeQuerierParams
Pode ser construído usando diferentes estratégias.
Uma estratégia é escolhida internamente baseado
nos parâmetros de construção



TeQuerierDBStr1
TeQuerierDBStr2
TeQuerierDBStr3
Kernel – Elementos Espaço-Temporais
Kernel: Algoritmos geométricos

Operações topológicas
 Baseado
na Matriz 9-I DE
 Ex.: TeEquals, TeDisjoint, TeTouches, TeCrosses

Operações métricas
 Ex.: TeDistance, TeLength, TeGeometryArea

Operações de conjunto
 Ex.: TeUnion, TeIntersection

e TeDifference
Outras operações
 Ex.: TeFindCentroid, TeBufferRegion
Kernel - API para acesso a banco TerraLib

Classe abstrata TeDatabase

Interface completa de manipulação do banco TerraLib
 Define métodos para inserir, alterar, excluir e recuperar as
entidades do modelo conceitual e os dados geográficos

Classe abstrata TeDatabasePortal

Implementa o conceito de portal: submete uma consulta
SQL ao banco e disponibiliza os registros resultantes
 Um portal e sempre criado a partir de uma instância da
classe TeDatabase que possui uma conexão aberta com
o banco
Kernel - API para acesso a banco TerraLib

Database e Drivers
Kernel
Drivers
DBMS
Oracle
SqlServer
MySQL
Oracle
Spatial
Postgre
SQL
PostGIS
Drivers

As classes TeDatabase e TeDatabasePortal são
derivadas em classes concretas chamadas drivers

Cada driver implementa os métodos abstratos conforme
as características e particularidades de cada SGBD

Os drivers para SGBD-OR com extensão espacial
exploram todos os recursos fornecidos para tratar dados
geográficos

Tipos de dados espaciais
 Indexação espacial
 Operadores e funções juntamente com SQl
Drivers

Diferenças no modelo de banco de dados
TerraLib
Driver
DBMS
Without spatial extent
Driver Oracle Spatial
Oracle Spatial
Drivers

Diferentes implementações dos métodos do
Database
 Ex.:
LocatePolygon  Qual o polígono que contém
o ponto P?
P
Drivers

LocatePolygon: SGBD sem extensão espacial
TerraLib
Driver
SELECT
WHERE
AND
AND
AND
* FROM polygons p
p.lower_x <= P.x()
p.upper_x >= P.x()
p.lower_y <= P.y()
p.upper_y >= P.y()
DBMS
Without spatial extent
Drivers

LocatePolygon: SGBD sem extensão espacial
TerraLib
functions
Driver
result
SELECT
WHERE
AND
AND
AND
* FROM polygons p
p.lower_x <= P.x()
p.upper_x >= P.x()
p.lower_y <= P.y()
p.upper_y >= P.y()
DBMS
Without spatial extent
TerraLib
Drivers

LocatePolygon: SGBD com extensão espacial
TerraLib
Driver Oracle Spatial
SELECT * FROM polygons
WHERE MDSYS.SDO_RELATE(spatial_data,
MDSYS.SDO_GEOMETRY(2001, NULL,
MDSYS.SDO_POINT_TYPE(P.x(),P.y(), NULL),
NULL, NULL),
'mask=contains
querytype = window') = 'TRUE'";
Oracle Spatial
result
Functions

Importação de dados vetoriais


Exportação de dados vetoriais



Cálculo de estatísticas de células
Address Locator
Processamento geográficos entre temas


MID/MIF, ASCII SPRING, shapefile
Geração de um layer de células a partir de um layer ou
tema


MID/MIF, SPRING geo/tab, shapefile, BNA, DBF, CSV
Agregação, Adição, Interseção, União, Diferença,
Associação de atributos (coleta ou distribuição)
Criação de temas ou layers a partir de temas
Importação de dados matriciais
TeDecoderVirtualMemory
TeDecoderVirtualMemory
getElement(c,l,b,val,res)
setElement(c,l,b,val,res)
TeRasterRemap remap();
TeDecoderTiff
getRasterBlock(blockId,...)
remap.setInput(rIn);
remap.setOutpu(rOut);
remap.apply()
TeDecoderDatabase
getRasterBlock(blockId,...)
putRasterBlock(blockId,...)
rOut
brasilia.tif -> rIn
Stat

Projeto TerraStat: Algoritmos de estatística espaçotemporal








Média Local, Índice de Moran Local e Global, G e GStar
Mapa de Kernel
Semivariograma
Bayes Empírico Local e Global
Skater
Função K e KNox
Sistema de Vigilância
LESTE-UFMG (Laboratório de Estatísticas
Espaciais da Universidade Federal de Minas Gerais)
PDI

Algoritmos para processamento de imagens

Funções de contraste
 Filtros e filtros de convolução
 Algoritmos de classificação
 Crescimento de regiões

DPI/INPE
Aplicativos e Projetos

Aplicativos

TerraView
 TerraCrime
 Sistema do Proarco
 SigMun

Projetos

SAUDAVEL
 TerraStat
 Integração com R (aRT e MyR)
 TDK e VIPE
TerraView
TerraCrime
Sistema do PROARCO
SigMun

Funcate
 www.funcate.org.br/geoprocessamento.html
 Construção
de aplicativos para atualização, consulta
e navegação na base de dados georeferenciada

Implementações
 São
Sebastião, Ilhabela, Ubatuba, Caraguatatuba,
São José dos Campos
 São Bernardo do Campo, Santos, Cachoeiro do
Itapemirim
 Mirasol, Avaré, Feira de Santana, Estado da Bahia –
Geopolis (50)
Projeto SAUDAVEL

Tecnologias da Informação Espacial no Apoio ao
Controle Epidêmico
 Experimento
em andamento em Recife-PE
 Alimentando um banco de dados TerraLib
 Visualização e consulta via TerraView
Projeto TerraStat


Biblioteca de procedimentos estatísticos espaciais
avançados em C++
Parceria INPE/DPI e UFMG Leste
TerraStat : (Algoritmos TerraLib) é um
conjunto de algoritmos para clusters espaçotemporais através de métodos estatísticos e
outras soluções, implementadas em C++ e a
incoporados como algoritmos em TerraLib
Integração com R: GCEA - UFPR

Grupo de Estatística Computacional e Espacial
Aplicadas
 http://www.est.ufpr.br/GECEA
 aRT
(API R-TerraLib) : integração entre o software R
e TerraLib combinando informações estatísticas e
geoespaciais
 myR : biblioteca C++ para acessar funcionalidades R
Projeto TDK e VIPE

TecGraf-PUC/Rio
 InfoPae


(Petrobrás)
Planos de emergência para refinarias
TDK: TerraLib Development Kit
 Objetivo:
facilitar o desenvolvimento de aplicativos
geográficos que utilizem a TerraLib
 WMS-TerraLib

VIPE : ferramenta de visualização, impressão,
processamento e edição a partir de um banco de
dados TerraLib
Programando com TerraLib

Diretório “examples”
Criar um banco TerraLib
// Datatabase server parameters
string host = "localhost";
string dbname = "TerraTeste";
string user = "root";
string password = "";
// Creates a new database
TeDatabase* db = new TeMySQL();
if (!db->newDatabase(dbname, user, password, host))
{ return 1; }
// Close database
db->close();
return 0;
Criar um layer: importando um arquivo
// Datatabase server parameters
string host = "localhost";
string dbname = "TerraTeste";
string user = "root";
string password = "";
// Connects to database
TeDatabase* db = new TeMySQL();
db->connect(host, user,password, dbname);
string filename = "../data/Distritos.mif";
// Import the MID/MIF file
TeLayer* newLayer = TeImportMIF(filename, db);
if (newLayer)
{
cout << "MID/MIF file imported to the TerraLib database
successfully!\n";
}
Criar um layer: criando os objetos
// Connects to database
TeDatabase* db = new TeMySQL();
db->connect(host, user,password, dbname);
// Creates a projection
TeDatum mDatum = TeDatumFactory::make("SAD69");
TeProjection* pUTM = new TeUtm(mDatum,0.0);
// Create a new layer called "TesteLayer"
string layerName = "TesteLayer";
TeLayer* layer = new TeLayer(layerName, db, pUTM);
// Create a set of points
TePoint p1(40,40);
p1.objectId("ponto1");
TePoint p2(65,65);
p2.objectId("ponto2");
TePointSet pos;
pos.add(p1); pos.add(p2);
Criar um layer: criando os objetos
// Add the point set to the layer
layer->addPoints(pos);
// Create an attribute table
// Define a list of attributes
TeAttributeList attList;
TeAttribute at;
at.rep_.type_ = TeSTRING;
at.rep_.numChar_ = 16;
at.rep_.name_ = "object_id";
at.rep_.isPrimaryKey_ = true;
attList.push_back(at);
at.rep_.type_ = TeSTRING;
at.rep_.numChar_ = 255;
at.rep_.name_ = "nome";
at.rep_.isPrimaryKey_ = false;
attList.push_back(at);
// a string attribute
Criar um layer: criando os objetos
at.rep_.type_ = TeREAL; // a float attribute
at.rep_.name_ = "val1";
at.rep_.isPrimaryKey_ = false;
attList.push_back(at);
at.rep_.type_ = TeINT;
at.rep_.name_ = "val2";
at.rep_.isPrimaryKey_ = false;
attList.push_back(at);
// an integer attribute
// Create an attribute table associated to the new layer
TeTable attTable("TesteLayerAttr", attList, "object_id", "object_id");
layer->createAttributeTable(attTable);
// Each row is related to one of the geometries by its objetc_id
TeTableRow row;
Criar um layer: criando os objetos
row.push_back("ponto1");
row.push_back("A point");
row.push_back("55.5");
row.push_back("55");
attTable.add(row);
row.clear();
row.push_back("ponto2");
row.push_back("Another point");
row.push_back("66.6");
row.push_back("66");
attTable.add(row);
row.clear();
// Saves the table in the database
layer->saveAttributeTable( attTable );
// Close database
db->close();
Criar uma vista e um tema
// Connects to database
TeDatabase* db = new TeMySQL();
db->connect(host, user,password, dbname);
// Load the layer "Distritos"
TeLayer* dist = new TeLayer("Distritos");
db->loadLayer(dist);
// Create a view with the same projection of the layer
TeProjection* proj = dist->projection();
string viewName = "SaoPaulo";
TeView* view = new TeView(viewName, user);
view->projection(proj);
db->insertView(view); // save the view in the database
// Create the visual
TeColor color;
TeVisual polygonVisual(TePOLYGONS);
color.init(0,0,255);
polygonVisual.color(color);
Criar uma vista e um tema
// Create a theme with the following attribute restriction:
TeTheme* themeRest = new TeTheme("T_dist_POP", dist);
themeRest->setAttTables (dist->attrTables());
// Set the attribute restriction
string restAttr = " Pop91 > 100000 ";
themeRest->attributeRest(restAttr);
// Set the visual
themeRest->setVisualDefault(polygonVisual, TePOLYGONS);
// Insert the theme into the view
view->add(themeRest);
themeRest->save(); // Save the theme in the database
// Build the collection of objects associated to the theme
themeRest->buildCollection();
Recuperar todos os objetos de um tema
// Connects to database
TeDatabase* db_ = new TeMySQL();
db_->connect(host,user,password,dbname);
// Load the theme
TeTheme* bairros = new TeTheme(" T_dist_POP");
db_->loadTheme(bairros);
TeInitQuerierStrategies(); //Init querier strategies
//All attributes and geometries
bool loadGeometries = true;
bool loadAllAttributes = true;
// Set querier parameters - load all attributes and geometries
TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
querierParams.setParams(bairros);
TeQuerier
querier(querierParams);
// Load instances from theme
querier.loadInstances();
Recuperar todos os objetos de um tema
// Traverse all the instances
TeSTInstance sti;
while(querier.fetchInstance(sti))
{
cout << " Object: " << sti.objectId();
// Plot each attribute, its name and value
TePropertyVector vec = sti.getPropertyVector();
for(unsigned int i=0; i<vec.size(); ++i)
{
string attrName = vec[i].attr_.rep_.name_;
string attrValue = vec[i].value_;
cout << attrName << " : " << attrValue << endl;
}
//Get geometries
if(sti.hasPolygons())
{
TePolygonSet polSet;
sti.getGeometry(polSet);
}
}
Criar um layer de células
// Connects to database
TeDatabase* db = new TeMySQL();
db->connect(host, user,password, dbname);
// Load the layer "Distritos"
TeLayer* dist = new TeLayer("Distritos");
db->loadLayer(dist);
// Cria um espaço celular sobre a extensão do layer
// de distritos, onde cada célula tem 100 x 100 metros
TeLayer* espaco_cel =0;
espaco_cel = TeCreateCells(“CellsDist”, dist , 100, 100);
Download