Upload
jesse-melo-vieira
View
109
Download
2
Embed Size (px)
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]
Tópicos da Aula
� Tipos de Dados Espaciais
� Operadores Espaciais
� Indexação Espacial� Indexação Espacial
� Consultas Espaciais
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
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
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 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
FROMdistritossp;
SELECT sigla, denominacao, ASTEXT(spatial_data)FROMdistritossp;
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)
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)
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
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
FROMpolygons4 p1, polygons4 p2
WHEREtouches(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
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')
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';
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';
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';
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';
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
11
13
x1 3 5 7 9 11 13 15 17 19 21
1
3
5
7
9
L1
L2
L3L4
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
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 ?!!).
FIM