• Nenhum resultado encontrado

11.1 Interface Genérica de Operações Espaciais

No documento Tutorial de Programação. TerraLib 3.1.3 (páginas 33-37)

As operações espaciais também estão implementados em um conjuntos de métodos da classe TeDatabase que funcionam como uma Interface Genérica de Operações Espaciais ou API para Operações Espaciais. Essa interface é genérica porque, através da classe TeDatabase, esses métodos podem ser chamados da mesma maneira em drivers para SGDB’s com extensão espacial ou sem extensão espacial. Drivers para SGDB’s com extensão espacial implementam a interface de operações especiais usando as funções da extensão espacial. Drivers que não possuem a extensão implementam a interface através de funções espaciais básicas escritas sobre as classes de geometria, após a sua recuperação do banco de dados. Na Figura 11.1 mostramos a diferença de execução de uma operação espacial, cálculo de área de um objeto, executada em um driver sem extensão espacial (p. ex. ACCESS) e um driver com extensão espacial (p. ex. Oracle Spatial).

As operações sobre dados matriciais foram implementadas somente usando as classes da TerraLib, uma vez que as extensões espaciais ainda não fornecem as operação sobre dados matriciais. Uma descrição completa da interface genérica de operações espaciais em um banco de dados geográfico pode ser encontrada em Ferreira (2003).

Figura 11.1 – Representação da operação de cálculo de área (adaptado de Ferreira, 2003).

A API para Operações Espaciais pode ser utilizada quando os dados geográficos estão armazenados em um banco TerraLib. Os exemplos a seguir mostram operações sobre layers em um banco TerraLib.

Exemplo 11.3 - Recuperar todos os estados adjacentes (TeTOUCHES), todos os rios que cruzam (TeCROSSES) e todas as cidades que estão dentro (TeWITHIN) do estado de identificador 23.

Este exemplo utiliza a Interface Genérica de Operações Espaciais da classe TeDatabase. // Recupera do banco de dados um layer de polígonos, um de linha e

// outro de pontos

TeLayer* states = new TeLayer("states"); // states: polígonos db->loadLayer(states);

TeLayer* rivers = new TeLayer("rivers"); // rivers: linhas db->loadLayer(rivers);

TeLayer* cities = new TeLayer("cities"); // cities: pontos db->loadLayer(cities);

// Armazena a identificação dos objetos resultantes vector<string> objsOut;

vector<string> objsIn; // objetos a serem consultados objsIn.push_back("23");

// Seta a precisão que sera considerada nas operações espaciais TePrecision::instance().setPrecision(

TeGetPrecision(states->layer()->projection()));

// Recupera os estados que tocam o estado 23

bool res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn, objsOut, TeTOUCHES);

if (res) {

cout << "Estados que tocam o estado \"23\": \n"; unsigned int i;

for (i=0; i<objsOut.size(); i++)

cout << "Estado: " << objsOut[i] << endl; }

// Recupera os rios que cruzam o estado 23

res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,

(a) Banco sem extensão espacial

rivers->tableName(TeLINES), TeLINES, objsOut, TeCROSSES);

if(res) {

cout << "\nRios que cruzam o estado \"23\": \n"; unsigned int i;

for (i=0; i<objsOut.size(); i++)

cout << "Rios: " << objsOut[i] << endl; }

// Recupera as cidades que estão dentro do estado 23

res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn, cities->tableName(TePOINTS),

TePOINTS, objsOut, TeWITHIN); if (res)

{

cout << "\nCidades que estão dentro do estado \"23\": \n"; unsigned int i;

for (i=0; i<objsOut.size(); i++)

cout << "Cidade: " << objsOut[i] << endl; }

db->close(); return 0;

Pode-se observar que o tipo da relação topológica é passado como parâmetro da função. As relações possíveis estão definidas no arquivo TeDataTypes e são: TeDISJOINT, TeTOUCHES, TeCROSSES, TeWITHIN, TeOVERLAPS, TeCONTAINS, TeINTERSECTS, TeEQUALS, TeCOVERS, TeCOVEREDBY.

