banco de dados espaciais

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

Upload: kert

Post on 11-Jan-2016

27 views

Category:

Documents


0 download

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

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