ST_INTERSECTION

ST_INTERSECTION

두 개의 입력 GEOGRAPHY 객체가 주어졌을 때, 두 입력 객체에 공통인 점 집합을 포함하는 모양(즉 두 객체의 교집합)을 나타내는 GEOGRAPHY 객체를 반환해요.

출처: Snowflake SQL Reference - ST_INTERSECTION

본문

구문

ST_INTERSECTION( <geography_expression_1> , <geography_expression_2> )

인자

  • GEOGRAPHY 객체예요.
  • GEOGRAPHY 객체예요.

반환 값

함수는 GEOGRAPHY 타입의 값을 반환해요.

사용상 주의사항

  • 한 입력 객체의 정점(vertex) 중 하나라도 다른 입력 객체의 경계에 있으면(정점 제외), 출력이 그 정점 점을 포함할 수도 있고 포함하지 않을 수도 있어요. 예를 들어 geography_expression_1이 POINT(1 1)이고 geography_expression_2가 LINESTRING(1 0, 1 2)이라고 가정해요. 이 경우 geography_expression_1은 geography_expression_2의 경계에 있지만 정점은 아니에요. 이 예시에서 예상 출력은 POINT(1 1)이지만, 실제 출력은 빈 지리 객체(NULL로 표시)일 수 있어요. 이러한 경우를 감지하고 해결하는 한 가지 방법은 ST_DWITHIN을 사용해 두 입력 객체 사이의 최소 거리가 0인지 확인하는 것이에요. 예를 들어 두 객체 사이의 최소 거리가 0인지 확인해 점이 LineString 위에 있는지 검사할 수 있어요.
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);

이 문은 다음 출력을 생성해요.

+--------------------------------------------+------------+----------------------------+---------------------------------+
| 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                            |
+--------------------------------------------+------------+----------------------------+---------------------------------+
  • 이 함수는 정규화되고/거나 최소한의 결과를 생성한다고 보장되지 않아요. 예를 들어 출력이 실제로 하나의 직선 세그먼트를 이루는 여러 점을 포함하는 LineString으로 구성될 수 있어요.

예시

다음 예시는 두 입력 GEOGRAPHY 객체의 교집합을 나타내는 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;

이 예시는 다음 출력을 생성해요.

+-----------------------------------------------------------------------------------------------------------------------------------------+
| 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))) |
+-----------------------------------------------------------------------------------------------------------------------------------------+

더 알아보기