Operadores topológicos SQL ST_RELATE Fernando Coelho do Carmo - -
Arquitetura integrada - -
PostGIS + PostgreSQL PostGIS é uma extensão espacial para o PostgreSQL que implementa a especificação padrão OGC Tipos de dados PostGIS: - -
Tipos de dados Esses tipos possuem a seguinte representação textual: Point: (0 0) LineString: (0 0, 1 1, 2 2) Polygon: ((0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0), ( 1 0 0,...),...) MultiPoint: (0 0 0, 4 4 0) MultiLineString: ((0 0 0, 1 1 0, 2 2 0), (4 4 0, 5 5 0, 6 6 0)) MultiPolygon: (((0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0), (...),...),...) GeometryCollection: (POINT(2 2 0), LINESTRING((4 4 0, 9 9 0)) - -
Passos para construção Construção do Banco de dados espacial 1- Planejamento do banco de dados Esquematização (papel e lápis) Definição das entidades e relacionamentos 2 Implementação do modelo (SQL) Create table..., Foreign Key..., Primary key 3 Adição dos atributos espaciais SELECT addgeometrycolumn(...) 4 Inserção de dados INSERT INTO... 5 Consulta e manipulação dos dados - -
Planejamento do banco de dados Ex) Banco de dados para: Registrar os dados e geometrias dos lotes Registrar os dados e geometrias dos bairros Definição dos atributos e tipos de dados Esquematização lógica do banco de dados - -
Implementação do modelo (SQL) Para instalar a extensão espacial POSTGIS: Download do instalador POSTGIS Instalar POSTGIS Criar a extensão no banco de dados: CREATE EXTENSION POSTGIS; Utilizar as funções do POSTGIS (instalado no public): - - SET SEARCH_PATH TO nome_usu, public;
Consulta e manipulação dos dados Operadores topológicos conforme a Matriz de 9-Interseções : st_equals(geometry, geometry) st_disjoint(geometry, geometry) st_intersects(geometry, geometry) st_touches(geometry, geometry) st_crosses(geometry, geometry) st_within(geometry, geometry) st_overlaps(geometry, geometry) st_contains(geometry, geometry) Retornam a matriz de intersecção. st_relate(geometry, geometry): - -
Operadores topológicos (Todos) boolean ST_Relate(geometry geoma, geometry geomb, text intersectionmatrixpattern); text ST_Relate(geometry geoma, geometry geomb); SELECT ST_Relate( ST_GeometryFromText('POINT(1 2)'), ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2) ); DIMENSÕES 0 => ponto 1 => linha 2 => área T => {0,1,2} F => vazio * => Qualquer 0FFFFF212 SELECT ST_Relate( ST_GeometryFromText('POINT(1 2)'), ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2), '0FFFFF212'); t - -
Padrões da DE-9IM - -
Operadores topológicos (Todos) RESULTADO (RELATE) 212101212 - -
Dados geométricos (20, 0) Fazer a DE-9IM: Interior, fronteira, exterior A (2, 18) (13, 18) (13, 7) (2, 7) A B (10, 0) (0,0) - - B (13, 18) (21, 18) (21, 2) (13, 2) (10, 0) 20, 0 (27, 0)
Inserção dos dados Definição das coordenadas (sistema local) A: (2, 18), (13, 18), (13, 7), (2, 7) B: (13, 18), (21, 18), (21, 2), (13, 2) Definição do SQL SELECT ST_RELATE( ST_GeomFromText('POLYGON((2 18, 13 18, 13 7, 2 7, 2 18))'), ST_GeomFromText('POLYGON((13 18, 21 18, 21 2, 13 2, 13 18))') ); "FF2F11212" - -
Exemplos operador topológico (8, 4) (2, 2) (1,1) (6,1) SELECT ST_RELATE( ST_GeomFromText('POLYGON((2 2, 8 2, 8 4, 2 4, 2 2))'), ST_GeomFromText('LINESTRING(1 1, 6 1)') ); - -
Exemplos operador topológico (8, 4) (2, 2) (1,1) (6,1) SELECT ST_RELATE( ST_GeomFromText('POLYGON((2 2, 8 2, 8 4, 2 4, 2 2))'), ST_GeomFromText('LINESTRING(1 1, 6 1)') ); - -
Exemplos operador topológico (9, 5) (5, 4) (3, 2) (1, 1) SELECT ST_RELATE( ST_GeomFromText('POLYGON((1 1, 5 1, 5 4, 1 5, 1 1))'), ST_GeomFromText('POLYGON((3 2, 9 2, 9 5, 3 5, 3 2))') ); - -
Exemplos operador topológico (9, 5) (5, 4) (3, 2) (1, 1) SELECT ST_RELATE( ST_GeomFromText('POLYGON((1 1, 5 1, 5 4, 1 5, 1 1))'), ST_GeomFromText('POLYGON((3 2, 9 2, 9 5, 3 5, 3 2))') ); - -
Exemplos operador topológico ST MakeBox2D ( ST Point ( 1, 1 ), ST Point ( 7, 3 ) ), ST MakeBox2D ( ST Point ( 3, 3 ), ST Point ( 9, 5 ) ) - -
Exemplos operador topológico ST MakeBox2D ( ST Point ( 1, 1 ), ST Point ( 7, 3 ) ), ST MakeBox2D ( ST Point ( 3, 3 ), ST Point ( 9, 5 ) ) - -
Exemplos operador topológico ST MakeBox2D ( ST Point ( 1, 1 ), ST Point ( 9, 5 ) ), ST MakeBox2D ( ST Point ( 2, 2 ), ST Point ( 8, 4 ) ) - -
Exemplos operador topológico ST MakeBox2D ( ST Point ( 1, 1 ), ST Point ( 9, 5 ) ), ST MakeBox2D ( ST Point ( 2, 2 ), ST Point ( 8, 4 ) ) - -
Exemplos operador topológico ST MakeBox2D ( ST Point ( 1, 1 ), ST Point ( 4, 3 ) ), ST MakeBox2D ( ST Point ( 6, 3 ), ST Point ( 9, 5 ) ) - -
Exemplos operador topológico ST MakeBox2D ( ST Point ( 1, 1 ), ST Point ( 4, 3 ) ), ST MakeBox2D ( ST Point ( 6, 3 ), ST Point ( 9, 5 ) ) - -
Exemplos operador topológico SELECT ST_RELATE( ST_GeomFromText('POLYGON((2 2, 8 2, 8 4, 2 4, 2 2))'), ST_GeomFromText('point(5 1)') ); - -
Exemplos operador topológico SELECT ST_RELATE( ST_GeomFromText('POLYGON((2 2, 8 2, 8 4, 2 4, 2 2))'), ST_GeomFromText('point(5 1)') ); - -
Operadores topológicos EXEMPLO com o TOCAR boolean ST_Touches(geometry g1, geometry g2); SELECT ST_Touches( ST_GeomFromText('LINESTRING(0 0, 1 1, 0 2)'), ST_GeomFromText('POINT(2 2)') ); f FALSE SELECT ST_Touches( ST_GeomFromText('LINESTRING(0 0, 1 1, 0 2)'), ST_GeomFromText('POINT(0 2)') ); t - - TRUE
SFS Simple Feature Specification - -
Funções PostGIS - SFS Especificação definida e bem documentada Padrão OGC É uma especificação criada pelo OGC que trata das seguintes questões: Armazenamento da componente espacial vetorial de dados geográficos em bancos de dados Fornecimento de interface de acesso a esses dados: SQL, CORBA e COM Versões: 1.1.0 e 1.2.0 Na prática: - - SQL: PostgreSQL/PostGIS ou Oracle Spatial SQL + Linguagem: TerraLib+MySQL ou ARCSDE+SQLServer
Funções PostGIS - SFS Simple Feature Access - Part 1: Common Architecture http://www.opengeospatial.org/standards/sfa Modelo Geométrico Operadores Espaciais Simple Feature Access - Part 2: SQL Option http://www.opengeospatial.org/standards/sfs SQL CORBA COM - -
Funções PostGIS - SFS - -
Funções PostGIS - SFS Dimensionalidade da figura geométrica: 0-dimensional: ponto 1-dimensional: linha 2-dimensional: polígono Dimensionalidade do espaço onde está inserida a figura geométrica: 2D: plano cartesiano 3D: espaço tridimensional 2D+M: plano cartesiano com uma medida associada 3D+M: espaço tridimensional com uma medida associada - -
Tipos de dados espaciais - -
Integridade das geometrias De acordo com SFS: Todas as geometrias devem ser simples e válidas (0-dim e 1-dim) Uma geometria é simples se: Não possuir pontos anômalos Auto-intersecções Auto-tangência Ponto: É inerentemente simples (0-dim) Multipoint: - - Não possuir dois pontos iguais (mesma coord.) (2-dim) Verificar se uma geometria é válida
Integridade das geometrias LINESTRING Não passa sobre o mesmo ponto (exceto extremos) - -
Integridade de geometrias MULTILINESTRING Todas as linhas devem ser simples Não existem Intersecções entre as linhas (exceto nos extremos) - -
Integridade das geometrias POLYGON A fronteira pode interceptar apenas em ponto (não linhas) Os anéis internos não podem se sobrepor Anéis internos devem estar inteiramente contido no anel externo - -
Integridade das geometrias MULTIPOLYGON Todos os polígonos devem ser válidos Interior de dois polígonos não se interceptam As fronteiras podem se tocar, mas apenas em pontos finitos - -
Funções PostGIS - SFS - -
Observação importante: a especificação é clara ao dizer que ainda que estejam previstas as geometrias no espaço tridimensional (3D), os operadores só são definidos no espaço bidimensional (2D). É deixado a cargo de cada implementador a definição dos operadores no espaço 3D Funções 3D ainda não estão totalmente desenvolvidas Manipulação não tão madura quanto as implementações 2D Especificação <> Implementação - -
Integridade dos dados 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)'), ST_ISVALID ('LINESTRING(0 0,0 0)'); t f Opção default é não validar a entrada das geometrias Para validar deve-se adicionar uma restrição à tabela ALTER TABLE parks ADD CONSTRAINT geo_valid_chk CHECK (ST_ISVALID ( park_geom)) ; - -
Contato: alisondocarmo@gmail.com - -