24
Banco de Dados Geográficos Agosto, 2006 Geográficos PostGIS Disponível em http://www.dpi.inpe.br/cursos/ser303 Gilberto Ribeiro de Queiroz – [email protected] Gilberto Câmara – [email protected] Karine Reis Ferreira – [email protected]

Slides Postgis

Embed Size (px)

Citation preview

Page 1: Slides Postgis

Banco de Dados Geográficos

Agosto, 2006

Geográficos

PostGIS

Disponível em http://www.dpi.inpe.br/cursos/ser303

Gilberto Ribeiro de Queiroz – [email protected] Câmara – [email protected] Reis Ferreira – [email protected]

Page 2: Slides Postgis

Tópicos da Aula

� Tipos de Dados Espaciais

� Operadores Espaciais

� Indexação Espacial� Indexação Espacial

� Consultas Espaciais

Page 3: Slides Postgis

PostGIS

� Extensão do SGBD PostgreSQL� Tipos de dados espaciais� Operadores Espaciais� Índice Espacial

� Segue a especificaçãoproposta na SFS-SQL

GEOMETRY

POINT

LINESTRING

POLYGON

GEOMETRYCOLLECTION

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

GEOMETRY

POINT

LINESTRING

POLYGON

GEOMETRYCOLLECTION

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

Page 4: Slides Postgis

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), (...), ...), ...)� 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

LINESTRING

POLYGON

GEOMETRYCOLLECTION

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

GEOMETRY

POINT

LINESTRING

POLYGON

GEOMETRYCOLLECTION

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

Page 5: Slides Postgis

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

Page 6: Slides Postgis

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 GeometryFromText('Polygon((0 0, 10 0, 10 10, 0 10, 0 0), (5 5, 5 6, 6 6, 6 5, 5 5))', -1));

Page 7: Slides Postgis

PostGIS – Tipos de Dados Espaciais

� Recuperando dados em tabelas com tipos de dados espaciais:SELECT sigla, denominacao, spatial_data

FROMdistritossp;

SELECT sigla, denominacao, ASTEXT(spatial_data)FROMdistritossp;

Page 8: Slides Postgis

PostGIS – Metadados

� Sistema de Coordenadas:

spatial_ref_sys

Attribute Type Modifier

srid INTEGER PKsrid INTEGER PK

auth_name VARCHAR(256)

auth_srid INTEGER

srtext VARCHAR(2048)

proj4text VARCHAR(2048)

Page 9: Slides Postgis

PostGIS – Metadados

� Tabelas e colunas com tipos espaciais:

geometry_columns

Attribute Type Modifier

f_table_catalog VARCHAR(256) PKf_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)

Page 10: Slides Postgis

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

R-Tree

2

3

4

5

6

7

8

9

10

11

13

12

114

a

b

c

d

R

*SET ENABLE_SEQSCAN=OFF

Page 11: Slides Postgis

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;

Page 12: Slides Postgis

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)

Page 13: Slides Postgis

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

Page 14: Slides Postgis

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

FROMpolygons4 p1, polygons4 p2

WHEREtouches(p1.spatial_data, p2.spatial_data)

AND (p2.object_id <> '3550308')

AND (p1.object_id = '3550308')

3550308

Page 15: Slides Postgis

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

FROMpolygons4 p1, polygons4 p2

3550308

WHEREtouches(p1.spatial_data, p2.spatial_data)

AND (p1.spatial_data && p2.spatial_data)

AND (p2.object_id <> '3550308')

AND (p1.object_id = '3550308')

Page 16: Slides Postgis

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

FROMpoints5 pt, polygons4 pol

WHEREcontains(pol.spatial_data, pt.spatial_data)

AND pol.object_id = '5108501';

Page 17: Slides Postgis

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

FROMpoints5 pt, polygons4 pol

WHEREcontains(pol.spatial_data, pt.spatial_data)

AND (pol.spatial_data && pt.spatial_data)

AND pol.object_id = '5108501';

Page 18: Slides Postgis

Cenário 3:Usando Operadores Métricos

� “Recuperar os focos de queimadas (points5) que estejam a menos de 3Km do bairro Boacava”.

SELECT pt1.*

FROMpoints5 pt1,

points5 pt2

WHERE ( distance(pt1.spatial_data, pt2.spatial_data)

< 0.135)

AND pt2.object_id <> '33819'

AND pt1.object_id = '33819';

Page 19: Slides Postgis

Cenário 3:Usando Operadores Métricos

� “Recuperar os focos de queimadas (points5) que estejam a menos de 3Km do bairro Boacava”.

SELECT pt1.*

FROMpoints5 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';

Page 20: Slides Postgis

Cenário 3:Usando Operadores Métricos

� Aplicar a consulta anterior na tabela points7 ao objeto:� 0000000000000000400844

Page 21: Slides Postgis

PostGIS – Exercícios

� Criar uma tabela chamada “login_ft_lotes” para armazenar informações a respeito dos lotes abaixo:

y

11

13

x1 3 5 7 9 11 13 15 17 19 21

1

3

5

7

9

L1

L2

L3L4

Page 22: Slides Postgis

PostGIS – Exercícios

� Criar uma tabela chamada “login_ft_quadras” para armazenar informações a respeito das quadras abaixo:

y

11

13

x1 3 5 7 9 11 13 15 17 19 21

1

3

5

7

9

Q1

Q2

Page 23: Slides Postgis

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

Page 24: Slides Postgis

FIM