[PT]ST_Intersects vs ST_Within: entendendo as relações espaciais no PostGIS

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çãoSignificado
ST_IntersectsAs geometrias compartilham pelo menos um ponto
ST_WithinUma 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:

  1. Um ponto dentro de um polígono
    → ST_Within = TRUE
    → ST_Intersects = TRUE
  2. Uma linha atravessando um polígono
    → ST_Within = FALSE
    → ST_Intersects = TRUE
  3. 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çãoSignificado
ST_IntersectsGeometrias compartilham pelo menos um ponto
ST_WithinUma geometria está dentro de outra
ST_ContainsUma geometria contém completamente outra
ST_TouchesGeometrias se tocam sem sobreposição interna
ST_OverlapsGeometrias se sobrepõem parcialmente
ST_CrossesGeometrias se cruzam
do “Analysis of Spatial Relations Based on Elements”:https://ikcest-drr.data.ac.cn/tutorial/k1034

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.


Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Are you human? Please solve:Captcha