Banco de Dados Espaciais Sistema de Informações Geográficas 2006.2 Prof. Cláudio Baptista Oracle Spatial Provê um esquema SQL e funções que facilitam o armazenamento, recuperação, atualização, e consulta de coleções de feições espaciais num Oracle database. Um geo-objeto é definido como um atributo de tipo SDO_GEOMETRY (antigo MDSYS.SDO_GEOMETRY) de uma tabela OR. Consiste dos seguintes componentes: Um esquema MDSYS que provê o tipo de dado geométrico; Um mecanismo de indexação espacial; Um conjunto de operadores e funções para executar consultas espaciais, junções espaciais e outras operações de análise espacial; Utilitários administrativos Oracle Spatial Modelo de dados Element (point, polygon, linestring) Geometria (geometry object): representação de uma feição espacial modelado com um conjunto de elementos primitivos. Layer: coleção de geometrias com o mesmo conjunto de atributos Coordinate System (também chamado Spatial Reference System) Tolerance: reflete a distância que dois pontos podem estar para ainda serem considerados o mesmo ponto (útil em correção de erro). Oracle Spatial – Operações Espaciais SDO_RELATE: usa um critério espacial, implementando o modelo de 9-interseções, com os relacionamentos topológicos (disjoint, touches, equals, inside, etc.) SDO_WITHIN_DISTANCE: implementa um buffer. Indica se geo-objetos estão a uma certa distância um do outro SDO_NN: indica os vizinhos mais próximos (Nearest Neghbor) de um geo-objeto. Oracle Spatial – Operações Espaciais SDO_RELATE- Operadores topológicos DISJOINT : as bordas e interiores não se interceptam TOUCH: as bordas interceptam mais os interiores não. OVERLAPBDYDISJOINT – uma linha origina-se for a de um polígono mas termina dentro OVERLAPBDYINTERSECT – insterseção de borda com interior EQUAL – dois objetos têm a mesma borda e mesmo interior. CONTAINS – o interior e borda de um objeto está completamente contido no interior do outro objeto. COVERS -- o interior de um objeto está completamente contidono interior ou borda de outro objeto e suas bordas se interceptam. INSIDE – o oposto de CONTAINS. A INSIDE B implica que B CONTAINS A. COVEREDBY – o oposto de COVERS ON -- o interior e borda de um objeto está na borda de outro objeto ( e o segundo objeto cobre o primeiro objeto). Por exemplo, quando uma linha está na borda de um polígono. ANYINTERACT – os objetos são non-disjoint Oracle Spatial – Operações Espaciais Oracle Spatial – Tipos de Dados Espaciais O tipo SDO_Geometry é definido como: CREATE TYPE sdo_geometry AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, SDO_ORDINATES SDO_ORDINATE_ARRAY); CREATE TYPE sdo_point_type AS OBJECT ( X NUMBER, Y NUMBER, Z NUMBER); CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER; CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER; Existem outros tipos para lidar com GeoRaster, GeoCoding e Topologia e Redes Oracle Spatial – Tipos de Dados Espaciais O atributo SDO_GTYPE indica o tipo da geometria (segue OGC Simple Feature for SQL. Possui 4 dígitos no formato dltt, onde d: indica o número de dimensões (2, 3 ou 4) l: usado em geometrias 3-dimensões. Colocar 0 para default. tt: indica o tipo da geometria (00 a 07) (00 – Unknown geometry, 01 – Point, 02 – Line ou Curve, 03 – Polygon, 04 – Collection, 05 – MultiPoint, 06 – MultiLine, 07 – MultiPolygon Ex. 2003 => Polígono em 2-dimensões Oracle Spatial – Tipos de Dados Espaciais O atributo SDO_SRID identifica um sistema de coordenadas (spatial reference system) para geometria. Se não null, deve conter um valor da coluna SRID da tabela MDSYS.CS_SRS Todos os valores de uma geometria devem ter o mesmo SRID Oracle Spatial – Tipos de Dados Espaciais O atributo SDO_POINT é do tipo SDO_POINT_TYPE que possui 3 number X,Y,Z: OBS.: usado para armazenar pontos, neste caso os arrays SDO_ELEM_INFO e SDO_ORDINATES devem ser null Oracle Spatial – Tipos de Dados Espaciais SDO_ELEM_INFO : é um vetor de tamanho variável que armazena as características dos elementos que compõem a geometria. As coordenadas de cada elemento são armazenadas em um vetor variável chamado SDO_ORDINATES e são interpretadas através de três números armazenados no SDO_ELEM_INFO: SDO_STARTING_OFFSET: indica qual a posição da primeira coordenada do elemento no SDO_ORDINATES; SDO_ETYPE: indica o tipo do elemento; SDO_INTERPRETATION: indica como o elemento deve ser interpretado juntamente com o SDO_ETYPE. SDO_ORDINATES: contém os pontos que compõem a geometria Oracle Spatial – Tipos de Dados Espaciais Exemplo: Para o retângulo ao lado: SDO_GEOMETRY: SDO_GTYPE = 2003 ( 2 indica 2-dimensões, e 03 indica um polígono. SDO_SRID = NULL. SDO_POINT = NULL. SDO_ELEM_INFO = (1, 1003, 3). O último 3 indica que é um retângulo. SDO_ORDINATES = (1,1, 5,7). Identificam as coordenadas lower-left e upper-right do retângulo. Oracle Spatial – Tipos de Dados Espaciais Comando SQL para o ex. do retângulo: INSERT INTO cola_markets VALUES( 1, 'cola_a', SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior) SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to -- define rectangle (lower left and upper right) with -- Cartesiancoordinate data ) ); Oracle Spatial – Tipos de Dados Espaciais Ex2: Figure 2-3 Polygon with a Hole Oracle Spatial – Tipos de Dados Espaciais Para o Ex2 temos: SDO_GTYPE = 2003. O 2 indica 2-dimensões, e o 3 indica um polígono. SDO_SRID = NULL. SDO_POINT = NULL. SDO_ELEM_INFO = (1,1003,1, 19,2003,1). Há duas triplas: 1,1003,1 e 19,2003,1. 1003 indica que o elementoé um exterior polygon ring; 2003 indica que elemento é um interior polygon ring. 19 indica que a coordenada do segundo elemento (interior polygon ring) inicia na 19a. Posição do array SDO_ORDINATES array (isto é, 7, ou seja o primeiro ponto é 7,5). SDO_ORDINATES = (2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5). Oracle Spatial – Tipos de Dados Espaciais Comando SQL para o EX2.: INSERT INTO cola_markets VALUES( 10, 'polygon_with_hole', SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- polygon with hole SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5) ) ); Oracle Spatial – Tipos de Dados Espaciais Ex.3: Ponto SDO_GEOMETRY: SDO_GTYPE = 2001. O 2 indica 2-dimensões, e o 1 indica um único ponto. SDO_SRID = NULL. SDO_POINT = SDO_POINT_TYPE(12, 14, NULL). O atributo SDO_POINT é definedo usando o SDO_POINT_TYPE object type, porque esta é uma geometria de ponto. SDO_ELEM_INFO e SDO_ORDINATES são ambos NULL. Oracle Spatial – Tipos de Dados Espaciais Comando SQL para o Ex.3: Ponto INSERT INTO cola_markets VALUES( 90, 'point_only', SDO_GEOMETRY( 2001, NULL, SDO_POINT_TYPE(12, 14, NULL), NULL, NULL)); Oracle Spatial – Metadados Existem duas visões no esquema MDSYS: USER_SDO_GEOM_METADATA contém metadata para todas as tabelas espaciais possuidas pelo esquema do usuário. Cada coluna espacial deve ter uma linha inserida nesta view. ALL_SDO_GEOM_METADATA contém metadata para todas tabelas espaciais nas quais o usuário tem permissão SELECT. Existem também metadados para index: USER_SDO_INDEX_METADATA e ALL_SDO_INDEX_INFO Oracle Spatial – Metadados A visão tem a seguinte estrutura: ( TABLE_NAME VARCHAR2(32), COLUMN_NAME VARCHAR2(32), DIMINFO SDO_DIM_ARRAY, SRID NUMBER ); Oracle Spatial – Metadados TABLE_NAME: contém o nome da tabela COLUMN_NAME: nome da coluna do tipo SDO_GEOMETRY DIMINFO: é um array de tamanho variável de um object type, ordenado por dimension, e tem uma entrada para cada dimensão. Definido da seguinte forma: Create Type SDO_DIM_ARRAY as VARRAY(4) of SDO_DIM_ELEMENT; Create Type SDO_DIM_ELEMENT as OBJECT ( SDO_DIMNAME VARCHAR2(64), SDO_LB NUMBER, SDO_UB NUMBER, SDO_TOLERANCE NUMBER); SRID: Sistema de referência espacial Oracle Spatial – Metadados Exemplo: INSERT INTO USER_SDO_GEOM_METADATA VALUES ( 'cola_markets', 'shape', SDO_DIM_ARRAY( - 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ), NULL -- SRID ); Oracle Spatial - Exemplos Dos distritos de São Paulo, mostrados na fig ao lado CREATE TABLE DistritosSP ( cod NUMBER(32) NOT NULL , sigla VARCHAR2(20), denominacao VARCHAR2(200), spatial_data MDSYS.SDO_GEOMETRY, PRIMARY KEY (cod)) Oracle Spatial - Exemplos Dos bairros de São Paulo, mostrados na fig ao lado. CREATE TABLE BairrosSP ( geom_id NUMBER(32) NOT NULL, bairro VARCHAR2(200), distr VARCHAR2(200), spatial_data MDSYS.SDO_GEOMETRY, PRIMARY KEY (geom_id)) Oracle Spatial - Exemplos Do mapa de drenagem, mostrado na fig. ao lado. CREATE TABLE DrenagemSP ( geom_id NUMBER(32) NOT NULL, classe VARCHAR2(100) NULL, spatial_data MDSYS.SDO_GEOMETRY, PRIMARY KEY (geom_id)) Oracle Spatial - Exemplos Inserindo dados: INSERT INTO DistritosSP (cod, sigla, denominacao, spatial_data) VALUES (1, 'VMR', 'VILA MARIA' MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 1 ), MDSYS.SDO_ORDINATE_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10))) OBS.: Num polígono o primeiro ponto é igual ao último Oracle Spatial - Exemplos INSERT INTO DrenagemSP ( geom_id, classe, spatial_data) VALUES (1, 'RIO', MDSYS.SDO_GEOMETRY(2002, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY( 1, 2, 1 ), MDSYS.SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10))) INSERT INTO BairrosSP ( geom_id, bairro, distr, spatial_data) VALUES ( 1, 'JARDIM SHANGRILA', 'GRAJAU' MDSYS.SDO_GEOMETRY(2001, NULL, MDSYS.SDO_POINT_TYPE(32.628, 736.944, NULL ), NULL, NULL)) Oracle Spatial - Exemplos Após criar e inserir os dados em uma tabela espacial, o usuário deve registrar seu metadado. INSERT INTO USER_SDO_GEOM_METADATA VALUES ( 'DistritosSP' ,'spatial_data' , MDSYS.SDO_DIM_ARRAY( MDSYS.SDO_DIM_ELEMENT('X',275.9670,429.567,0.0005), MDSYS.SDO_DIM_ELEMENT('Y',833.0355,582.15,0.0005)), NULL) Oracle Spatial - Exemplos Criando índices (RTREE): CREATE INDEX index_name ON table_name (spatial_column_name) INDEXTYPE IS MDSYS.SPATIAL_INDEX; Exemplo: CREATE INDEX DistritosSP_IDX ON DistritosSP(SPATIAL_DATA) INDEXTYPE IS MDSYS.SPATIAL_INDEX Oracle Spatial - Consultas O Oracle Spatial utiliza um modelo de consulta baseado em duas etapas, chamadas de primeiro e segundo filtro. O primeiro filtro considera as aproximações das geometrias, pelo critério do mínimo retângulo envolvente (MBR), para reduzir a complexidade computacional. Este filtro é de baixo custo computacional e seleciona um subconjunto menor de geometrias candidatas, que será passado para o segundo filtro. O segundo filtro trabalha com as geometrias exatas, por isso é computacionalmente mais caro e só é aplicado ao subconjunto resultante do primeiro filtro. Retorna o resultado exato da consulta. Oracle Spatial - Consultas Principais operadores: SDO_FILTER: Implementa o primeiro filtro do modelo de consulta, ou seja, verifica se os mínimos retângulos envolventes das geometrias têm alguma interação entre si. Sintaxe: SDO_FILTER (geometry1 SDO_GEOMETRY,geometry2 SDO_GEOMETRY) SDO_RELATE Avalia se as geometrias possuem uma determinada relação topológica. Sintaxe: SDO_RELATE (geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY,param VARCHAR2). Param pode serEQUAL, DISJOINT, TOUCH, INSIDE, COVERS, COVERREDBY, OVERLAPBDYINTERSECT, ON, CONTAINS, OVERLAPBDYDISJOINT e ANYINTERACT SDO_WITHIN_DISTANCE: Verifica se duas geometrias estão dentro de uma determinada distância. Sintaxe: SDO_WITHIN_DISTANCE (geometry1 SDO_GEOMETRY, aGeom SDO_GEOMETRY,params VARCHAR2); SDO_NN: Identifica os n vizinhos mais próximos de uma Geometria. Sintaxe: SDO_NN (geometry1 SDO_GEOMETRY, aGeom SDO_GEOMETRY, param VARCHAR2, [, number NUMBER]); Oracle Spatial - Consultas As funções fornecidas pelo Spatial podem ser agrupadas em: Relação (verdadeiro/falso) entre duas geometrias: RELATE e WITHIN_DISTANCE. Validação: VALIDATE_GEOMETRY_WITH_CONTEXT, VALIDATE_LAYER_WITH_CONTEXT. Operações sobre uma geometria: SDO_ARC_DENSIFY, SDO_AREA, SDO_BUFFER, SDO_CENTROID, SDO_CONVEXHULL, SDO_LENGTH, SDO_MAX_MBR_ORDINATE, SDO_MIN_MBR_ORDINATE, SDO_MBR, SDO_POINTONSURFACE. Operações sobre duas geometrias: SDO_DISTANCE, SDO_DIFFERENCE, SDO_INTERSECTION, SDO_UNION, SDO_XOR. Oracle Spatial - Consultas Consulta 1: Recuperar o nome de todos os municípios da grande São Paulo que são vizinhos ao município de São Paulo. SELECT t1.nomemunicp FROM MunicipiosSP t1, MunicipiosSP t2 WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data, 'mask=TOUCH') = 'TRUE' AND t2.nomemunicp = 'SAO PAULO' Ou, usando o operador TOUCH diretamente: SELECT t1.nomemunicp FROM MunicipiosSP t1, MunicipiosSP t2 WHERE SDO_TOUCH (t1.spatial_data, t2.spatial_data) = 'TRUE' AND t2.nomemunicp = 'SAO PAULO' Oracle Spatial - Consultas Consulta 2: Recuperar o nome de todos os municípios da grande São Paulo que são vizinhos ao distrito Anhanguera da cidade de São Paulo SELECT t1.nomemunicp FROM MunicipiosSP t1, DistritosSP t2 WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data, 'mask= TOUCH') = 'TRUE' AND t2.denominacao = 'ANHANGUERA' Ou usando TOUCH: SELECT t1.nomemunicp FROM MunicipiosSP t1, DistritosSP t2 WHERE SDO_TOUCH (t1.spatial_data, t2.spatial_data) = 'TRUE' AND t2.denominacao = 'ANHANGUERA' Oracle Spatial - Consultas Consulta 3:Recuperar o número de bairros contidos no distrito Grajaú SELECT COUNT(*) FROM BairrosSP t1, DistritosSP t2 WHERE SDO_RELATE (t1.spatial_data, t2.spatial_data, 'mask=INSIDE') = 'TRUE' AND t2.denominacao = 'GRAJAU' Ou usando SDO_INSIDE: SELECT COUNT(*) FROM BairrosSP t1, DistritosSP t2 WHERE SDO_INSIDE (t1.spatial_data, t2.spatial_data) = 'TRUE' AND t2.denominacao = 'GRAJAU' Oracle Spatial - Consultas Consulta 4: Recuperar todos os distritos que estão num raio de 3km de um determinado rio SELECT t1.denominacao FROM DistritosSP t1, DreanagemSP t2, user_sdo_geom_metadata m WHERE SDO_RELATE (t1.spatial_data, SDO_GEOM.SDO_BUFFER(t2.spatial_ data, m.diminfo, 3000), 'mask=INSIDE+TOUCH+ OVERLAPBDYINTERSECT') = 'TRUE' AND m.table_name = ' DreanagemSP ' AND m.column_name = 'spatial_data' AND t2.geom_id = 55 Oracle Spatial - Consultas Consulta 5: Recuperar todos os bairros que estejam a menos de 3 Km do bairro Boacava SELECT t1.BAIRRO FROM BairrosSP t1, BairrosSP t2 WHERE SDO_GEOM.SDO_DISTANCE (t1.spatial_data, t2.spatial_data, 0.00005) < 3000 AND t2.bairro = 'BOACAVA' Oracle Spatial – Outras Características GeoRaster: para lidar com dados raster GeoCoding: endereçamento reverso Spatial Topology and Network Spatial Analysis and Mining PostGIS-PostgreSQL PostGIS é uma extensão espacial para o PostgreSQL que implementa a especificação padrão OGC Tipos de dados PostGIS: PostGIS-PostgreSQL Esses tipos possuem a seguinte representação textual: Point: (0 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)) PostGIS-PostgreSQL Dos distritos de São Paulo, CREATE TABLE distritossp ( cod SERIAL, sigla VARCHAR(10), denominacao VARCHAR(50), PRIMARY KEY (cod) ); SELECT AddGeometryColumn(‘BDEspacial', 'distritossp', 'spatial_data', -1, 'POLYGON', 2); PostGIS-PostgreSQL Adicione uma coluna espacial à tabela usando a função OpenGIS "AddGeometryColumn". A sintaxe é: AddGeometryColumn(<schema_name>, <table_name>, <column_name>, <srid>, <type>,<dimension>) Ou, usando o esquema corrente: AddGeometryColumn(<table_name>, <column_name>, <srid>, <type>,<dimension>) Exemplo1: SELECT AddGeometryColumn(’public’, ’roads_geom’, ’geom’, 423, ’LINESTRING’, 2) Exemplo2: SELECT AddGeometryColumn( ’roads_geom’, ’geom’, 423, ’LINESTRING’, 2) PostGIS-PostgreSQL Dos bairros de São Paulo CREATE TABLE bairrossp ( cod SERIAL, bairro VARCHAR(40), distr VARCHAR(40), PRIMARY KEY (cod)); SELECT AddGeometryColumn(‘BDEspacial', 'bairrossp', 'spatial_data', -1, 'POINT', 2); PostGIS-PostgreSQL Do mapa de drenagem CREATE TABLE drenagemsp ( cod SERIAL, classe VARCHAR(255) NULL, PRIMARY KEY (cod) ); SELECT AddGeometryColumn(‘BDEspacial', 'drenagemsp', 'spatial_data', -1, 'LINESTRING', 2); PostGIS-PostgreSQL Tabela de metadados The Well-Known Text representation of the Spatial Reference System. An example of a WKTnSRS representation is: PROJCS["NAD83 / UTM Zone 10N", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.257222101] ], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433] ], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-123], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1] ] PostGIS-PostgreSQL Tabela de metadados Geometry_Columns PostGIS-PostgreSQL – Inserção de Dados INSERT INTO bairrossp (bairro, spatial_data) VALUES('JARDIM DOS EUCALIPTOS', GeometryFromText('POINT(321588.628426 7351166.969244)', -1)); INSERT INTO drenagemsp (classe, spatial_data)VALUES('RIOS', GeometryFromText('LINESTRING(344467.895137 7401824.476217, 344481.584686 7401824.518728, 344492.194756 7401825.716359, …)’, -1)); INSERT INTO distritossp (denominacao, sigla, spatial_data) VALUES('MARSILAC', ‘MAR’, GeometryFromText('POLYGON((335589.530575 7356020.721956, 335773.784959 7355873.470174, …))', -1)); PostGIS-PostgreSQL – Inserção de Dados Carregando dados de um Shapefile: # shp2pgsql shaperoads myschema.roadstable | psql -d roadsdb PostGIS-PostgreSQL – Index Sintaxe: CREATE INDEX sp_idx_name ON nome_tabela USING GIST (coluna_geometrica GIST_GEOMETRY_OPS); Exemplos: CREATE INDEX sp_idx_bairros ON bairrossp USING GIST (SPATIAL_DATA GIST_GEOMETRY_OPS) CREATE INDEX sp_idx_bairros ON distritossp USING GIST (SPATIAL_DATA GIST_GEOMETRY_OPS) PostGIS-PostgreSQL – Index Forçando o uso do index numa consulta através do operador &&:: SELECT * FROM grande_sp WHERE 'BOX3D(438164.882699 7435582.150681, 275421.967006 7337341.000355)'::box3d && spatial_data); PostGIS-PostgreSQL – Consultas Operadores topológicos conforme a Matriz de 9Interseções : equals(geometry, geometry) disjoint(geometry, geometry) intersects(geometry, geometry) touches(geometry, geometry) crosses(geometry, geometry) within(geometry, geometry) overlaps(geometry, geometry) contains(geometry, geometry) relate(geometry, geometry): retornam a matriz de intersecção. PostGIS-PostgreSQL – Consultas Operador de construção de mapas de distância: buffer(geometry, double, [integer]) Operador para construção do Fecho Convexo: convexhull(geometry) Operadores de conjunto: intersection(geometry, geometry) geomUnion(geometry, geometry) difference(geometry, geometry) PostGIS-PostgreSQL – Consultas Operadores Métricos: Centróide de geometrias: distance(geometry,geometry) area(geometry) Centroid(geometry) •Validação (verifica se a geometria possui autointerseções): isSimple(geometry) PostGIS-PostgreSQL – Consultas Consulta 1: SELECT d2.nomemunicp FROM grande_sp d1, grande_sp d2 WHERE touches(d1.spatial_data, d2.spatial_data) AND (d2.nomemunicp <> 'SAO PAULO') AND (d1.nomemunicp = 'SAO PAULO'); PostGIS-PostgreSQL – Consultas Consulta 1: Usando o índice espacial SELECT d2.nomemunicp FROM distritossp d1, distritossp d2 WHERE touches(d1.spatial_data, d2.spatial_data) AND (d2.nomemunicp <> 'SAO PAULO') AND (d1.spatial_data && d2.spatial_data) AND (d1.nomemunicp = 'SAO PAULO'); PostGIS-PostgreSQL – Consultas Consulta 2: SELECT grande_sp.nomemunicp FROM distritossp, grande_sp WHERE touches(distritossp.spatial_data, grande_sp.spatial_data) AND (distritossp.spatial_data && grande_sp.spatial_data) AND (distritossp.denominacao = 'ANHANGUERA'); PostGIS-PostgreSQL – Consultas Consulta 3: SELECT COUNT(*) FROM bairrossp pt, distritossp pol WHERE contains(pol.spatial_data, pt.spatial_data) AND (pol.spatial_data && pt.spatial_data) AND pol.denominacao = 'GRAJAU'; PostGIS-PostgreSQL – Consultas Consulta 4: SELECT grande_sp.nomemunicp FROM grande_sp, drenagemsp WHERE intersects(buffer(drenagemsp.spatial_data, 3000), grande_sp.spatial_data) AND drenagemsp.cod = 59; PostGIS-PostgreSQL – Consultas Consulta 5: SELECT b1.bairro FROM bairrossp b1, bairrossp b2 WHERE (distance(b1.spatial_data, b2.spatial_data) < 3000) AND b1.bairro <> 'BOACAVA' AND b2.bairro = 'BOACAVA' order by b1.bairro; Oracle Spatial - Consultas