Banco de Dados Espaciais

61
Banco de Dados Espaciais Sistema de Informações Geográficas 2006.2 Prof. Cláudio Baptista

description

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. - PowerPoint PPT Presentation

Transcript of Banco de Dados Espaciais

Page 1: Banco de Dados Espaciais

Banco de Dados Espaciais

Sistema de Informações Geográficas

2006.2

Prof. Cláudio Baptista

Page 2: Banco de Dados Espaciais

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

Page 3: Banco de Dados Espaciais

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

Page 4: Banco de Dados Espaciais

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.

Page 5: Banco de Dados Espaciais

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

Page 6: Banco de Dados Espaciais

Oracle Spatial – Operações Espaciais

Page 7: Banco de Dados Espaciais

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

Page 8: Banco de Dados Espaciais

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

Page 9: Banco de Dados Espaciais

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

Page 10: Banco de Dados Espaciais

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

Page 11: Banco de Dados Espaciais

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

Page 12: Banco de Dados Espaciais

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.

Page 13: Banco de Dados Espaciais

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

Page 14: Banco de Dados Espaciais

Oracle Spatial – Tipos de Dados Espaciais Ex2: Figure 2-3 Polygon with a Hole

                                             

Page 15: Banco de Dados Espaciais

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

Page 16: Banco de Dados Espaciais

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

Page 17: Banco de Dados Espaciais

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.

Page 18: Banco de Dados Espaciais

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

Page 19: Banco de Dados Espaciais

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

Page 20: Banco de Dados Espaciais

Oracle Spatial – Metadados

A visão tem a seguinte estrutura:

(

TABLE_NAME VARCHAR2(32),

COLUMN_NAME VARCHAR2(32),

DIMINFO SDO_DIM_ARRAY,

SRID NUMBER

);

Page 21: Banco de Dados Espaciais

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

Page 22: Banco de Dados Espaciais

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

Page 23: Banco de Dados Espaciais

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

Page 24: Banco de Dados Espaciais

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

Page 25: Banco de Dados Espaciais

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

Page 26: Banco de Dados Espaciais

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

Page 27: Banco de Dados Espaciais

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

Page 28: Banco de Dados Espaciais

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)

Page 29: Banco de Dados Espaciais

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

Page 30: Banco de Dados Espaciais

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.

Page 31: Banco de Dados Espaciais

Oracle Spatial - ConsultasPrincipais 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 umaGeometria. Sintaxe: SDO_NN (geometry1 SDO_GEOMETRY, aGeom SDO_GEOMETRY, param VARCHAR2, [, number NUMBER]);

Page 32: Banco de Dados Espaciais

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.

Page 33: Banco de Dados Espaciais

Oracle Spatial - Consultas

Consulta 1: Recuperar o nome de todos os municípios da grande SãoPaulo que são vizinhos ao município de São Paulo.

SELECT t1.nomemunicpFROM MunicipiosSP t1, MunicipiosSP t2WHERE SDO_RELATE (t1.spatial_data,t2.spatial_data, 'mask=TOUCH') = 'TRUE'AND t2.nomemunicp = 'SAO PAULO'

Ou, usando o operador TOUCH diretamente:SELECT t1.nomemunicpFROM MunicipiosSP t1, MunicipiosSP t2WHERESDO_TOUCH (t1.spatial_data, t2.spatial_data) ='TRUE' AND t2.nomemunicp = 'SAO PAULO'

Page 34: Banco de Dados Espaciais

Oracle Spatial - Consultas

Consulta 2: Recuperar o nome de todos os municípios da grande SãoPaulo que são vizinhos ao distrito Anhanguera da cidade de São Paulo

SELECT t1.nomemunicpFROM MunicipiosSP t1, DistritosSP t2WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data,'mask= TOUCH') = 'TRUE'AND t2.denominacao = 'ANHANGUERA'

Ou usando TOUCH:SELECT t1.nomemunicpFROM MunicipiosSP t1, DistritosSP t2WHERE SDO_TOUCH (t1.spatial_data, t2.spatial_data) = 'TRUE'AND t2.denominacao = 'ANHANGUERA'

Page 35: Banco de Dados Espaciais

Oracle Spatial - Consultas

Consulta 3:Recuperar o número de bairros contidos no distritoGrajaú

SELECT COUNT(*)FROM BairrosSP t1, DistritosSP t2WHERE 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 t2WHERE SDO_INSIDE (t1.spatial_data, t2.spatial_data) ='TRUE' AND t2.denominacao = 'GRAJAU'

Page 36: Banco de Dados Espaciais

Oracle Spatial - Consultas

Consulta 4: Recuperar todos os distritos que estão num raio de 3km de um determinado rio