Exemplo 11.4 - Recuperar todos os eventos de crime que ocorreram a uma distância máxima de 500 metros da fronteira do bairro São Geraldo (identificador 60).

// Recupera o layer "BairrosPoA"

TeLayer* bairros = new TeLayer("BairrosPoA"); db->loadLayer(bairros);

// Recupera o layer "OcorrenciasPoA"

TeLayer* events = new TeLayer("OcorrenciasPoA"); db->loadLayer(events);

// Guarda o identificador dos objetos resultantes vector<string> objsOut;

vector<string> objsIn; // objects to be queried objsIn.push_back("60");

// Seta a precisão que sera considerada nas operações espaciais

TePrecision::instance().setPrecision(TeGetPrecision(bairros->projection()));

// Gera um buffer de 500 metros de distancia ao redor do bairro TePolygonSet bufferPol;

if (!db->buffer(bairros->tableName(TePOLYGONS), TePOLYGONS, objsIn, bufferPol, 500)) {

cout << "Falha ao generar o buffer!" << endl; return 1;

}

// Recupera os eventos que estão dentro do buffer

if(!db->spatialRelation(events->tableName(TePOINTS), TePOINTS,

&bufferPol, objsOut, TeWITHIN)) {

cout << "Falha ao recuperar os eventos!" << endl; return 1;

// Mostra o resultado

cout << " Eventos encontradas:" << endl << endl;

for(unsigned int i=0; i<objsOut.size(); i++) cout << " " << objsOut[i] << endl;

db->close(); return 0;

O exemplo anterior gerou um buffer de distância de 500 metros a partir das fronteiras do bairro São Geraldo e utilizou a geometria gerada na operação espacial. O resultado da operação de buffer é um conjunto com dois pólígonos onde o primeiro é o buffer externo e o segundo é o buffer interno.

Exemplo 11.5 - Recortar um dado matricial a partir de uma máscara definida por um polígono.

//Conecta com o banco TerraTeste //Inicializa os decoders do raster TeInitRasterDecoders();

//Carrega o layer Brasilia

TeLayer* layerBrasilia = new TeLayer("Brasilia_RGB"); db->loadLayer(layerBrasilia);

string rasterTable = layerBrasilia->tableName(TeRASTER);

//Carrega o layer

TeLayer* layerPolBrasilia = new TeLayer("BrasiliaPol"); db->loadLayer(layerPolBrasilia);

//Carrega o polígono que será usado como máscara no recorte TePolygonSet ps;

layerPolBrasilia->loadGeometrySet("0",ps); TePolygon poly = ps[0];

//Recorta o dado matricial considerando a parte interna da máscara ou // do polígono. Essa função gera um novo layer raster.

string newLayer = "BrasiliaRecortadoIn";

db->mask (rasterTable, poly, newLayer, TeBoxPixelIn);

//Recorta o dado matricial considerando a parte externa da máscara ou // do polígono. Essa função gera um novo layer raster.

newLayer = "BrasiliaRecortadoOut";

db->mask (rasterTable, poly, newLayer, TeBoxPixelOut);

//operação zonal

TeStatisticsDimensionVect result; db->zonal(rasterTable, poly, result);

O Exemplo 11.5 mostra as operações Zonal e Recorte de um dado matricial. Na operação zonal, um conjunto de estatísticas (por exemplo, soma, valor máximo, valor mínimo, contagem, média, variância, etc.) é calculado sobre a região do dado matricial contida dentro de um polígono que representa a zona de interesse. O resultado é fornecido em uma estrutura própria que armazena as estatísticas calculadas em cada dimensão do dado matricial.

Na operação de recorte o dado matricial é recortado pela zona de interesse, o resultado é um novo layer no banco de dados. A implementação dessa função foi feita usando o conceito de iterador sobre uma representação matricial, ou seja, um ponteiro que percorre todos os elementos do dado matricial. No caso da operação de recorte, foi usada uma especialização do conceito de

iterador sobre dados matriciais, de forma que esse percorra somente os elementos que possuam uma certa relação com a região de

interesse. As relações possíveis são que a área do elemento esteja toda dentro da região, que a área do elemento esteja toda fora da região, que o centro do elemento esteja dentro da região ou que o centro do elemento esteja fora da área de interesse.

Voltar para o índice.

12. Manipulação de dados espaço-temporais

Os atributos e as geometrias de um objeto ou elemento geográfico podem mudar ao longo do tempo, onde cada mudança gera uma nova instância no tempo desse objeto. A TerraLib tem uma proposta para tratar dados espaço-temporais, ou seja, para considerar a componente temporal dos dados geográficos, quando houver. Como exemplos de dados espaço-temporais podemos identificar:

l Eventos: ocorrências independentes no espaço e no tempo, que possuem um rótulo temporal de quando o evento ocorreu.

Esse é o caso de crimes que ocorrem em uma determinada localização de uma cidade em uma determinada data e hora. Cada objeto espacial associado a um associado a um evento terá uma única identificação no banco de dados;

l Objetos Mutáveis: os quais possuem uma geometria fixa ao longo do tempo, porém seus atributos descritivos podem variar.

Um exemplo desse tipo de objeto são os dados manipulados por modelos dinâmicos baseados em espaços celulares, ou estações fixas de coletas de dados;

l Objetos em Movimento os quais possuem limites e localizações, ou seja, geometrias que podem variar no tempo assim

como seus atributos descritivos. Esse é o caso quando se acompanha a evolução de dos lotes de uma cidade, ou dos polígonos de desmatamento de uma região.

No modelo de banco de dados geográfico proposto pela TerraLib os dados são registrados semanticamente em função da sua natureza temporal com o objetivo de possam ser construídas funcionalidades específicas relativas a essa natureza temporal. Entre essas funcionalidades estão incluídos os algoritmos de agrupamento temporal, visualização de animações ou criação de temas com restrições temporais e ferramentas de modelagem dinâmica. Assim, quando uma tabela de atributos, associada a um layer, é inserida em um banco de dados, uma das informações registradas na tabela de metadados te_layer_table é qual o seu tipo, e dependendo desse tipo outras informações são necessárias. Além das tabelas estáticas e externas descritas anteriormente os outros tipos de tabelas são:

l Eventos: uma tabela de atributos de eventos. É preciso registrar qual de seus campos possui a identificação única do evento

(e que faz a ligação com sua geometria) e quais de seus campos possuem a informação temporal da ocorrência do evento. A informação temporal normalmente é um intervalo (tempo inicial e tempo final), mas para rótulos temporais pontuais o tempo inicial é igual ao tempo final;

l Atributos Variáveis: uma tabela de atributos relacionada a dados do tipo objetos mutáveis. É preciso identificar quais o

campo possui a identificação única do objeto no banco (e que faz a ligação com sua geometria), qual campo identifica de maneira única cada versão, ou instância de atributos associada ao objeto, e quais campos possuem a informação temporal que determina o intervalo de validade dessa instância.

O modelo de armazenamento dos objetos em movimento ainda está sendo desenvolvido na TerraLib, uma vez que esse é o caso mais complexo. Além de se considerar a variação no tempo associado aos atributos dos objetos é preciso considerar a variação associada às suas geometrias. Cada geometria tem que armazenar um intervalo (ou instante) de validade e é necessário propor um mecanismo de associação, em um determinado instante ou intervalo, entre a geometria e os atributos do objeto.

Exemplo 12.1 - Utilizar o TerraView para importar um dado temporal de ocorrências de crimes de um arquivo e observar as entradas geradas na tabela te_layer_table.

No documento Tutorial de Programação. TerraLib 3.1.3 (páginas 33-37)

Documentos relacionados