Interface para Consultas Espaciais em Banco de Dados Geográficos Karine Reis Ferreira Orientadores João Argemiro Carvalho Paiva Gilberto Câmara Estrutura da apresentação • Introdução • Sistemas de Informações Geográficos - SIGs • Sistemas de Banco de Dados Geográficos – Oracle Spatial • • • • TerraLib OpenGIS A Interface Considerações finais Introdução • Objetivo Desenvolver uma interface de programação genérica (API) para consultas espaciais em Banco de Dados Geográficos para a biblioteca TerraLib • Um nível maior de abstração para os usuários da TerraLib • Fornecer consultas a dados vetoriais e a dados matriciais • Suportar diferentes SGBDs • Explorar o máximo os recursos de extensões espaciais Introdução • Motivação Consultas Espaciais Contribuir para o desenvolvimento da TerraLib Suporte básico para a construção de SIGs Incentivo a SIGs de código fonte aberto e gratuito no mercado Sistemas de Informações Geográficas • Evolução das arquiteturas de SIGs – Dual – Integrada • SGBD Relacional • SGBD Objeto-Relacional • Falta de Interoperabilidade • Consultas mais lentas • Dificuldade em manter a integridade entre dados espaciais e alfanuméricos Sistemas de Informações Geográficas • Evolução das arquiteturas de SIGs – Dual – Integrada • SGBD Relacional • SGBD Objeto-Relacional • Não é capaz de capturar a semântica do dado espacial • Limitações da SQL • Métodos de acesso espacial e otimizador de consultas implementados pelo SIG Sistemas de Informações Geográficas • Evolução das arquiteturas de SIGs – Dual – Integrada • SGBD Relacional • SGBD Objeto-Relacional • Tipos de dados espaciais • Operadores e funções para consultas e junções espaciais • Indexação espacial e otimização de consultas Sistemas de Banco de Dados Geográficos • SGBD Objeto-Relacional são estendidos para suportar: – Tipos de dados espaciais, como ponto, linha, etc; – Operadores e funções espaciais + SQL: manipulação desses dados (junção e consultas); – Métodos eficientes de acesso aos dados espaciaisl • Extensões existentes: – – – – Oracle Spatial IBM DB2 Spatial Extender Informix Spatial Datablade PostGIS Sistemas de Banco de Dados Geográficos • Oracle Spatial: extensão espacial do SGBD Oracle – Tipos de dados espaciais – Funções e operadores espaciais – Métodos de indexação espacial SDO_GEOMETRY SDO_GTYPE SDO_SRID SDO_POINT SDO_ELEM_INFO SDO_ORDINATES Plano NUMBER NUMBER SDO_POINT_TYPE SDO_ELEM_INFO_ARRAY SDO_ORDINATE_ARRAY CREATE TABLE ESTADOS ( estado_id NUMBER, nome VARCHAR2(100) geometria MDSYS.SDO_GEOMETRY); Geometria Elemento Sistemas de Banco de Dados Geográficos • Oracle Spatial: extensão espacial do SGBD Oracle – Tipos de dados espaciais – Funções e operadores espaciais – Métodos de indexação espacial Operadores e Funções baseados na matriz de 9-Interseções SELECT FROM WHERE ES.estado_id Estado ES, Rios RI RI.gid = 234 AND SDO_RELATE(ES.geometria, RI.geometria, ‘mask=CONTAINS querytype=WINDOW’) = ’TRUE’; SDO_UNION SELECT SDO_XOR FROM WHERE SDO_GEOM.SDO_INTERSECTION (ES.geometria, FL.geometria, 0.005) Estado ES, Floresta FL ES.nome = 'Pará' AND FL.nome = 'Amazonia'; SDO_RELATE SDO_DISTANCE SDO_INTERSECTION SDO_DIFFERENCE SDO_BUFFER SDO_CONVEXHULL Sistemas de Banco de Dados Geográficos • Oracle Spatial: extensão espacial do SGBD Oracle – Tipos de dados espaciais – Funções e operadores espaciais – Métodos de indexação espacial 11 X 14 1 5 Y 2 b 11 d 14 1 5 8 8 2 6 6 12 12 13 a Z a 13 c T 3 3 9 9 10 10 7 7 4 4 d R Quad-Tree b R c R-Tree TerraLib • Biblioteca de classes • Suporte a SIGs de arquitetura integrada • Paradigmas: – Orientação a Objetos – Programação Genérica – Design Patterns • Composta por: – Kernel – Drivers – Functions Jfddfjh gfsdfgdfssf Jfddfjh gfsdfgdfssf Jfddfjh gfsdfgdfssf fsdf fsdfsd fsdf fsdfsd fsdf fsdfsd sdfsdf sdfsdf sdfsdf TerraLib BD TerraLib Interface com SGBDs : Drivers • Conexão • Execução de comandos SQL: DDL e DML • Criação do modelo TerraLib TeDatabase TeOracle TePostgreSQL • Execução de consultas SQL e manipulação dos resultados • Inserção, atualização e recuperação de dados alfanuméricos e geográficos TeDatabasePortal TeOraclePortal TePostgreSQLPortal OpenGIS • Arquitetura padrão para SIGs; • Operadores espaciais (relações topológicas) – Modelo da Matriz de 9-Interseções Estendido Dimensionalmente (DE-9IM) Equals Disjoint Overlaps Intersects Touches Contains Within Crosses Relate. • Funções para testar relações de distância e que retornam novas geometrias Distance Intersection SymDifference Difference ConvexHull Union Buffer A Interface • Consultas espaciais – métodos da classe TeDatabase – genéricas para todos os SGBDs – consultas são computadas pela TerraLib • Consultas espaciais a dados vetoriais – Baseadas nas especificações do OpenGIS – Re-implementadas nos drivers de SGBDs que possuem extensões espaciais • exploração de seus recursos • operadores e funções espaciais com SQL • consultas são computadas pelo SGBD A Interface – Operador Espacial Contains bool Contains(const string& table1, const string& column1, const string& table2, const string& column2, const double id2, TeDatabasePortal& *Portal); bool Contains(const string& table1, const string& column1, const double id1, const string& table2, const string& column2, const double id2, bool *Result); bool Contains(const string& table, const string& column, const TeGeometry& geom, TeDatabasePortal& *Portal); bool Contains(const string& table, const string& column, const double id, const TeGeometry& geom, bool *Result); Table 1 Table 2 Id Name 1 São José Spatial Data 0402470247 Id Name 1 São José Spatial Data 0402470247 2 Vilade 0398103898 2 Vilade 0398103898 3 Curitiba 6549876465 3 Curitiba 6549876465 4 Lourdes 4579454845 4 Lourdes 4579454845 5 Fabriciano 1465487946 5 Fabriciano 1465487946 A Interface – Operador Espacial Contains bool Contains(const string& table1, const string& column1, const string& table2, const string& column2, const double id2, TeDatabasePortal& *Portal); bool Contains(const string& table1, const string& column1, const double id1, const string& table2, const string& column2, const double id2, bool *Result); bool Contains(const string& table, const string& column, const TeGeometry& geom, TeDatabasePortal& *Portal); bool Contains(const string& table, const string& column, const double id, const TeGeometry& geom, bool *Result); Table 1 Table 2 Id Name 1 São José Spatial Data 0402470247 Id Name 1 São José Spatial Data 0402470247 2 Vilade 0398103898 2 Vilade 0398103898 3 Curitiba 6549876465 3 Curitiba 6549876465 4 Lourdes 4579454845 4 Lourdes 4579454845 5 Fabriciano 1465487946 5 Fabriciano 1465487946 A Interface – Operador Espacial Contains bool Contains(const string& table1, const string& column1, const string& table2, const string& column2, const double id2, TeDatabasePortal& *Portal); bool Contains(const string& table1, const string& column1, const double id1, const string& table2, const string& column2, const double id2, bool *Result); bool Contains(const string& table, const string& column, const TeGeometry& geom, TeDatabasePortal& *Portal); bool Contains(const string& table, const string& column, const double id, const TeGeometry& geom, bool *Result); Table Id Name 1 São José Spatial Data 0402470247 2 Vilade 0398103898 3 Curitiba 6549876465 4 Lourdes 4579454845 5 Fabriciano 1465487946 TeGeometry TeGeometry A Interface – Operador Espacial Contains bool Contains(const string& table1, const string& column1, const string& table2, const string& column2, const double id2, TeDatabasePortal& *Portal); bool Contains(const string& table1, const string& column1, const double id1, const string& table2, const string& column2, const double id2, bool *Result); bool Contains(const string& table, const string& column, const TeGeometry& geom, TeDatabasePortal& *Portal); bool Contains(const string& table, const string& column, const double id, const TeGeometry& geom, bool *Result); Table Id Name 1 São José Spatial Data 0402470247 2 Vilade 0398103898 3 Curitiba 6549876465 4 Lourdes 4579454845 5 Fabriciano 1465487946 TeGeometry TeGeometry A Interface – Função Buffer bool Buffer (const string& table, const string& column, const double id, const double distance, TePolygon *bufferResult; – Driver TeOracle - Oracle Spatial • Operadores e funções + SQL • Computadas pelo SGBD SELECT FROM WHERE T1.id, T1.column Table1 T1, Table2 T2 T2.id = id2 AND SDO_RELATE(T1.column, T2.column, ‘mask=CONTAINS querytype=WINDOW’)= ’TRUE’; SELECT SDO_GEOM.SDO_BUFFER (T.column, M.diminfo, distance) FROM table T, user_sdo_geom_metadata M WHERE M.table_name = 'table' AND M.column_name = 'column' AND T.indice = id; A Interface • Consultas espaciais a dados matriciais – Baseadas nas operações da linguagem LEGAL – Operações zonais • calcular estatísticas simples de um conjunto de valores de um raster que estão contidos em uma determinada zona delimitada por um polígono - Soma - Média - Variância - Máximo Valor ... A Interface – Transformação de coordenadas • conversão de coordenadas do mundo para a linha e coluna correspondente do raster, e vice-versa. – Mask • recorta um raster a partir de outro ou a partir de um polígono – Operações de transformação • Reclassify: classes • Slice: numérico • Weight: temático novas classes temático numérico – Operações aritméticas • Executa operações matemáticas sobre um conjunto de rasters. A Interface • Consultas a dados matriciais – – – – – Operações zonais Transformação de coordenadas Mask Operações de transformação Operações aritméticas typedef map<string, double> statistics; bool ZonalOperator (const string& table, const string& column, const TePolygon& geom, statistics& result); A Interface • Consultas a dados matriciais – – – – – Operações zonais Transformação de coordenadas Mask Operações de transformação Operações aritméticas bool WorldCoordToRowCol (const TePoint& WC, const string& table, const string& column, TePoint *RC); bool RowColToWorldCoord (const TePoint& RC, const string& table,const string& column, TePoint *WC); A Interface • Consultas a dados matriciais – – – – – Operações zonais Transformação de coordenadas Mask Operações de transformação Operações aritméticas bool Mask (const string& table1, const string& column1, const string& table2, const string& column2, TeRaster *result); bool Mask (const string& table, const string& column, const TePolygon& geom, TeRaster *result); A Interface • Consultas a dados matriciais – – – – – Operações zonais Transformação de coordenadas Mask Operações de transformação Operações aritméticas typedef map<double, double> interval bool Slice (const string& table, const string& column, const map<interval, string>& rules, const string& TabAtribOut, TeRaster *result); A Interface • Consultas a dados matriciais – – – – – Operações zonais Transformação de coordenadas Mask Operações de transformação Operações aritméticas typedef map<string, string> table; bool Calculate (const map<char, table>& Imagens, string& mathexp, TeRaster *result); Considerações Finais • Trabalhos realizados: – Desenvolvimento do driver TeOracle utilizando OCI (Oracle Call Interface) – Definição das consultas da API • Espera-se: – Cumprir o trabalho no prazo estipulado – Desenvolver a API com todas características definidas: • genérica • exploração dos recursos de extensões espaciais – Contribuir com esse trabalho para o desenvolvimento da TerraLib