Categorias:

Funções geoespaciais

ST_INTERSECTION

Ao receber dois objetos de entrada GEOGRAPHY, retorna um objeto GEOGRAPHY que representa o conjunto de pontos que são comuns aos dois objetos de entrada (ou seja, a interseção dos dois objetos).

Consulte também:

ST_UNION, ST_DIFFERENCE, ST_SYMDIFFERENCE

Sintaxe

ST_INTERSECTION( <geography_expression_1> , <geography_expression_2> )
Copy

Argumentos

geography_expression_1

Um objeto GEOGRAPHY.

geography_expression_2

Um objeto GEOGRAPHY.

Retornos

A função retorna um valor do tipo GEOGRAPHY.

Notas de uso

  • Se qualquer vértice de um objeto de entrada estiver no limite do outro objeto de entrada (excluindo os vértices), a saída pode ou não incluir esse ponto de vértice.

    Por exemplo, suponha que geography_expression_1 seja POINT(1 1) e geography_expression_2 seja LINESTRING(1 0, 1 2). Nesse caso, geography_expression_1 está no limite de geography_expression_2, mas não é um vértice dele.

    Neste exemplo, a saída esperada é POINT(1 1), mas a saída real pode ser uma geografia vazia (representada por NULL).

    Para ajudar a detectar e contornar estes casos, uma ideia potencial é usar ST_DWITHIN para determinar se a distância mínima entre os dois objetos de entrada é 0. Por exemplo, você pode verificar se um ponto está sobre um LineString verificando se a distância mínima entre os dois objetos é zero:

    SELECT TO_GEOGRAPHY('POLYGON((0 0, 1 0, 2 1, 1 2, 2 3, 1 4, 0 4, 0 0))') AS polygon,
           TO_GEOGRAPHY('POINT(0 2)') AS point,
           ST_DWITHIN(polygon, point, 0) AS point_is_on_top_of_polygon,
           ST_INTERSECTION(polygon, point);
    
    Copy

    Essa instrução produz a seguinte saída:

    +--------------------------------------------+------------+----------------------------+---------------------------------+
    | POLYGON                                    | POINT      | POINT_IS_ON_TOP_OF_POLYGON | ST_INTERSECTION(POLYGON, POINT) |
    |--------------------------------------------+------------+----------------------------+---------------------------------|
    | POLYGON((0 0,1 0,2 1,1 2,2 3,1 4,0 4,0 0)) | POINT(0 2) | True                       | NULL                            |
    +--------------------------------------------+------------+----------------------------+---------------------------------+
    
    Copy

    Não há garantia de que a função produzirá resultados normalizados e/ou mínimos. Por exemplo, uma saída poderia consistir de um LineString contendo vários pontos que na verdade formam apenas um segmento reto.

Exemplos

O exemplo a seguir retorna um objeto GEOGRAPHY que representa a diferença entre dois objetos de entrada GEOGRAPHY:

ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT = 'WKT';

SELECT ST_INTERSECTION(
  TO_GEOGRAPHY('POLYGON((0 0, 1 0, 2 1, 1 2, 2 3, 1 4, 0 4, 0 0))'),
  TO_GEOGRAPHY('POLYGON((3 0, 3 4, 2 4, 1 3, 2 2, 1 1, 2 0, 3 0))'))
AS intersection_of_objects;
Copy

Esse exemplo produz a seguinte saída:

+-----------------------------------------------------------------------------------------------------------------------------------------+
| INTERSECTION_OF_OBJECTS                                                                                                                 |
|-----------------------------------------------------------------------------------------------------------------------------------------|
| MULTIPOLYGON(((1.5 0.5000571198,2 1,1.5 1.500171359,1 1,1.5 0.5000571198)),((1.5 2.500285599,2 3,1.5 3.500399839,1 3,1.5 2.500285599))) |
+-----------------------------------------------------------------------------------------------------------------------------------------+
Copy

As imagens a seguir ilustram as diferenças nas áreas que representam os objetos de entrada e saída:

Entrada

Saída

Areas of input objects passed to ST_INTERSECTION Areas of output objects returned by ST_INTERSECTION