610 likes | 713 Views
Banco de Dados Espaciais. Sistema de Informações Geográficas 2006.2 Prof. Cláudio Baptista. Oracle Spatial. Provê um esquema SQL e funções que facilitam o armazenamento, recuperação, atualização, e consulta de coleções de feições espaciais num Oracle database.
E N D
Banco de Dados Espaciais Sistema de Informações Geográficas 2006.2 Prof. Cláudio Baptista
Oracle Spatial • Provê um esquema SQL e funções que facilitam o armazenamento, recuperação, atualização, e consulta de coleções de feições espaciais num Oracle database. • Um geo-objeto é definido como um atributo de tipo SDO_GEOMETRY (antigo MDSYS.SDO_GEOMETRY) de uma tabela OR. • Consiste dos seguintes componentes: • Um esquema MDSYS que provê o tipo de dado geométrico; • Um mecanismo de indexação espacial; • Um conjunto de operadores e funções para executar consultas espaciais, junções espaciais e outras operações de análise espacial; • Utilitários administrativos
Oracle Spatial • Modelo de dados • Element (point, polygon, linestring) • Geometria (geometry object): representação de uma feição espacial modelado com um conjunto de elementos primitivos. • Layer: coleção de geometrias com o mesmo conjunto de atributos • Coordinate System (também chamado Spatial Reference System) • Tolerance: reflete a distância que dois pontos podem estar para ainda serem considerados o mesmo ponto (útil em correção de erro).
Oracle Spatial – Operações Espaciais • SDO_RELATE: usa um critério espacial, implementando o modelo de 9-interseções, com os relacionamentos topológicos (disjoint, touches, equals, inside, etc.) • SDO_WITHIN_DISTANCE: implementa um buffer. Indica se geo-objetos estão a uma certa distância um do outro • SDO_NN: indica os vizinhos mais próximos (Nearest Neghbor) de um geo-objeto.
Oracle Spatial – Operações Espaciais • SDO_RELATE- Operadores topológicos • DISJOINT : as bordas e interiores não se interceptam • TOUCH: as bordas interceptam mais os interiores não. • OVERLAPBDYDISJOINT – uma linha origina-se for a de um polígono mas termina dentro • OVERLAPBDYINTERSECT – insterseção de borda com interior • EQUAL – dois objetos têm a mesma borda e mesmo interior. • CONTAINS – o interior e borda de um objeto está completamente contido no interior do outro objeto. • COVERS -- o interior de um objeto está completamente contidono interior ou borda de outro objeto e suas bordas se interceptam. • INSIDE – o oposto de CONTAINS. A INSIDE B implica que B CONTAINS A. • COVEREDBY – o oposto de COVERS • ON -- o interior e borda de um objeto está na borda de outro objeto ( e o segundo objeto cobre o primeiro objeto). Por exemplo, quando uma linha está na borda de um polígono. • ANYINTERACT – os objetos são non-disjoint
Oracle Spatial – Tipos de Dados Espaciais • O tipo SDO_Geometry é definido como: CREATE TYPE sdo_geometry AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, SDO_ORDINATES SDO_ORDINATE_ARRAY); CREATE TYPE sdo_point_type AS OBJECT ( X NUMBER, Y NUMBER, Z NUMBER); CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER; CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER; • Existem outros tipos para lidar com GeoRaster, GeoCoding e Topologia e Redes
Oracle Spatial – Tipos de Dados Espaciais • O atributo SDO_GTYPE indica o tipo da geometria (segue OGC Simple Feature for SQL. Possui 4 dígitos no formato dltt, onde • d: indica o número de dimensões (2, 3 ou 4) • l: usado em geometrias 3-dimensões. Colocar 0 para default. • tt: indica o tipo da geometria (00 a 07) (00 – Unknown geometry, 01 – Point, 02 – Line ou Curve, 03 – Polygon, 04 – Collection, 05 – MultiPoint, 06 – MultiLine, 07 – MultiPolygon • Ex. 2003 => Polígono em 2-dimensões
Oracle Spatial – Tipos de Dados Espaciais • O atributo SDO_SRID identifica um sistema de coordenadas (spatial reference system) para geometria. Se não null, deve conter um valor da coluna SRID da tabela MDSYS.CS_SRS • Todos os valores de uma geometria devem ter o mesmo SRID
Oracle Spatial – Tipos de Dados Espaciais • O atributo SDO_POINT é do tipo SDO_POINT_TYPE que possui 3 number X,Y,Z: • OBS.: usado para armazenar pontos, neste caso os arrays SDO_ELEM_INFO e SDO_ORDINATES devem ser null
Oracle Spatial – Tipos de Dados Espaciais • SDO_ELEM_INFO : é um vetor de tamanho variável que armazena as características dos elementos que compõem a geometria. As coordenadas de cada elemento são armazenadas em um vetor variável chamado SDO_ORDINATES e são interpretadas através de três números armazenados no SDO_ELEM_INFO: • SDO_STARTING_OFFSET: indica qual a posição da primeira coordenada do elemento no SDO_ORDINATES; • SDO_ETYPE: indica o tipo do elemento; • SDO_INTERPRETATION: indica como o elemento deve ser interpretado juntamente com o SDO_ETYPE. • SDO_ORDINATES: contém os pontos que compõem a geometria
Oracle Spatial – Tipos de Dados Espaciais • Exemplo: Para o retângulo ao lado: • SDO_GEOMETRY: • SDO_GTYPE = 2003 ( 2 indica 2-dimensões, e 03 indica um polígono. • SDO_SRID = NULL. • SDO_POINT = NULL. • SDO_ELEM_INFO = (1, 1003, 3). O último 3 indica que é um retângulo. • SDO_ORDINATES = (1,1, 5,7). Identificam as coordenadas lower-left e upper-right do retângulo.
Oracle Spatial – Tipos de Dados Espaciais • Comando SQL para o ex. do retângulo: INSERT INTO cola_markets VALUES( 1, 'cola_a', SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior) SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to -- define rectangle (lower left and upper right) with -- Cartesian-coordinate data ) );
Oracle Spatial – Tipos de Dados Espaciais • Ex2: Figure 2-3 Polygon with a Hole
Oracle Spatial – Tipos de Dados Espaciais • Para o Ex2 temos: • SDO_GTYPE = 2003. O 2 indica 2-dimensões, e o 3 indica um polígono. • SDO_SRID = NULL. • SDO_POINT = NULL. • SDO_ELEM_INFO = (1,1003,1, 19,2003,1). Há duas triplas: 1,1003,1 e 19,2003,1. • 1003 indica que o elementoé um exterior polygon ring; 2003 indica que elemento é um interior polygon ring. • 19 indica que a coordenada do segundo elemento (interior polygon ring) inicia na 19a. Posição do array SDO_ORDINATES array (isto é, 7, ou seja o primeiro ponto é 7,5). • SDO_ORDINATES = (2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5).
Oracle Spatial – Tipos de Dados Espaciais • Comando SQL para o EX2.: INSERT INTO cola_markets VALUES( 10, 'polygon_with_hole', SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- polygon with hole SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5) ) );
Oracle Spatial – Tipos de Dados Espaciais • Ex.3: Ponto • SDO_GEOMETRY: • SDO_GTYPE = 2001. O 2 indica 2-dimensões, e o 1 indica um único ponto. • SDO_SRID = NULL. • SDO_POINT = SDO_POINT_TYPE(12, 14, NULL). O atributo SDO_POINT é definedo usando o SDO_POINT_TYPE object type, porque esta é uma geometria de ponto. • SDO_ELEM_INFO e SDO_ORDINATES são ambos NULL.
Oracle Spatial – Tipos de Dados Espaciais • Comando SQL para o Ex.3: Ponto INSERT INTO cola_markets VALUES( 90, 'point_only', SDO_GEOMETRY( 2001, NULL, SDO_POINT_TYPE(12, 14, NULL), NULL, NULL));
Oracle Spatial – Metadados • Existem duas visões no esquema MDSYS: • USER_SDO_GEOM_METADATA contém metadata para todas as tabelas espaciais possuidas pelo esquema do usuário. Cada coluna espacial deve ter uma linha inserida nesta view. • ALL_SDO_GEOM_METADATA contém metadata para todas tabelas espaciais nas quais o usuário tem permissão SELECT. • Existem também metadados para index: USER_SDO_INDEX_METADATA e ALL_SDO_INDEX_INFO
Oracle Spatial – Metadados • A visão tem a seguinte estrutura: ( TABLE_NAME VARCHAR2(32), COLUMN_NAME VARCHAR2(32), DIMINFO SDO_DIM_ARRAY, SRID NUMBER );
Oracle Spatial – Metadados • TABLE_NAME: contém o nome da tabela • COLUMN_NAME: nome da coluna do tipo SDO_GEOMETRY • DIMINFO: é um array de tamanho variável de um object type, ordenado por dimension, e tem uma entrada para cada dimensão. • Definido da seguinte forma: Create Type SDO_DIM_ARRAY as VARRAY(4) of SDO_DIM_ELEMENT; Create Type SDO_DIM_ELEMENT as OBJECT ( SDO_DIMNAME VARCHAR2(64), SDO_LB NUMBER, SDO_UB NUMBER, SDO_TOLERANCE NUMBER); • SRID: Sistema de referência espacial
Oracle Spatial – Metadados • Exemplo: INSERT INTO USER_SDO_GEOM_METADATA VALUES ( 'cola_markets', 'shape', SDO_DIM_ARRAY( -- 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ), NULL -- SRID );
Oracle Spatial - Exemplos • Dos distritos de São Paulo, mostrados na fig ao lado CREATE TABLE DistritosSP ( cod NUMBER(32) NOT NULL , sigla VARCHAR2(20), denominacao VARCHAR2(200), spatial_data MDSYS.SDO_GEOMETRY, PRIMARY KEY (cod))
Oracle Spatial - Exemplos • Dos bairros de São Paulo, mostrados na fig ao lado. CREATE TABLE BairrosSP ( geom_id NUMBER(32) NOT NULL, bairro VARCHAR2(200), distr VARCHAR2(200), spatial_data MDSYS.SDO_GEOMETRY, PRIMARY KEY (geom_id))
Oracle Spatial - Exemplos • Do mapa de drenagem, mostrado na fig. ao lado. CREATE TABLE DrenagemSP ( geom_id NUMBER(32) NOT NULL, classe VARCHAR2(100) NULL, spatial_data MDSYS.SDO_GEOMETRY, PRIMARY KEY (geom_id))
Oracle Spatial - Exemplos • Inserindo dados: INSERT INTO DistritosSP (cod, sigla, denominacao, spatial_data) VALUES (1, 'VMR', 'VILA MARIA' MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 1 ), MDSYS.SDO_ORDINATE_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10))) OBS.: Num polígono o primeiro ponto é igual ao último
Oracle Spatial - Exemplos • INSERT INTO DrenagemSP ( geom_id, classe, spatial_data) VALUES (1, 'RIO', MDSYS.SDO_GEOMETRY(2002, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY( 1, 2, 1 ), MDSYS.SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10))) • INSERT INTO BairrosSP ( geom_id, bairro, distr, spatial_data) VALUES ( 1, 'JARDIM SHANGRILA', 'GRAJAU' MDSYS.SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(32.628, 736.944, NULL ), NULL, NULL))
Oracle Spatial - Exemplos • Após criar e inserir os dados em uma tabela espacial, o usuário deve registrar seu metadado. INSERT INTO USER_SDO_GEOM_METADATA VALUES ( 'DistritosSP' ,'spatial_data' , MDSYS.SDO_DIM_ARRAY( MDSYS.SDO_DIM_ELEMENT('X',275.9670,429.567,0.0005), MDSYS.SDO_DIM_ELEMENT('Y',833.0355,582.15,0.0005)), NULL)
Oracle Spatial - Exemplos • Criando índices (RTREE): CREATE INDEX index_name ON table_name (spatial_column_name) INDEXTYPE IS MDSYS.SPATIAL_INDEX; Exemplo: CREATE INDEX DistritosSP_IDX ON DistritosSP(SPATIAL_DATA) INDEXTYPE IS MDSYS.SPATIAL_INDEX
Oracle Spatial - Consultas • O Oracle Spatial utiliza um modelo de consulta baseado em duas etapas, chamadas de primeiro e segundo filtro. • O primeiro filtro considera as aproximações das geometrias, pelo critério do mínimo retângulo envolvente (MBR), para reduzir a complexidade computacional. Este filtro é de baixo custo computacional e seleciona um subconjunto menor de geometrias candidatas, que será passado para o segundo filtro. • O segundo filtro trabalha com as geometrias exatas, por isso é computacionalmente mais caro e só é aplicado ao subconjunto resultante do primeiro filtro. Retorna o resultado exato da consulta.
Oracle Spatial - Consultas • Principais operadores: • SDO_FILTER: Implementa o primeiro filtro do modelo de consulta, ou seja, verifica se os mínimos retângulos envolventes das geometrias têm alguma interação entre si. Sintaxe: SDO_FILTER (geometry1 SDO_GEOMETRY,geometry2 SDO_GEOMETRY) • SDO_RELATE Avalia se as geometrias possuem uma determinada relação topológica. Sintaxe: SDO_RELATE (geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY,param VARCHAR2). Param pode serEQUAL, DISJOINT, TOUCH, INSIDE, COVERS, COVERREDBY, OVERLAPBDYINTERSECT, ON, CONTAINS, OVERLAPBDYDISJOINT e ANYINTERACT • SDO_WITHIN_DISTANCE: Verifica se duas geometrias estão dentro de uma determinada distância. Sintaxe: SDO_WITHIN_DISTANCE (geometry1 SDO_GEOMETRY, aGeom SDO_GEOMETRY,params VARCHAR2); • SDO_NN: Identifica os n vizinhos mais próximos de uma • Geometria. Sintaxe: SDO_NN (geometry1 SDO_GEOMETRY, • aGeom SDO_GEOMETRY, param VARCHAR2, [, number NUMBER]);
Oracle Spatial - Consultas • As funções fornecidas pelo Spatial podem ser agrupadas em: • Relação (verdadeiro/falso) entre duas geometrias: RELATE e WITHIN_DISTANCE. • Validação: VALIDATE_GEOMETRY_WITH_CONTEXT, VALIDATE_LAYER_WITH_CONTEXT. • Operações sobre uma geometria: SDO_ARC_DENSIFY, SDO_AREA, SDO_BUFFER, SDO_CENTROID, SDO_CONVEXHULL, SDO_LENGTH, SDO_MAX_MBR_ORDINATE, SDO_MIN_MBR_ORDINATE, SDO_MBR, SDO_POINTONSURFACE. • Operações sobre duas geometrias: SDO_DISTANCE, SDO_DIFFERENCE, SDO_INTERSECTION, SDO_UNION, SDO_XOR.
Oracle Spatial - Consultas • Consulta 1: Recuperar o nome de todos os municípios da grande São Paulo que são vizinhos ao município de São Paulo. SELECT t1.nomemunicp FROM MunicipiosSP t1, MunicipiosSP t2 WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data, 'mask=TOUCH') = 'TRUE' AND t2.nomemunicp = 'SAO PAULO' Ou, usando o operador TOUCH diretamente: SELECT t1.nomemunicp FROM MunicipiosSP t1, MunicipiosSP t2 WHERE SDO_TOUCH (t1.spatial_data, t2.spatial_data) = 'TRUE' AND t2.nomemunicp = 'SAO PAULO'
Oracle Spatial - Consultas • Consulta 2: Recuperar o nome de todos os municípios da grande São Paulo que são vizinhos ao distrito Anhanguera da cidade de São Paulo SELECT t1.nomemunicp FROM MunicipiosSP t1, DistritosSP t2 WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data, 'mask= TOUCH') = 'TRUE' AND t2.denominacao = 'ANHANGUERA' Ou usando TOUCH: SELECT t1.nomemunicp FROM MunicipiosSP t1, DistritosSP t2 WHERE SDO_TOUCH (t1.spatial_data, t2.spatial_data) = 'TRUE' AND t2.denominacao = 'ANHANGUERA'
Oracle Spatial - Consultas • Consulta 3:Recuperar o número de bairros contidos no distrito Grajaú SELECT COUNT(*) FROM BairrosSP t1, DistritosSP t2 WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data, 'mask=INSIDE') = 'TRUE' AND t2.denominacao = 'GRAJAU' Ou usando SDO_INSIDE: SELECT COUNT(*) FROM BairrosSP t1, DistritosSP t2 WHERE SDO_INSIDE (t1.spatial_data, t2.spatial_data) = 'TRUE' AND t2.denominacao = 'GRAJAU'
Oracle Spatial - Consultas • Consulta 4: Recuperar todos os distritos que estão num raio de 3km de um determinado rio SELECT t1.denominacao FROM DistritosSP t1, DreanagemSP t2, user_sdo_geom_metadata m WHERE SDO_RELATE (t1.spatial_data, SDO_GEOM.SDO_BUFFER(t2.spatial_data, m.diminfo, 3000), 'mask=INSIDE+TOUCH+ OVERLAPBDYINTERSECT') = 'TRUE' AND m.table_name = ' DreanagemSP ' AND m.column_name = 'spatial_data' AND t2.geom_id = 55
Oracle Spatial - Consultas • Consulta 5: Recuperar todos os bairros que estejam a menos de 3 Km do bairro Boacava SELECT t1.BAIRRO FROM BairrosSP t1, BairrosSP t2 WHERE SDO_GEOM.SDO_DISTANCE (t1.spatial_data, t2.spatial_data, 0.00005) < 3000 AND t2.bairro = 'BOACAVA'
Oracle Spatial – Outras Características • GeoRaster: para lidar com dados raster • GeoCoding: endereçamento reverso • Spatial Topology and Network • Spatial Analysis and Mining
PostGIS-PostgreSQL • PostGIS é uma extensão espacial para o PostgreSQL que implementa a especificação padrão OGC • Tipos de dados PostGIS:
PostGIS-PostgreSQL • Esses tipos possuem a seguinte representação textual: • Point: (0 0 0) • LineString: (0 0, 1 1, 2 2) • Polygon: ((0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0), ( 1 0 0, ...), ...) • MultiPoint: (0 0 0, 4 4 0) • MultiLineString: ((0 0 0, 1 1 0, 2 2 0), (4 4 0, 5 5 0, 6 6 0)) • MultiPolygon: (((0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0), (...), ...), ...) • GeometryCollection: (POINT(2 2 0), LINESTRING((4 4 0, 9 9 0))
PostGIS-PostgreSQL Dos distritos de São Paulo, CREATE TABLE distritossp ( cod SERIAL, sigla VARCHAR(10), denominacao VARCHAR(50), PRIMARY KEY (cod) ); SELECT AddGeometryColumn(‘BDEspacial', 'distritossp', 'spatial_data', -1, 'POLYGON', 2);
PostGIS-PostgreSQL • Adicione uma coluna espacial à tabela usando a função OpenGIS "AddGeometryColumn". • A sintaxe é: AddGeometryColumn(<schema_name>, <table_name>, <column_name>, <srid>, <type>,<dimension>) • Ou, usando o esquema corrente: AddGeometryColumn(<table_name>, <column_name>, <srid>, <type>,<dimension>) • Exemplo1: SELECT AddGeometryColumn(’public’, ’roads_geom’, ’geom’, 423, ’LINESTRING’, 2) • Exemplo2: SELECT AddGeometryColumn( ’roads_geom’, ’geom’, 423, ’LINESTRING’, 2)
PostGIS-PostgreSQL • Dos bairros de São Paulo CREATE TABLE bairrossp ( cod SERIAL, bairro VARCHAR(40), distr VARCHAR(40), PRIMARY KEY (cod)); SELECT AddGeometryColumn(‘BDEspacial', 'bairrossp', 'spatial_data', -1, 'POINT', 2);
PostGIS-PostgreSQL • Do mapa de drenagem CREATE TABLE drenagemsp ( cod SERIAL, classe VARCHAR(255) NULL, PRIMARY KEY (cod) ); SELECT AddGeometryColumn(‘BDEspacial', 'drenagemsp', 'spatial_data', -1, 'LINESTRING', 2);
PostGIS-PostgreSQL • Tabela de metadados
The Well-Known Text representation of the Spatial Reference System. An example of a WKTnSRS representation is: PROJCS["NAD83 / UTM Zone 10N", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.257222101] ], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433] ], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-123], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1] ]
PostGIS-PostgreSQL • Tabela de metadados Geometry_Columns
PostGIS-PostgreSQL – Inserção de Dados INSERT INTO bairrossp (bairro, spatial_data) VALUES('JARDIM DOS EUCALIPTOS', GeometryFromText('POINT(321588.628426 7351166.969244)', -1)); INSERT INTO drenagemsp (classe, spatial_data)VALUES('RIOS', GeometryFromText('LINESTRING(344467.895137 7401824.476217, 344481.584686 7401824.518728, 344492.194756 7401825.716359, …)’, -1)); INSERT INTO distritossp (denominacao, sigla, spatial_data) VALUES('MARSILAC', ‘MAR’, GeometryFromText('POLYGON((335589.530575 7356020.721956, 335773.784959 7355873.470174, …))', -1));
PostGIS-PostgreSQL – Inserção de Dados Carregando dados de um Shapefile: # shp2pgsql shaperoads myschema.roadstable | psql -d roadsdb
PostGIS-PostgreSQL – Index • Sintaxe: CREATE INDEX sp_idx_name ON nome_tabela USING GIST (coluna_geometrica GIST_GEOMETRY_OPS); • Exemplos: CREATE INDEX sp_idx_bairros ON bairrossp USING GIST (SPATIAL_DATA GIST_GEOMETRY_OPS) CREATE INDEX sp_idx_bairros ON distritossp USING GIST (SPATIAL_DATA GIST_GEOMETRY_OPS)