Escolar Documentos
Profissional Documentos
Cultura Documentos
Slides Postgis
Slides Postgis
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
Operadores Espaciais
Indexação Espacial
Consultas Espaciais
PostGIS
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
SELECT AddGeometryColumn('terralibdb',
'distritossp', 'spatial_data', -1, 'POLYGON',
2);
PostGIS – Tipos de Dados Espaciais
Sistema de Coordenadas:
spatial_ref_sys
srid INTEGER PK
auth_name VARCHAR(256)
auth_srid INTEGER
srtext VARCHAR(2048)
proj4text VARCHAR(2048)
PostGIS – Metadados
geometry_columns
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
a c 13
3 9
10
7
4 b
R
R-Tree
*SET ENABLE_SEQSCAN=OFF
PostGIS – Indexação Espacial
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 ?