Introdução ao PostGIS - cin.ufpe.brin940/PostGisBDPos.pdf · shp2pgsql -c...
Transcript of Introdução ao PostGIS - cin.ufpe.brin940/PostGisBDPos.pdf · shp2pgsql -c...
1
Mestrado / Doutorado
Banco de Dados
Fernando Fonseca&
Robson Fidalgo
Mestrado / Doutorado
Introdução ao PostGIS
PostGIS: Uma extensão Geo para o PostgreSQLDownload
http://postgis.refractions.net/download/Diretórios
WindowsProgram Files\PostgreSQL\8.1\share\contrib
UNIXsrc/contrib/
Manualhttp://postgis.refractions.net/docs/
Mestrado / Doutorado
Introdução ao PostGIS
O PostGIS segue o padrão OpenGIS
Suporta todos os objetos e funções da especificação SFS (Simple Features for SQL).
GEOMETRY
POINT
LINESTRING
POLYGON
GEOMETRYCOLLECTION
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRY
POINT
LINESTRING
POLYGON
GEOMETRYCOLLECTION
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
Fonte: INPE
Mestrado / Doutorado
Introdução ao PostGIS
Os formatos WKB e WKT do OpenGIS
São as 2 formas padrões para especificar ObjetosGeo
Well-Known Text (WKT) e Well-Known Binary(WKB)
Guardam informações sobre tipo e coordenadas do ObjetoGeo
Mestrado / Doutorado
Introdução ao PostGIS
Os 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)))
Mestrado / Doutorado
Introdução ao PostGIS
SRID (spatial referencing system identifier) Todo ObjetoGeo deve ter um SRID para ser inserido no BDGeo
Por exemplo:Considerando a interface GeomFromText
GeomFromText (text WKT, SRID);
Pode-se inserir o seguinte ObjetoGeoINSERT INTO SpatialTable (THE_GEOM, THE_NAME) VALUES (GeomFromText('POINT(-126.4 45.32)', 2000), 'A Place');
2
Mestrado / Doutorado
Introdução ao PostGIS
A especificação SFS/OpenGIS define tipos, funções e metadados para manipular ObjetosGeo.
As principais tabelas de metadados são:
SPATIAL_REF_SYS � guarda os IDs e as descrições textuais do sistema de coordenadas usados no BDGeo.
GEOMETRY_COLUMNS � guarda informações do esquema Geográfico e das propriedades dos ObjetosGeo.
Mestrado / Doutorado
Introdução ao PostGIS
TABLE SPATIAL_REF_SYS (
SRID INTEGER NOT NULL PRIMARY KEY, // identificador do SRS
AUTH_NAME VARCHAR(256), // nome da autoridade que especificou o SRS
AUTH_SRID INTEGER, //identificador do SRS definido pela autoridade
SRTEXT VARCHAR(2048), // representação WKT do SRS
PROJ4TEXT VARCHAR(2048) // especificações para transformação de SRS
)
Mestrado / Doutorado
Introdução
Mestrado / Doutorado
Introdução 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,
F_GEOMETRY_COLUMN VARCHAR(256) NOT NULL, //nome coluna Geo da tabela
COORD_DIMENSION INTEGER NOT NULL, // dimensão (2D ou 3D) da 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 )
)
// nome qualificado da tabela
Mestrado / Doutorado
Introdução ao PostGIS
Note:"catalog" e "schema" são Oracle-ish. Por isso, "catálogo" fica em branco e usa-se o nome do BD do PostgreSQL para "schema" .
Mestrado / Doutorado
Usando o PostGIS
Criando uma tabela espacial (2 passos)1) Criar uma tabela normal (sem campo espacial)
Exemplo:CREATE TABLE ROADS_GEOM ( ID int4, NAMEvarchar(25) );
2) Adicionar uma coluna espacial ("AddGeometryColumn“)Sintaxe:
AddGeometryColumn([<schema_name>],<table_name>,<column_name>, <srid>, <type>,<dimension>);
Exemplo:SELECT AddGeometryColumn('public', 'roads_geom','geom', 2000, 'LINESTRING', 2);SELECT AddGeometryColumn( 'roads_geom', 'geom', 2000, 'LINESTRING', 2);
3
Mestrado / Doutorado
Usando o PostGIS
Outros exemplos para criar tabelas espaciais
Assumindo que o SRID 2001 já existeCREATE TABLE parks ( PARK_ID int4, PARK_NAME varchar(128),
PARK_DATE date, PARK_TYPE varchar(2) );
SELECTAddGeometryColumn('parks','park_geom',2001,'MULTIPOLYGON',2);
Usando o tipo genérico "geometry" e um SRID indefinido (-1)CREATE TABLE roads ( ROAD_ID int4, ROAD_NAME varchar(128) );
SELECT AddGeometryColumn( 'roads', 'roads_geom', -1, 'GEOMETRY', 3 );
Mestrado / Doutorado
Usando o PostGIS
Validando geometrias antes de inserí-las no BDGeoFunção ISVALID()
Valida as coordenadas de uma geometriaExemplo:
SELECT ISVALID('LINESTRING(0 0, 1 1)'), � tISVALID('LINESTRING(0 0,0 0)'); � f
O padrão do PostGIS é não validar a entrada das geometrias Para validar deve-se adicionar uma restrição a tabela
ALTER TABLE parks ADD CONSTRAINT geo_valid_chk CHECK (isvalid(park_geom));
Cuidado: Validar polígonos pode ser muito custoso!
Mestrado / Doutorado
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;
Mestrado / Doutorado
Usando o PostGIS
Inserindo ObjetosGeo nas tabelas (2 formas)2) Usando o Loader shp2pgsql
Converte um shape file para pgsql.sql shp2pgsql [<options>] <shapefile> <tablename> <database name>
<shapefile> nome do shape file sem extensão (inclui shp, shx, dbf).<tablename> nome da tabela destino. Por padrão, a geometria fica na coluna 'geo_value'.<database name> nome do BDGeo destino.[<options>] opções de configuração
PrincipaisPrincipaisPrincipaisPrincipais: (-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 shape file para criar uma tabela-D : permite fazer dump de grandes volumes de dados. Usa COPY no lugar de INSERT INTO).
Mestrado / Doutorado
Usando o PostGIS
Inserindo ObjetosGeo nas tabelas (2 formas)2) Usando o Loader shp2pgsql
Exemplo com arquivo intermediário:shp2pgsql -c C:\ESRI\AV_GIS30\AVTUTOR\ARCVIEW\qstart\world94world94 teste > world94.sqlpsql -d teste -U postgres -f world94.sql
(-d: nome do BD, -U nome do usuário e –f nome do arquivo)
Exemplo sem arquivo intermediário:shp2pgsql -c C:\ESRI\AV_GIS30\AVTUTOR\ARCVIEW\qstart\mexicomexico teste | psql -d teste -U postgresshp2pgsql -c C:\ESRI\AV_GIS30\AVTUTOR\ARCVIEW\qstart\canadacanada teste | psql -d teste -U postgres
Mestrado / Doutorado
Usando o PostGIS
Consultas simples a ObjetosGeoForma básica
SELECT id, AsText(geom) AS geom, name FROM ROADS_GEOM;
Operadores úteis&&: Informa se o MBR de uma geometria intersecta o MBR de outra~= : Testa se 2 geometrias são geometricamente idênticas= : Testa se o MBR de 2 geometrias é idênticoExemplo:
SELECT ID, NAME FROM ROADS_GEOM WHERE GEOM = GeomFromText('LINESTRING(191232
243118,191108 243242)',2000);
4
Mestrado / Doutorado
Usando o PostGIS
Consultas simples a ObjetosGeoExemplo (cont):
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))',2000);
Mestrado / Doutorado
Usando o PostGIS
Exportando dados para Shape Filepgsql2shp
Converte uma tabelaGeo do PostgreSQL para shape file ESRIpgsql2shp [<options>] <database name> <table name> <database name> nome do BDGeo origem.<tablename> nome da tabela origem. [<options>] opções de configuração
-d: define o arquivo dump para 3D (padrão = 2D)-f <filename>: especificar o nome do shape file (padrão = nome da tabela). -h <host>: especificar o host onde está o banco de dados (padrão =localhost).-p <port>: especificar a porta de conexão (padrão = 5432).-P <password>: especificar a senha.-u <user>: especificar o usuário.-g <geometry_column> especificar a colunaGeo a ser exportada.
Mestrado / Doutorado
Usando o PostGIS
Exportando dados para Shape Filepgsql2shp
Exemplos:
pgsql2shp -u postgres -P postgres teste world94
pgsql2shp -f World94Exp -u postgres -P postgres teste world94
pgsql2shp -f World94Exp -h localhost -p 5432 -upostgres -P postgres teste world94
Mestrado / Doutorado
Usando o PostGIS
Usando Índices Geográficos
Melhor opção: usar uma R-Tree implementada no topo do mecanismo GiST (Generalized Search Tree).
A implementação nativa da R-Tree do PostgreSQL não étão robusta quanto a implementação feita pelo mecanismos GiST
Desde a versão 0.6 do PostgreSQL não recomenda-se a sua R-Tree
Consultas convencionais em tabelas geográficas não usufruem do mecanismo GiST
Mestrado / Doutorado
Usando o PostGIS
Usando Índices Geográficos (esquema R-Tree)
Mestrado / Doutorado
Usando o PostGIS
Usando Índices GeográficosSintaxe:
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] GIST_GEOMETRY_OPS );
Exemplo:CREATE INDEX world94_idx ON world94USING GIST (the_geom GIST_GEOMETRY_OPS);
Depois de criar os índices é boa prática executar:VACUUM ANALYZE [table_name] [column_name]
para liberar tuplas obsoletas/excluídas
5
Mestrado / Doutorado
Usando o PostGIS
É possível usufruir do GiST na consulta abaixo?
Selecionar as casas que estejam a menos de 1000 metros do ponto (100000, 200000):
SELECT geometria
FROM casasWHERE distance(geometria,
GeometryFromText(‘POINT(100000, 200000)’, -1)) < 1000;
Mestrado / Doutorado
Usando o PostGIS
É possível usufruir do GiST na consulta abaixo?Selecionar as padarias que estejam a menos de 1000 metros do ponto (100000, 200000):
SELECT geometria
FROM padariasWHERE distance(geometria,
GeometryFromText(‘POINT(100000, 200000)’, -1)) < 1000;
Esta consulta será lenta se a tabela for grande!Somente consultas com operadores que usam MBR
(ex: &&) tiram vantagem do índice espacial. Funções como distância não usufruem do índice.
Mestrado / Doutorado
Usando o PostGIS
Pode-se usufruir do índice usando uma janela de consulta (“query box”)
SELECT geometriaFROM padarias
WHERE geometria && ‘BOX3D(99000 199000, 101000 201000)’::box3d
AND distance(geometria, GeometryFromText(‘POINT(100000, 200000)’, -1)) < 1000;
Note que a janela de consulta (BOX3D + &&) forma um quadrado centralizado sobre o ponto original
Mestrado / Doutorado
Usando o PostGIS
Principais funções de relacionamento geométricoDistance(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) Intersects(geometry, geometry)
Mestrado / Doutorado
Usando o PostGIS
Principais funções de processamento geométricoCentroid(geometry)Area(geometry)Length(geometry)PointOnSurface(geometry)Boundary(geometry) Buffer(geometry, double, [integer])Intersection(geometry, geometry)Difference(geometry, geometry)GeomUnion(geometry, geometry)
Mestrado / Doutorado
Usando o PostGIS
Existem muitas outras funções!
Consultar tópico 6 (PostGIS Reference) do manual
PostGis.
6
Mestrado / Doutorado
Usando o PostGIS
Exemplos de consultas espaciais
Qual o comprimento total de todas as estradas? (em km)SELECT sum(length(the_geom))/1000 AS km_roads FROM rodovias;
Qual é a área da cidade de RECIFE? (em hectares)SELECT area(the_geom)/10000 AS hectares FROM municipiosWHERE name = ‘RECIFE';
Mestrado / Doutorado
Usando o PostGIS
Exemplos de consultas espaciaisQual é o maior município por área? (em hectares)
SELECT name, area(the_geom)/10000 AS hectares FROM municipiosORDER BY hectares DESC LIMIT 1;
Qual é o tamanho das estradas contidas em cada município?SELECT m.name, sum(length(r.the_geom))/1000 as roads_km
FROM rodovias AS r, municipios AS m WHERE r.the_geom && m.the_geom AND contains(m.the_geom,r.the_geom) GROUP BY m.name ORDER BY roads_km;
Mestrado / Doutorado
Usando o PostGIS
Exemplos de consultas espaciais
Crie uma tabela com todas as estradas de Recife?
CREATE TABLE estradasRecife asSELECT intersection(r.the_geom, m.the_geom) AS intersecao_geom,length(r.the_geom) AS tamanho, r.* FROM rodovias AS r, municipios AS m WHERE r.the_geom && m.the_geom AND intersects(r.the_geom, m.the_geom) AND m.name = 'RECIFE';
Mestrado / Doutorado
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 rodovias r, municipios m WHERE r.the_geom && m.the_geom AND r.name = 'Caxangá' AND m.name = 'RECIFE';