Você está na página 1de 24

Agosto, 2006

Banco de Dados
Geográficos

PostGIS
Gilberto Ribeiro de Queiroz – gribeiro@dpi.inpe.br
Gilberto Câmara – gilberto@dpi.inpe.br
Karine Reis Ferreira – karine@dpi.inpe.br

Disponível em http://www.dpi.inpe.br/cursos/ser303
Tópicos da Aula

 Tipos de Dados Espaciais

 Operadores Espaciais

 Indexação Espacial

 Consultas Espaciais
PostGIS

 Extensão do SGBD PostgreSQL


 Tipos de dados espaciais
 Operadores Espaciais
 Índice Espacial

 Segue a especificação GEOMETRY

proposta na SFS-SQL
POINT GEOMETRYCOLLECTION

LINESTRING MULTIPOINT

POLYGON MULTILINESTRING

MULTIPOLYGON
PostGIS – Tipos de Dados Espaciais

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

POINT GEOMETRYCOLLECTION

LINESTRING MULTIPOINT

POLYGON MULTILINESTRING

MULTIPOLYGON
PostGIS – Tipos de Dados Espaciais

 Criação de Tabelas com tipos de dados espaciais:


CREATE TABLE distritossp
( cod SERIAL,
sigla VARCHAR(10),
denominacao VARCHAR(50),
PRIMARY KEY (cod)
);

SELECT AddGeometryColumn('terralibdb',
'distritossp', 'spatial_data', -1, 'POLYGON',
2);
PostGIS – Tipos de Dados Espaciais

 Inserindo dados em tabelas com tipos de dados


espaciais:
INSERT INTO distritossp
(sigla, denominacao, spatial_data)
VALUES('CTR', 'Centro',
GeometryFromText('Polygon((0 0, 10 0, 10 10, 0
10, 0 0), (5 5, 5 6, 6 6, 6 5, 5 5))', -1));
PostGIS – Tipos de Dados Espaciais

 Recuperando dados em tabelas com tipos de dados


espaciais:
SELECT sigla, denominacao, spatial_data
FROM distritossp;

SELECT sigla, denominacao, ASTEXT(spatial_data)


FROM distritossp;
PostGIS – Metadados

 Sistema de Coordenadas:
spatial_ref_sys

Attribute Type Modifier

srid INTEGER PK

auth_name VARCHAR(256)

auth_srid INTEGER

srtext VARCHAR(2048)

proj4text VARCHAR(2048)
PostGIS – Metadados

 Tabelas e colunas com tipos espaciais:

geometry_columns

Attribute Type Modifier

f_table_catalog VARCHAR(256) PK

f_table_schema VARCHAR(256) PK

f_table_name VARCHAR(256) PK

f_geometry_column VARCHAR(256) PK

coord_dimension INTEGER

srid INTEGER FK

type VARCHAR(30)
PostGIS – Indexação Espacial

 Podemos utilizar uma R-Tree implementada no topo do


mecanismo GiST para os tipos de dados espaciais:

CREATE INDEX sp_idx_name ON distritossp


USING GIST (spatial_data GIST_GEOMETRY_OPS);
1
1 5
1 1 d
4
8
2 6
12

a c 13

3 9

10
7

4 b
R

R-Tree

*SET ENABLE_SEQSCAN=OFF
PostGIS – Indexação Espacial

 Exploração dos índices:


 Em predicados que envolvam operadores espaciais;

 Ex: consulta por janela

 Operador: &&

 SELECT COUNT(*)
FROM TABELA_POLIGONOS
WHERE 'BOX3D(375421.967006 7337341.000355,
438164.882699 7435582.150681)'::box3d &&
spatial_data;
PostGIS – Consultas Espaciais

 Operadores Topológicos:
 equals(geometry, geometry)
 disjoint(geometry, geometry)
 intersects(geometry, geometry)
 touches(geometry, geometry)
 crosses(geometry, geometry)
 within(geometry, geometry)
 overlaps(geometry, geometry)
 contains(geometry, geometry)
