Aula Postgis
Aula Postgis
Aula Postgis
BD Geogrficos
Valria Times
vct@cin.ufpe.br
Introduo ao PostGIS
O que PostGIS?
Um novo tipo de dado
Geometry
Mecanismo
de
indexao
p/
consultas
espaciais
2
Introduo ao PostGIS
PostGIS: Uma extenso Geo para o PostgreSQL
Download
http://postgis.refractions.net/download/
Diretrios
Windows Program
Files\PostgreSQL\8.1\share\contrib
UNIX
src/contrib/
Introduo ao PostGIS
PostGIS: Uma extenso Geo para o PostgreSQL
Manual
http://postgis.refractions.net/docs/
Introduo ao PostGIS
Criando um BD espacial
Introduo ao PostGIS
Criando um BD espacial
Introduo ao PostGIS
PostGIS segue o padro OpenGIS
Prov suporte para todos objetos e funes
da especificao
SQL)
POINT
GEOMETRYCOLLECTION
LINESTRING
MULTIPOINT
POLYGON
MULTILINESTRING
Fonte: INPE
MULTIPOLYGON
Introduo ao PostGIS
Formatos WKB e WKT do OpenGIS
Duas
formas
padres
para
manipular
Objetos Geogrficos
Well-Known Text (WKT) e
Well-Known Binary (WKB)
Guardam informaes sobre o tipo e as
coordenadas do ObjetoGeo
Introduo ao PostGIS
Formatos WKB e WKT do OpenGIS
Exemplos:
POINT(0 0)
LINESTRING(0 0,1 1,1 2)
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT(0 0,1 2)
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)),
((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4)))
Introduo ao PostGIS
SRID (Spatial Referencing System Identifier)
Todo Objeto Geogrfico deve ter um SRID
para ser inserido no BDGeo
Por exemplo:
Considerando a interface GeomFromText
GeomFromText (text WKT, SRID);
INTO
SpatialTable
VALUES
(THE_GEOM,
(GeomFromText('POINT(-
Introduo ao PostGIS
Funes de Sada:
text WKT = ST_AsText(geometry)
bytea WKB = ST_AsBinary(geometry)
Funes de Entrada:
geometry
GeomFromWKB(bytea
WKB,
SRID);
geometry = GeomFromText(text WKT, SRID);
11
Introduo ao PostGIS
A especificao SFS/OpenGIS define tipos,
funes
metadados
para
manipular
ObjetosGeo
As principais tabelas de metadados do OGC
so:
SPATIAL_REF_SYS guarda os IDs e as
descries
textuais
do
sistema
de
guarda
Introduo ao PostGIS
TABLE SPATIAL_REF_SYS (
SRID INTEGER NOT NULL PRIMARY KEY, // identificador do SRS
AUTH_NAME VARCHAR(256),
o SRS
AUTH_SRID INTEGER,
autoridade
SRTEXT VARCHAR(2048), // representao WKT do SRS
PROJ4TEXT VARCHAR(2048) // especificaes para transformao de
SRS
)
13
Introduo ao PostGIS
14
Introduo ao PostGIS
GEOMETRY_COLUMNS (
F_TABLE_CATALOG VARCHAR(256) NOT NULL,
F_TABLE_SCHEMA VARCHAR(256) NOT NULL,
F_TABLE_NAME VARCHAR(256) NOT NULL,
coluna
SRID INTEGER NOT NULL, // ID do SRS usado na tabela
TYPE VARCHAR(30) NOT NULL
// Tipo do objetoGeo
(POINT,
LINESTRING,
POLYGON, MULTIPOINT, MULTILINESTRING,
MULTIPOLYGON, GEOMETRYCOLLECTION
)
15
Introduo ao PostGIS
Nota:
"catalog" pode ficar em branco
e apenas usar o nome do BD
do PostgreSQL para
"schema" .
16
Introduo ao PostGIS
Tabelas de Metadados do OGC
Tabela: GEOMETRY_COLUMNS
f_table_catalog
VARCHAR (256)
PRIMARY KEY
f_table_schema
VARCHAR (256)
PRIMARY KEY
f_table_name
VARCHAR (256)
PRIMARY KEY
f_geometry_column
VARCHAR (256)
PRIMARY KEY
coord_dimension
INTEGER
srid
INTEGER
type
VARCHAR(30)
Tabela: SPATIAL_REF_SYS
srid
INTEGER
auth_name
VARCHAR(256)
auth_srid
INTEGER
srtext
VARCHAR(2048)
proj4text
VARCHAR(2048)
PRIMARY KEY
17
Usando o PostGIS
Criando uma Tabela Espacial:
CREATE TABLE estacoes_pluviometricas (
gid INT4,
location GEOMETRY,
nome VARCHAR(25) );
INSERT INTO estacoes_pluviometricas
VALUES(1, 'POINT(-46.98 -19.57)', 'DINIZ-ARAXA');
INSERT INTO estacoes_pluviometricas
VALUES(2, 'POINT(-43.59 20.37)', 'QUEIROZ-OUROPRETO');
18
Usando o PostGIS
Recuperando dados da Tabela Espacial:
SELECT gid, nome, ST_AsText(location)
FROM estacoes_pluviometricas;
Problema com este mtodo:
Deixa-se de preencher alguns metadados
da tabela que possui uma coluna espacial!
Deixa-se de associar um SRID geometria!
19
Usando o PostGIS
Forma correta de criar uma Tabela Espacial:
Primeiro Passo:
CREATE TABLE estacoes_pluviometricas (
gid
INT4,
nome VARCHAR(25) );
Segundo Passo:
SELECT
AddGeometryColumn('estacoes_pluviometricas',
'location', 4291, 'POINT', 2) ;
20
Usando o PostGIS
Forma correta de inserir a geometria de um
dado espacial:
INSERT INTO estacoes_pluviometricas
VALUES (1, 'DINIZ-ARAXA',
GeomFromText ( 'POINT(-46.98 -19.57)',
4291) ) ;
Geometria expressa
em WKT
SRID
(Spatial
Reference
ID)
21
Usando o PostGIS
Outro exemplo
espacial
de
criao
de
uma
tabela
ROADS_GEOM
ID
int4,
22
NAME
Usando o PostGIS
Continuao do exemplo de criao de uma
tabela espacial
2) Adicionar uma coluna espacial
("AddGeometryColumn)
Sintaxe:
AddGeometryColumn([<schema_name>],<table_name>,
<column_name>, <srid>, <type>,<dimension>);
Exemplo:
SELECT
AddGeometryColumn('public',
'geom', 2000, 'LINESTRING', 2);
SELECT AddGeometryColumn(
2000, 'LINESTRING', 2);
'roads_geom',
'roads_geom',
23
'geom',
Usando o PostGIS
Outros exemplos para criar tabelas espaciais
Assumindo que o SRID 2001 j existe
CREATE TABLE parks ( PARK_ID int4, PARK_NAME
varchar(128), PARK_DATE date, PARK_TYPE varchar(2)
);
SELECT
AddGeometryColumn('parks','park_geom',2001,
'MULTIPOLYGON', 2 );
24
Usando o PostGIS
Outros exemplos para criar tabelas espaciais
Usando o tipo genrico "geometry" e um SRID
indefinido (-1)
CREATE TABLE roads ( ROAD_ID int4, ROAD_NAME
varchar(128) );
SELECT AddGeometryColumn( 'roads', 'roads_geom',
-1, 'GEOMETRY', 3 );
25
Usando o PostGIS
Fazendo a carga de arquivos Shape
1. Arquivo Shape:
.shp = contm a parte geomtrica
.dbf =contm a parte alfa-numrica (string,
number, date)
.shx = contm dados de ndice
2. Tabelas PostgreSQL+PostGIS:
Colunas podem conter geometrias
Colunas podem conter atributos convencionais
Usando o PostGIS
Inserindo ObjetosGeo nas tabelas (2 formas)
1) Usando SQL
BEGIN;
INSERT INTO ROADS_GEOM VALUES
(1,'Jeff Rd',GeomFromText('LINESTRING(191232 243118,191108
243242)',2000));
INSERT INTO ROADS_GEOM VALUES
(2,'Geordie Rd',GeomFromText('LINESTRING(189141 244158,189265
244817)',2000));
INSERT INTO ROADS_GEOM VALUES
(3,'Paul St',GeomFromText('LINESTRING(192783 228138,192612
229814)',2000));
INSERT INTO ROADS_GEOM VALUES (4,'Graeme
Ave',GeomFromText('LINESTRING(189412 252431,189631
259122)',2000));
INSERT INTO ROADS_GEOM VALUES
(5,'Phil Tce',GeomFromText('LINESTRING(190131 224148,190871
228134)',2000));
INSERT INTO ROADS_GEOM VALUES
(6,'Dave Cres',GeomFromText('LINESTRING(198231 263418,198213
268322)',2000)); COMMIT;
27
Usando o PostGIS
2) Usando o Loader shp2pgsql
Converte um shape file para pgsql.sql
Sintaxe:
Shp2pgsql [<options>] <shapefile>
<tablename> <database name>
<shapefile> : nome do shape file s/ extenso (inclui shp,
shx, dbf)
<tablename> : nome da tabela destino. Por default, a
geometria fica na coluna 'geo_value'
<database name> : nome do BDGeo destino
[<options>] : opes de configurao
28
28
Usando o PostGIS
Principais opes de configurao do
shp2pgsql
(-a || -c || -d || -p mutuamente
exclusivas),
-D.
-a : anexa dados a uma tabela existente
-c : cria uma tabela e insere os dados (modo
padro)
-d : apaga a tabela antes de criar outra
-p : l o esquema do shape file para criar
uma tabela
-D : permite fazer dump de grandes volumes
de dados. Usa COPY no lugar de INSERT 29
Usando o PostGIS
2) Usando o Loader shp2pgsql (Continuao)
Exemplo com arquivo intermedirio:
Abrir um terminal (cmd) e executar:
set PATH=%PATH%;C:\Program
Files\PostgreSQL\8.3\bin
Shp2pgsql -c
C:\ESRI\AV_GIS30\AVTUTOR\ARCVIEW\qstart\worl
d94 world94 g082if695_vct > world94.sql
dir
30
Usando o PostGIS
2) Usando o Loader shp2pgsql (Continuao)
Exemplo com arquivo intermedirio:
psql -h postgres.cin.ufpe.br -d g082if695_vct -U
g082if695_vct -f world94.sql -W
-d: nome do BD
-f: nome do arquivo
-U: nome do usurio
-h: nome do host
psql
-h localhost
world94.sql -W
-d
teste
-U
postgres
31
-f
Usando o PostGIS
2) Usando o Loader shp2pgsql Cont.
Exemplo sem arquivo intermedirio:
shp2pgsql -c
C:\ESRI\AV_GIS30\AVTUTOR\ARCVIEW\qst
art\mexico mexico teste | psql -d teste -U
postgres -h g1c10
shp2pgsql -c
C:\ESRI\AV_GIS30\AVTUTOR\ARCVIEW\qst
art\canada canada teste | psql -d teste -U
postgres -h g1c10
32
Usando o PostGIS
Exportando dados para Shape File
pgsql2shp
Converte uma tabelaGeo do PostgreSQL
para shape file ESRI
pgsql2shp [<options>] <database name>
<table name>
<database
name>
nome
do
BDGeo
origem
<tablename> nome da tabela origem
[<options>] opes de configurao
33
Usando o PostGIS
pgsql2shp
Principais opes de configurao
-d: define o arquivo dump para 3D (padro =
2D)
-f <filename>: nome do shape file (padro =
nome da tabela).
-h <host>: host onde est o BD (padro
=localhost).
-p <port>: porta de conexo (padro = 5432).
-P <password>: especifica a senha.
-u <user>: especifica o usurio.
-g <geometry_column> especifica a colunaGeo
34
Usando o PostGIS
Exportando dados para Shape File (Continuao)
pgsql2shp
Exemplos:
pgsql2shp -u postgres -P postgres teste world94
pgsql2shp -f World94Exp -u postgres -P postgres
teste world94
pgsql2shp -f World94Exp -h localhost -p 5432 -u
postgres -P postgres teste world94
35
Usando o PostGIS
Consultas Espaciais
Forma bsica
SELECT id, AsText(geom) AS geom, name FROM
ROADS_GEOM;
Operadores teis
&&: Testa se o MBR de uma geometria intersecta o
MBR de outra
~=
:
Testa
se
duas
geometricamente idnticas
geometrias
so
Usando o PostGIS
Consultas Espaciais
Exemplo:
SELECT ID, NAME
FROM
ROADS_GEOM
WHERE GEOM = GeomFromText('LINESTRING(191232
243118,191108 243242)',2000);
37
Usando o PostGIS
Exemplos de Consultas Espaciais
SELECT ID, NAME
FROM
ROADS_GEOM
WHERE GEOM ~= GeomFromText('LINESTRING(191232
243118,191108 243242)',2000);
SELECT ID, NAME
FROM ROADS_GEOM
WHERE GEOM && GeomFromText('POLYGON((191232
243117,191232 243119,191234 243117,191232 243117))',
-1);
38
Usando o PostGIS
Processamento de Consultas Espaciais
Consulta Espacial
Aplicao
SGBD
candidato
s
Testes com
a
Geometri
a Exata
falsos
BDG
candidat
os
Filtragem Refinamen
to
39
Usando o PostGIS
Operador de ndice espacial : &&
&& b
true
&& b
false
40
Usando o PostGIS
Minimum Bounding
suficiente
a
Box
(MBB)
no
a && b = TRUE
ST_Intersects(a , b) = FALSE
b
Processsamento em duas etapas:
1. Se usa o MBB para diminuir o nmero de
candidatos
2. Se usa os operadores topolgicos para realizar
testes mais finos e ento obter a resposta final
41
41
Usando o PostGIS
Observaes
42
Usando o PostGIS
Consultas simples a ObjetosGeo
Qual a aptido agrcola do municpio de Joo
Pinheiro?
Necessitamos fazer um Overlay! Como?
Mapa de Municpios
Mapa de Aptido
Agrcola
Joo
Pinheiro
43
43
Usando o PostGIS
Consultas simples a ObjetosGeo
Qual a aptido agrcola do municpio Joo
Pinheiro?
SELECT m.nommuni, a.classe,
ST_Intersection (m.the_geom, a.the_geom)
FROM municipios m, aptidao_agricola a
WHERE ST_Intersects (m.the_geom, a.the_geom)
AND
m.nommuni = 'Joo Pinheiro ;
44
Usando o PostGIS
Operaes Topolgicas em SQL
Quais so os recursos hdricos do municpio Ouro
Preto?
Obter os relacionamentos espaciais entre o
municpio de Ouro Preto e seus recursos
hdricos
Ouro
Preto
45
Usando o PostGIS
Operaes Topolgicas em SQL
Quais so os recursos hdricos do municpio Ouro
Preto?
SELECT m.nommuni, h.tipo, h.nome,
ST_AsText(h.the_geom)
FROM municipios m, hidro_line h
WHERE ST_Intersects (m.the_geom, h.the_geom)
AND
m.nommuni = 'Ouro Preto ;
46
Usando o PostGIS
Operaes Topolgicas em SQL
Obter os relacionamentos espaciais entre o
municpio de Ouro Preto e seus recursos
hdricos
SELECT m.nommuni, h.tipo, h.nome,
ST_Relate (h.the_geom, m.the_geom)
FROM
municipios m, hidro_line h
WHERE ST_Intersects(m.the_geom, h.the_geom)
AND
m.nommuni = 'Ouro Preto'
47
Usando o PostGIS
Operaes Topolgicas em SQL
Quais os municpios vizinhos Ouro Preto?
Ouro
Preto
48
Usando o PostGIS
Operaes Topolgicas em SQL
Quais os municpios vizinhos Ouro Preto?
SELECT m1.nommuni, m2.nommuni
FROM
municipios m1, municipios m2
WHERE ST_Touches (m1.the_geom,
m2.the_geom)
AND
m2.nommuni <> 'Ouro Preto'
AND
m1.nommuni = 'Ouro Preto'
49
49
Usando o PostGIS
Operaes Topolgicas em SQL
Quais os municpios do Estado de Minas Gerais
que possuem uma pista de pouso para aeronaves?
50
Usando o PostGIS
Operaes Topolgicas em SQL
Quais os municpios do Estado de Minas Gerais
que possuem uma pista de pouso para aeronaves?
SELECT m.nommuni, a.nomaero
FROM municipios m, aero a
WHERE ST_Contains(m.the_geom, a.the_geom) ;
51
Usando o PostGIS
Conferindo a integridade dos dados
PostGIS pressupe algumas regras
integridade em relao s geometrias:
de
no
deve
ter
polgonos
Usando o PostGIS
Validando geometrias antes de inseri-las no
BDGeo
ST_ISVALID()
Valida as coordenadas de uma geometria
Exemplo:
SELECT ST_ ISVALID ('LINESTRING(0 0, 1 1)'),
t
ST_ISVALID ('LINESTRING(0 0,0 0)');
f
Usando o PostGIS
Conferindo a integridade dos dados
Remover os municpios do Estado de Minas Gerais
que possuem uma geometria invlida.
Usando o PostGIS
Provendo suporte projees cartogrficas
PostGIS possui uma tabla de metadados com
todos os sistemas de referncia espacial
providos:
Tabela: spatial_ref_sys
Usando o PostGIS
Projees Cartogrficas em SQL
Qual a rea do municpio de Ouro Preto em
hectares?
SELECT ST_Area( ST_Transform(the_geom,
29183)) /10000
AS hectares
FROM municipios m
WHERE m.nommuni = 'Ouro Preto ;
56
Usando o PostGIS
Projees Cartogrficas em SQL
Qual o maior municpio do Estado de Minas
Gerais em termos de rea (em hectares)?
SELECT m.nommuni, ST_Area(
ST_Transform (the_geom, 29183)) /
10000 AS hectares
FROM municipios m
ORDER BY hectares DESC LIMIT 1;
57
Usando o PostGIS
Qual o comprimeno total dos recursos hdricos do
municpio de Ouro Preto?
SELECT SUM (ST_Length( ST_Transform( r.rh,
29183))/1000) AS km
FROM ( SELECT ST_Intersection(m.the_geom,
h.the_geom) AS rh
FROM municipios m, hidro_line h
WHERE ST_Intersects(m.the_geom,
h.the_geom) AND m.nommuni = 'Ouro Preto ) AS r ;
58
Usando o PostGIS
Usando ndices Geogrficos
GiST (Generalized Search Tree)
Consultas convencionais em tabelas geogrficas
no usufruem do mecanismo GiST
Usando o PostGIS
GIST (variao da R-Tree)
60
Usando o PostGIS
Usando ndices Geogrficos
Exemplo:
CREATE INDEX world94_idx ON world94
USING GIST (the_geom) ;
61
Usando o PostGIS
Resposta:
Somente consultas com operadores que usam
MBR (i.e. &&) usufruem do ndice espacial.
Funes como distncia no usufruem do
GIST
Pode-se usufruir do ndice usando uma janela
de consulta (query window)
SELECT geometria
FROM
casas WHERE geometria &&
BOX3D(99000 199000, 101000 201000)::box3d
AND distance(geometria,
62 -1))
GeometryFromText(POINT(100000, 200000),
Usando o PostGIS
Principais funes de relacionamento espacial
Distance(geometry, geometry)
Equals(geometry, geometry)
Disjoint(geometry, geometry)
Intersects(geometry, geometry)
Touches(geometry, geometry)
Crosses(geometry, geometry)
Within(geometry, geometry)
Overlaps(geometry, geometry)
Contains(geometry, geometry)
63
Usando o PostGIS
Principais funes de processamento geomtrico
Centroid(geometry)
Area(geometry)
Length(geometry)
PointOnSurface(geometry)
Boundary(geometry)
Buffer(geometry, double, [integer])
Intersection(geometry, geometry)
Difference(geometry, geometry)
GeomUnion(geometry, geometry)
64
Usando o PostGIS
Exemplos de consultas espaciais
Qual o comprimento
estradas? (em km)
total
de
todas
as
Usando o PostGIS
Exemplos de consultas espaciais
66
Usando o PostGIS
Exemplos de consultas espaciais
67
Usando o PostGIS
Exemplos de consultas espaciais
Crie uma tabela com todas as estradas de
Recife
CREATE TABLE pg_roads as
SELECT intersection (r.the_geom, m.the_geom)
AS intersection_geom,
length ( r.the_geom ) AS rd_orig_length , r.*
FROM bc_roads AS r, bc_municipality AS m
WHERE r.the_geom && m.the_geom
AND intersects ( r.the_geom, m.the_geom )
AND m.name = 'RECIFE ;
68
Usando o PostGIS
Exemplos de consultas espaciais
Qual o tamanho (em km), da Av. Caxang
em Recife?
SELECT sum ( length ( r.the_geom ) ) / 1000 AS
kilometers
FROM bc_roads r, bc_municipality m
WHERE r.the_geom && m.the_geom
AND r.name = Caxang '
AND m.name = RECIFE ;
69
Usando o PostGIS
Exemplos de consultas espaciais com
otimizao
Listar o ID das regies vizinhas regio 1234.
SELECT r2.geo_id
FROM regiao r1, regiao r2
WHERE touches (r1.the_geom, r2.the_geom)
AND ( r2.geo_id <> '1234 ) AND ( r1.geo_id =
'1234 )
SELECT r2.geo_id
FROM regiao r1, regiao r2
WHERE touches ( r1.the_geom, r2.the_geom )
AND (r1.the_geom && r2.the_geom)
otimizando
70
Usando o PostGIS
Exemplos de consultas espaciais com
otimizao
Listar o nmero de homicdios ocorridos em
Pernambuco.
SELECT COUNT(*)
FROM homicidios h, estados e
WHERE contains (e.the_geom, h.the_geom)
AND e.nome = 'PERNAMBUCO';
SELECT COUNT(*)
FROM homicidios h, estados e
WHERE contains (e.the_geom, h.the_geom)
AND ( e.the_geom && h.the_geom )
71
Aula Prtica
BD GEO
72/80
PostGIS Exerccio
11
13
15
17
19
21
73
PostGIS Exerccio
Criar uma tabela chamada quadras_final para
armazenar informaes a respeito das quadras abaixo:
74
PostGIS Exerccio
Responda:
Quais os lotes vizinhos ao lote L4?
Quantos lotes esto dentro da quadra Q1?
Uma pessoa resolveu comprar todos os lotes
da quadra Q1. Criar uma nova geometria L6
que represente toda a rea dos lotes originais.
75
PostGIS Exerccio
Responda:
Criar uma nica tabela para armazenar os lotes
e as quadras (exemplo_quadras_lotes). Esta
tabela, alm do identificador, possui o tipo do
objeto e as geometrias. Mas, estas ltimas no
podem ter sobreposio (a rea da quadra
no deve sobrepor a do lote ?!!).
76
76
Projeto de Disciplina
BD GEO
77/80
78
79
79
80
80
81