SELECT t1.denominacaoFROM DistritosSP t1, DreanagemSP t2,user_sdo_geom_metadata mWHERE 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

Page 37: Banco de Dados Espaciais

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'

Page 38: Banco de Dados Espaciais

Oracle Spatial – Outras Características GeoRaster: para lidar com dados raster GeoCoding: endereçamento reverso Spatial Topology and Network Spatial Analysis and Mining

Page 39: Banco de Dados Espaciais

PostGIS-PostgreSQL

PostGIS é uma extensão espacial para o PostgreSQL que implementa a especificação padrão OGC

Tipos de dados PostGIS:

Page 40: Banco de Dados Espaciais

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

Page 41: Banco de Dados Espaciais

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

Page 42: Banco de Dados Espaciais

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)

Page 43: Banco de Dados Espaciais

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

Page 44: Banco de Dados Espaciais

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

Page 45: Banco de Dados Espaciais

PostGIS-PostgreSQL

Tabela de metadados

Page 46: Banco de Dados Espaciais

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]]

Page 47: Banco de Dados Espaciais

PostGIS-PostgreSQL

Tabela de metadados Geometry_Columns

Page 48: Banco de Dados Espaciais

PostGIS-PostgreSQL – Inserção de DadosINSERT 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));

Page 49: Banco de Dados Espaciais

PostGIS-PostgreSQL – Inserção de DadosCarregando dados de um Shapefile:

# shp2pgsql shaperoads myschema.roadstable | psql -d roadsdb

Page 50: Banco de Dados Espaciais

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)

Page 51: Banco de Dados Espaciais

PostGIS-PostgreSQL – Index

Forçando o uso do index numa consulta através do operador &&::

SELECT * FROM grande_sp

WHERE 'BOX3D(438164.882699 7435582.150681,

275421.967006 7337341.000355)'::box3d

&& spatial_data);

Page 52: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Operadores topológicos conforme a Matriz de 9-

Interseções : equals(geometry, geometry) disjoint(geometry, geometry) intersects(geometry, geometry) touches(geometry, geometry) crosses(geometry, geometry) within(geometry, geometry) overlaps(geometry, geometry) contains(geometry, geometry) relate(geometry, geometry):

retornam a matriz de intersecção.

Page 53: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Operador de construção de mapas de distância:

buffer(geometry, double, [integer]) Operador para construção do Fecho Convexo:

convexhull(geometry) Operadores de conjunto:

intersection(geometry, geometry) geomUnion(geometry, geometry) difference(geometry, geometry)

Page 54: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Operadores Métricos:

distance(geometry,geometry) area(geometry)

Centróide de geometrias: Centroid(geometry)

•Validação (verifica se a geometria possui auto-interseções): isSimple(geometry)

Page 55: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Consulta 1:

SELECT d2.nomemunicp

FROM grande_sp d1, grande_sp d2

WHERE touches(d1.spatial_data, d2.spatial_data)

AND (d2.nomemunicp <> 'SAO PAULO')

AND (d1.nomemunicp = 'SAO PAULO');

Page 56: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Consulta 1: Usando o índice espacial

SELECT d2.nomemunicp

FROM distritossp d1, distritossp d2

WHERE touches(d1.spatial_data, d2.spatial_data)

AND (d2.nomemunicp <> 'SAO PAULO')

AND (d1.spatial_data && d2.spatial_data)

AND (d1.nomemunicp = 'SAO PAULO');

Page 57: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Consulta 2:

SELECT grande_sp.nomemunicp

FROM distritossp, grande_sp

WHERE touches(distritossp.spatial_data,

grande_sp.spatial_data)

AND (distritossp.spatial_data &&

grande_sp.spatial_data)

AND (distritossp.denominacao = 'ANHANGUERA');

Page 58: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Consulta 3:

SELECT COUNT(*)

FROM bairrossp pt, distritossp pol

WHERE contains(pol.spatial_data, pt.spatial_data)

AND (pol.spatial_data && pt.spatial_data)

AND pol.denominacao = 'GRAJAU';

Page 59: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Consulta 4:

SELECT grande_sp.nomemunicp

FROM grande_sp, drenagemsp

WHERE intersects(buffer(drenagemsp.spatial_data, 3000), grande_sp.spatial_data)

AND drenagemsp.cod = 59;

Page 60: Banco de Dados Espaciais

PostGIS-PostgreSQL – Consultas Consulta 5:

SELECT b1.bairro

FROM bairrossp b1, bairrossp b2

WHERE (distance(b1.spatial_data, b2.spatial_data)

< 3000)

AND b1.bairro <> 'BOACAVA'

AND b2.bairro = 'BOACAVA' order by b1.bairro;

Page 61: Banco de Dados Espaciais

Oracle Spatial - Consultas