PostGIS – Consultas Espaciais

 Operadores Conjunto:
 intersection(geometry, geometry):geometry
 geomUnion(geometry, geometry):geometry
 symdifference(geometry, geometry):geometry
 difference(geometry, geometry):geometry

 Operadores Métricos:
 distance(geometry,geometry):double
 area(geometry):double
Cenário 1:
Usando Operadores Topológicos
 “Recuperar o identificador dos objetos que são vizinhos
ao objeto 3550308” na tabela polygons4.

SELECT p2.object_id
FROM polygons4 p1, polygons4 p2
WHERE touches(p1.spatial_data, p2.spatial_data)
AND (p2.object_id <> '3550308')
AND (p1.object_id = '3550308')
3550308
Cenário 1:
Usando Operadores Topológicos
 “Recuperar o identificador dos objetos que são vizinhos
ao objeto 3550308” na tabela polygons4.

SELECT p2.object_id
FROM polygons4 p1, polygons4 p2
WHERE touches(p1.spatial_data, p2.spatial_data)
AND (p1.spatial_data && p2.spatial_data)
AND (p2.object_id <> '3550308')
AND (p1.object_id = '3550308') 3550308
Cenário 2:
Usando Operadores Topológicos
 “Recuperar o número de focos de queimadas (tabela
points5) ocorridos no município 3550308 (tabela
polygons4)”

SELECT COUNT(*)
FROM points5 pt, polygons4 pol
WHERE contains(pol.spatial_data, pt.spatial_data)
AND pol.object_id = '5108501';
Cenário 2:
Usando Operadores Topológicos
 “Recuperar o número de focos de queimadas (tabela
points5) ocorridos no município 3550308 (tabela
polygons4)”

SELECT COUNT(*)
FROM points5 pt, polygons4 pol
WHERE contains(pol.spatial_data, pt.spatial_data)
AND (pol.spatial_data && pt.spatial_data)
AND pol.object_id = '5108501';
Cenário 3:
Usando Operadores Métricos
 “Recuperar os focos de queimadas (points5) que
estejam a menos de 3Km do bairro Boacava”.

SELECT pt1.*
FROM points5 pt1,
points5 pt2
WHERE (distance(pt1.spatial_data, pt2.spatial_data)
< 0.135)
AND pt2.object_id <> '33819'
AND pt1.object_id = '33819';
Cenário 3:
Usando Operadores Métricos
 “Recuperar os focos de queimadas (points5) que
estejam a menos de 3Km do bairro Boacava”.

SELECT pt1.*
FROM points5 pt1,
points5 pt2
WHERE (distance(pt1.spatial_data, pt2.spatial_data)
< 0.135)
AND (expand(pt1.spatial_data, 0.135) &&
pt2.spatial_data)
AND pt2.object_id <> '33819'
AND pt1.object_id = '33819';
Cenário 3:
Usando Operadores Métricos
 Aplicar a consulta anterior na tabela points7 ao objeto:
 0000000000000000400844
PostGIS – Exercícios
 Criar uma tabela chamada “login_ft_lotes” para
armazenar informações a respeito dos lotes abaixo:
y
13

11

L4
7 L3

L2
5
L1
3

1
x
1 3 5 7 9 11 13 15 17 19 21
PostGIS – Exercícios
 Criar uma tabela chamada “login_ft_quadras” para
armazenar informações a respeito das quadras abaixo:
y
13

11

7 Q2

Q1
5

1
x
1 3 5 7 9 11 13 15 17 19 21
PostGIS – Exercícios
 Quais os lotes vizinhos ao lote L2 ?

 Quantos lotes estão dentro da quadra Q1?

 Uma pessoa resolveu comprar todos os lotes da quadra Q1. Criar


uma nova geometria L4 que represente toda a área dos lotes
originais.

 Criar uma única tabela para armazenar os lotes e as quadras


(login_ft_quadras_lotes), além do identificador, deverá haver um
tipo do objeto, além disso, as geometrias não podem ter
“sobreposição” (ou seja a área da quadra não deve estar
sobreposta com a do lote ?!!).
FIM

Você também pode gostar