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);