Introdução ao PostGIS - cin.ufpe.brin940/PostGisBDPos.pdf · shp2pgsql -c...

6
1 Mestrado / Doutorado Banco de Dados Fernando Fonseca & Robson Fidalgo Mestrado / Doutorado Introdução ao PostGIS PostGIS: Uma extensão Geo para o PostgreSQL Download http://postgis.refractions.net/download/ Diretórios Windows Program Files\PostgreSQL\8.1\share\contrib UNIX src/contrib/ Manual http://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 ObjetoGeo INSERT INTO SpatialTable (THE_GEOM, THE_NAME) VALUES (GeomFromText('POINT(-126.4 45.32)', 2000), 'A Place');

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';