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