Ao trabalhar com PostGIS, entender as relações espaciais entre geometrias é essencial para construir consultas eficientes. Duas das funções mais utilizadas — ST_Intersects e ST_Within — costumam gerar dúvidas, embora tenham finalidades diferentes.
Neste guia, você vai entender a diferença entre ST_Intersects e ST_Within, quando usar cada uma e como otimizar suas consultas espaciais com exemplos práticos.
1. A função ST_Intersects
A função ST_Intersects verifica se duas geometrias se tocam ou se sobrepõem.
Ou seja, retorna TRUE quando as duas geometrias compartilham pelo menos um ponto em comum.
SELECT ST_Intersects(geom1, geom2);
Retorna:
- TRUE → se as geometrias se cruzam ou se tocam
- FALSE → caso contrário
Exemplo
Suponha que você tenha:
- uma camada de estradas
- uma camada de municípios
Para encontrar as estradas que atravessam um município:
SELECT r.*
FROM roads r
JOIN municipalities c
ON ST_Intersects(r.geom, c.geom)
WHERE c.name = 'Paris';
Essa consulta retorna todas as estradas que intersectam o município.
2. A função ST_Within
A função ST_Within verifica se uma geometria está completamente contida dentro de outra.
SELECT ST_Within(geom1, geom2);
Retorna:
- TRUE → se a primeira geometria está totalmente dentro da segunda
- FALSE → caso contrário
Exemplo
Para encontrar escolas localizadas dentro de um município:
SELECT s.*
FROM schools s
JOIN municipalities c
ON ST_Within(s.geom, c.geom)
WHERE c.name = 'Paris';
Essa consulta retorna apenas as escolas situadas dentro do município.
3. Diferença principal
A principal diferença entre essas funções é:
| Função | Significado |
|---|---|
| ST_Intersects | As geometrias compartilham pelo menos um ponto |
| ST_Within | Uma geometria está completamente dentro de outra |
4. Quando usar cada função
Use ST_Intersects para:
- estradas que atravessam uma área
- zonas que se sobrepõem
- detectar qualquer tipo de contato espacial
Use ST_Within para:
- verificar se um ponto está dentro de um polígono
- confirmar que um objeto está totalmente contido em uma área
5. Exemplos conceituais
Podemos imaginar três situações:
- Um ponto dentro de um polígono
→ ST_Within = TRUE
→ ST_Intersects = TRUE - Uma linha atravessando um polígono
→ ST_Within = FALSE
→ ST_Intersects = TRUE - Duas geometrias separadas
→ ST_Within = FALSE
→ ST_Intersects = FALSE
6. Desempenho e índices espaciais
As funções ST_Intersects e ST_Within podem utilizar índices espaciais.
É recomendado criar um índice GiST:
CREATE INDEX idx_roads_geom
ON roads
USING GIST (geom);
Isso melhora significativamente o desempenho das consultas.
Conclusão
As funções ST_Intersects e ST_Within são fundamentais no PostGIS para analisar relações espaciais.
- ST_Intersects → verifica se geometrias se tocam ou se sobrepõem
- ST_Within → verifica se uma geometria está completamente contida em outra
Compreender essa diferença permite escrever consultas espaciais mais precisas e eficientes.
Principais funções de relação espacial no PostGIS
O PostGIS oferece várias funções para analisar relações entre geometrias:
| Função | Significado |
|---|---|
| ST_Intersects | Geometrias compartilham pelo menos um ponto |
| ST_Within | Uma geometria está dentro de outra |
| ST_Contains | Uma geometria contém completamente outra |
| ST_Touches | Geometrias se tocam sem sobreposição interna |
| ST_Overlaps | Geometrias se sobrepõem parcialmente |
| ST_Crosses | Geometrias se cruzam |

ST_Contains vs ST_Within
Essas duas funções são frequentemente confundidas, mas são inversas.
ST_Within(point, polygon)
é equivalente a:
ST_Contains(polygon, point)
Exemplo
Para encontrar escolas dentro de um município:
SELECT s.*
FROM schools s
JOIN municipalities c
ON ST_Within(s.geom, c.geom)
WHERE c.name = 'Paris';
Também pode ser escrito assim:
SELECT s.*
FROM schools s
JOIN municipalities c
ON ST_Contains(c.geom, s.geom)
WHERE c.name = 'Paris';
Dica de desempenho
Para grandes volumes de dados, é recomendado combinar funções espaciais com um filtro de bounding box:
SELECT s.*
FROM schools s
JOIN municipalities c
ON s.geom && c.geom
AND ST_Within(s.geom, c.geom);
O operador && compara as caixas envolventes e reduz o número de geometrias analisadas.
Pontos-chave
- ST_Intersects → relação espacial mais geral
- ST_Within → contenção total
- ST_Contains → inverso de ST_Within
- ST_Touches → contato sem sobreposição
Essas funções são essenciais para construir consultas espaciais eficientes no PostGIS.