BANCO DE DADOS GEOGRÁFICOS E
WEBMAPPING
1
Prof. Angelo Augusto Frozza, M.Sc.
http://about.me/TilFrozza
INTRODUÇÃO AO POSTGIS
PostGIS é uma extensão do sistema de banco de dados
objeto-relacional PostgreSQL, que permite armazenar
objetos geográficos em banco de dados
PostGIS inclui suporte para índices GiST -índices
espacias baseados em R-Tree - e funções para análise
básica e processamento de objetos GIS
http://postgis.refractions.net/
2
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
http://www.opengeospatial.org/
Provê suporte para todos objetos e funções da especificação SFS
(Simple Features for SQL) (OGC)
GEOMETRY
POINT
GEOMETRYCOLLECTION
LINESTRING
MULTIPOINT
POLYGON
MULTILINESTRING
MULTIPOLYGON
3
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
Point, LineString e Polygon
4
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
LineString
5
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
Polygon
6
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
MultiLineString
7
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
MultiPolygon
8
INTRODUÇÃO AO POSTGIS
O PostGIS segue o padrão OpenGIS
MultiPoint
9
INTRODUÇÃO AO POSTGIS
Formatos WKB e WKT do OpenGIS
Duas formas padrões para manipular objetos geográficos
Well-Known Text (WKT) e Well-Known Binary (WKB)
Guardam informações sobre tipo e coordenadas do Geo-Objeto
Exemplos WKT:
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))
10
INTRODUÇÃO AO POSTGIS
SRID (Spatial Referencing System Identifier)
Todo objeto geográfico deve ter um SRID para ser inserido no
BDG
O SRID corresponde a um sistema de referência espacial baseado no
elipsóide específico usado para mapeamento de terra plana ou de terra
redonda
Uma coluna espacial pode conter objetos com SRIDs diferentes
No entanto apenas instâncias espaciais com o mesmo SRID podem ser
usadas ao executar operações sobre dados espaciais
http://en.wikipedia.org/wiki/SRID
http://seiti.eti.br/blog/2010/sistema-de-referenciamento-espacial
11
INTRODUÇÃO AO POSTGIS
SRID (Spatial Referencing System Identifier)
O resultado de qualquer método espacial derivado de duas instâncias de
dados espaciais será válido apenas se essas instâncias tiverem o
mesmo SRID que é baseado na mesma unidade de medida, datum e
projeção usada para determinar as coordenadas das instâncias
As unidades mais comuns de medida de um SRID são metros e metros
quadrados
O sistema de identificação de referência espacial é definido pelo padrão
do EPSG (European Petroleum Survey Group), que é um conjunto de
padrões desenvolvido para armazenamento de dados geodésicos, de
cartografia e de pesquisa
Esse padrão é de propriedade do Comitê de Pesquisa e Posicionamento da OGP
(Oil and Gas Producers)
12
INTRODUÇÃO AO POSTGIS
SRID (Spatial Referencing System Identifier)
Exemplo:
Considerando a interface GeomFromText :
GeomFromText (text WKT, SRID);
Pode-se inserir o seguinte objeto geográfico:
INSERT INTO SpatialTable (THE_GEOM, THE_NAME)
VALUES (GeomFromText('POINT(-126.4 45.32)', 2000),
'Um Lugar');
13
INSTALANDO O POSTGIS NO WINDOWS
14
DEFINIÇÕES DO POSTGIS
A especificação SFS/OpenGIS define tipos, funções e
metadados para manipular GeoObjetos
As principais tabelas de metadados são:
SPATIAL_REF_SYS → guarda os IDs e as descrições textuais
do sistema de coordenadas usados no BDG
GEOMETRY_COLUMNS → guarda informações do esquema
geográfico e das propriedades dos GeoObjetos
15
DEFINIÇÕES DO POSTGIS
geometry_columns
F_TABLE_CATALOG
F_TABLE_SCHEMA
F_TABLE_NAME
F_GEOMETRY_COLUMN
COORD_DIMENSION
SRID
(SPATIAL_REF_SYS)
TYPE
- nome do BD
- nome da tabela contendo a coluna
de geometria
- nome da coluna de geometria
- dimensão espacial da coluna (2D,
3D)
- ID do sistema de referência
espacial (chave estrangeira para a tabela
- tipo de objeto espacial (POINT,
LINESTRING, POLYGON, MULTIPOINT,
MULTILINESTRING, MULTIPOLYGON,
GEOMETRYCOLLECTION )
16
DEFINIÇÕES DO POSTGIS
spatial_ref_sys
SRID
AUTH_NAME
AUTH_SRID
SRTEXT
PROJ4TEXT
- identificador único do Sistema de
Referência Espacial no banco de dados
- nome dos padrões usados no sistema de
referência (autoridade que especificou)
- ID do Sistema de Referência Espacial como
definido pela autoridade citada em
AUTH_NAME
- representação do Sistema de Referência
Espacial no formato Well-Known Text
- string de definição de coordenadas na
biblioteca Proj4 para um SRID particular (usado
para transformações de SRS)
17
CRIANDO UM BD POSTGIS
Requisitos
Banco de Dados PostgreSQL
Extensão PostGIS
Duas formas:
Usando um wizard (pgAdmin)
Por meio de scripts
Por conversão de shapefiles (*.shp)
18
CRIANDO UM BD POSTGIS COM WIZARD
CRIANDO UM BD POSTGIS VIA SCRIPTS
1a etapa (opção 1 – detalhada):
Crie um novo banco PostGIS
createdb –U username[dbname]
O comando createlang adiciona a habilidade para usar funções
escritas em pl/pgsql (opcional)
createlang –U username plpgsql [dbname]
O comando psql roda o interpretador SQL para os arquivos
postgis.sql e spatial_ref_sys.sql
psql –U username -f postgis.sql [dbname]
psql –U username -f spatial_ref_sys.sql [dbname]
20
CRIANDO UM BD POSTGIS VIA SCRIPTS
1a etapa (opção 2):
Crie um novo banco PostGIS
createdb –U username –T template_postgis_20[dbname]
O comando psql roda o interpretador SQL para os arquivos
postgis.sql e spatial_ref_sys.sql
psql –U username -f spatial_ref_sys.sql [dbname]
21
CRIANDO UM BD POSTGIS VIA SCRIPTS
1a etapa:
O arquivo postgis.sql contém comandos que adicionam os
tipos de dados geométricos, as funções e os operadores
necessários para manipulá-los e duas tabelas de metadados:
geometry_columns
para controlar as colunas geométricas e suas restrições
spatial_ref_sys
Mantem os IDs numéricos e descrições textuais do sistema de
coordenadas usado no banco espacial
22
CRIANDO UM BD POSTGIS VIA SCRIPTS
2a etapa:
Conecte-se ao banco de dados usando o interpretador de
comandos SQL psql:
psql –U username [dbname]
Crie uma tabela digitando:
CREATE TABLE test ( id INTEGER PRIMARY KEY, name
VARCHAR(20) NOT NULL );
SELECT AddGeometryColumn ( '[dbname]', 'test',
'geom', -1, 'GEOMETRY', 2 );
23
CRIANDO UM BD POSTGIS VIA SCRIPTS
2a etapa:
A função AddGeometryColumn cria uma coluna na tabela
especificada e uma linha na tabela geometry_columns.
Os parâmetros usados são:
Nome do banco de dados
Nome da tabela
Nome da coluna a ser criada
Identificador de Referência Espacial (SRID) da nova coluna
Tipo de geometria para a coluna:
O SRID referência uma linha na tabela spatial_ref_sys
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRY (todos os tipos permitidos)
Número de dimensões na coluna (2D ou 3D)
24
CRIANDO UM BD POSTGIS VIA SCRIPTS
3a etapa:
Criar um índice espacial para acelerar consultas baseadas em
janelas (bounding-box), por exemplo:
"selecione todas as geometrias que estão dentro desta bounding box“
Este tipo de consulta é usada para selecionar geometrias dentro
de uma área de interesse ou dentro de uma área de visão do
mapa
Para criar um índice espacial GiST (R-Tree):
CREATE INDEX test_geom_idx ON test USING GIST (geom
GIST_GEOMETRY_OPS);
25
CRIANDO UM BD POSTGIS VIA SCRIPTS
3a etapa:
Este comando pode levar um grande tempo se houver uma
quantidade significativa de dados na tabela
Após carregar os dados, é bom rodar o comando:
VACUUM ANALYZE;
Este comando atualiza o cache do banco de dados de
estatísticas e reorganiza a estrutura de alguns índices para
aumentar a velocidade de consultas usando este índice
26
CRIANDO UM BD POSTGIS VIA SCRIPTS
4a etapa:
Inserindo dados por linha de comando;
O PostGIS usa o formato Well-Known Text (WKT) para descrever geometrias:
INSERT INTO test ( id, name, geom )
VALUES ( 1, 'geom 1', ST_GeometryFromText(
'POINT(1 1)', -1 ) );
INSERT INTO test ( id, name, geom )
VALUES ( 2, 'geom 2',
ST_GeometryFromText( 'LINESTRING(1 2, 2 3)', 1 ) );
INSERT INTO test ( id, name, geom )
VALUES ( 3, 'geom 3',
ST_GeometryFromText( 'POLYGON((2 1, 3 1, 3 3,
2 1))', -1 ) );
27
CRIANDO UM BD POSTGIS VIA SCRIPTS
4a etapa:
A função GeometryFromText pega uma string WKT e um SRID
e retorna uma geometria;
Mais exemplos de WKT para diferentes tipos de geometria:
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 4), LINESTRING(2 3, 3 4))
28
IMPORTANDO SHAPEFILES PARA O POSTGIS
Arquivos shapefile
<file>.shp
<file>.shx
<file>.dbf
<file>.prj
<file>.sbn
<file>.sbx
- arquivo principal
- arquivo de índice (liga o dbf ao shp)
- tabela de atributos
- arquivo de projeção cartográfica
- arquivo auxiliar
- arquivo auxiliar
29
IMPORTANDO SHAPEFILES PARA O POSTGIS
Usa-se o programa shp2pgsql:
shp2pgsql [<options>] <shapefile> <tablename> <dbname>
| psql –U username [dbname]
Este programa pega um arquivo shapefile, gera os scripts SQL
apropriados para criar uma tabela com os mesmos atributos
(colunas) do shapefile e insere todos os registros do shapefile no
PostGIS
[<options>] : opções de configuração
Principais: (-a || -c || -d || -p → mutuamente exclusivas), -D
-a → anexa dados a uma tabela existente
-c → cria uma tabela e insere os dados (modo padrão)
-d → apaga a tabela antes de criar outra
-p → lê o esquema do shapefile para criar uma tabela
-D → permite fazer dump de grandes volumes de dados
Usa COPY no lugar de INSERT INTO
30
IMPORTANDO SHAPEFILES PARA O POSTGIS
O shp2pgsl pode também inserir as linhas em uma
tabela existente com as colunas corretas (em vez de
criar uma nova tabela), para agregar múltiplos
shapefiles com o mesmo esquema em uma única tabela
Note que a coluna contendo a geometria do shapefile é
chamada the_geom na tabela do banco de dados
criada pelo shp2pgsql
31
IMPORTANDO SHAPEFILES PARA O POSTGIS
Este
exemplo cria quatro tabelas no banco de
dados: elections, ocean, roads e hospitals:
shp2pgsql -D victoria_elections.shp elections
[dbname] | psql –U username [dbname]
shp2pgsql -D victoria_ocean.shp ocean [dbname]
| psql –U username [dbname]
shp2pgsql -D victoria_roads.shp roads [dbname]
| psql –U username [dbname]
shp2pgsql -D victoria_hospitals.shp hospitals
[dbname] | psql –U username [dbname]
32
IMPORTANDO SHAPEFILES PARA O POSTGIS
Após importar os dados do shapefile, criam-se os índices
espacias:
CREATE INDEX elections_geom_idx ON
elections USING GIST (the_geom
GIST_GEOMETRY_OPS);
CREATE INDEX ocean_geom_idx ON ocean
USING GIST (the_geom GIST_GEOMETRY_OPS);
CREATE INDEX roads_geom_idx ON roads
USING GIST (the_geom GIST_GEOMETRY_OPS);
CREATE INDEX hospitals_geom_idx ON
hospitals USING GIST (the_geom
GIST_GEOMETRY_OPS);
33
IMPORTANDO SHAPEFILES PARA O POSTGIS
O processo de importação com o shp2pgsql
automaticamente define uma única coluna chamada gid
e faz ela a chave-primária da tabela:
\d elections
\d ocean
O PostgreSQL também provê o OID no lugar da chaveprimária
34
FUNÇÕES
ST_Centroid(geometry)
Retorno o tamanho dos limites de um polígono
PointOnSurface(geometry)
Retorna o tamanho de geometrias do tipo linha
ST_Perimeter(geometry)
Retorna a área de um polígono
ST_Length(geometry)
Retorna o ponto central da geometria
ST_Area(geometry)
DE PROCESSAMENTO GEOMÉTRICO
Retorna um ponto que intersecta uma superfície
ST_Boundary(geometry)
Retorna os pontos limites da geometria
35
FUNÇÕES
ST_Buffer(geometry, distance double, [integer])
Retorna uma geometria que representa os pontos compartilhados pelas
duas geometrias indicadas
ST_Difference(geometryA, geometryB)
Retorna uma geometria (buffer) que representa todos os pontos que
estão xxx (distance) distantes de geometry
ST_Intersection(geometryA, geometryB)
DE PROCESSAMENTO GEOMÉTRICO
Retorna uma geometria que representa que parte de A não intersecta
com B
ST_GeomUnion(geometryA, geometryB)
(ST_Union) Retorna uma geometria que representa a união de A e B
36
FUNÇÕES DE RELACIONAMENTO ESPACIAL
ST_Distance(geometryA, geometryB)
ST_Equals(geometryA, geometryB)
Retorna verdadeiro se as duas geometrias não compartilham qualquer
espaço
ST_Intersects(geometryA, geometryB)
Retorna verdadeiro se as duas geometrias são equivalentes
ST_Disjoint(geometryA, geometryB)
Retorna a distância cartesiana entre duas geometrias
Retorna verdadeiro se duas geometrias compartilham algum espaço
ST_Touches(geometryA, geometryB)
Retorna verdadeiro se as duas geometrias tem pelo menos um ponto em
comum
37
FUNÇÕES DE RELACIONAMENTO ESPACIAL
ST_Crosses(geometryA, geometryB)
ST_Within(geometryA, geometryB)
Retorna verdadeiro se a geometria A está completamente dentro da
geometria B
ST_Overlaps(geometryA, geometryB)
Retorna verdadeiro se as geometrias tem algum, mas nem todos, os
pontos internos em comum
Retorna verdadeiro se a geometria A sobrepõe a geometria B mas não
está completamente contida dentro dessa
ST_Contains(geometryA, geometryB)
Retorna verdadeiro se nenhum ponto de B está fora da geometria A e
pelo menos um ponto no interior de B encontra-se no interior de A
38
POSTGIS PARA SHAPEFILE
Sintaxe:
pgsql2shp [<opções>] <nome do banco>
<nome da tabela>
do banco> nome do banco de origem
<nome da tabela> nome da tabela geográfica
<nome
39
POSTGIS PARA SHAPEFILE
<opções>
-d: define o arquivo dump para 3D (padrão = 2D)
-f <filename>: nome do shapefile (padrão = nome da
tabela)
-h <host>: host em que está o banco de dados
(padrão =localhost)
-p <port>: porta de conexão (padrão = 5432)
-u <user>: especifica o usuário
-P <password>: especifica a senha
-g <geometry_column>: especifica a coluna
geométrica a ser exportada
40
POSTGIS PARA SHAPEFILE
pgsql2shp -u postgres -P postgres
fatec3 sedes_sc
sedes_sc –
view criada para selecionar parte dos
dados da tabela sedes
41
POSTGIS PARA SHAPEFILE
Criação da view
create view sedes_rs as
select * from sedes where
coduf='43';
42
POSTGIS PARA SHAPEFILE
Registrar
a view na tabela geometry_columns
INSERT INTO geometry_columns (f_table_catalog,
f_table_schema, f_table_name, f_geometry_column,
coord_dimension, srid, type)
VALUES ('', 'public', 'sedes_rs', 'the_geom', 2, -1,
'POINT');
43
DICAS
Onde obter shapefiles?
ftp://geoftp.ibge.gov.br/mapas/Carta_Internacional_ao_
Milionesimo/shape/
Arquivos: SG-21, SG-22, SH-21, SH-22 e SI-22
http://www.metadados.inde.gov.br/geonetwork
EPAGRI
http://ciram.epagri.sc.gov.br/mapoteca/
Digitar no Google:
siscom ibama
44
REFERÊNCIAS
PostGIS
http://www.postgis.org
Spatial Data (SQL Server)
http://msdn.microsoft.com/en-us/library/bb933790.aspx