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 – Operações 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
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 -- Cartesiancoordinate 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)

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);

PostGIS-PostgreSQL –
Consultas

Operadores topológicos conforme a Matriz de 9Interseçõ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.
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)
PostGIS-PostgreSQL –
Consultas

Operadores Métricos:



Centróide de geometrias:


distance(geometry,geometry)
area(geometry)
Centroid(geometry)
•Validação (verifica se a geometria possui autointerseções):

isSimple(geometry)
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');

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');

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');

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';

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;

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;

Oracle Spatial - Consultas
Download

Banco de Dados Espaciais