Name

<-> — A와 B 사이의 2차원 거리를 반환합니다.

Synopsis

double precision <->( geometry A , geometry B );

double precision <->( geography A , geography B );

설명

<-> 연산자는 두 도형 사이의 2차원 거리를 반환합니다. "ORDER BY" 절 안에서 이용하면 인덱스 지원형(index-assisted) 최근접(nearest neighbor) 결과 집합을 출력합니다. PostgreSQL 9.5 미만 버전은 경계 상자의 중심점 사이의 거리만 출력하고, 9.5 이상 버전은 도형 사이의 진정한 거리, 그리고 지리형 사이의 구면 거리(distance sphere)를 산출하는 진정한 KNN 거리 탐색을 실행합니다.

[Note]

이 피연산자(operand)는 도형에 대해 이용할 수 있을지도 모르는 2차원 GiST 인덱스를 활용할 것입니다. 연산자가 ORDER BY 절 안에 있을 때만 공간 인덱스를 쓴다는 점에서 공간 인덱스를 이용하는 다른 연산자들과는 다릅니다.

[Note]

도형 가운데 하나가, 예를 들어 a.geom이 아니라 'SRID=3005;POINT(1011102 450541)'::geometry와 같이, (하위 쿼리/CTE(common table expression) 안에 있지 않은) 상수일 경우에만 인덱스의 효과가 나타납니다.

실제 사용례를 살펴보려면 OpenGeo workshop: Nearest-Neighbour Searching 을 참조하십시오.

개선 사항: 2.2.0 버전 -- PostgreSQL 9.5 이상 버전에서 도형 및 지리형에 대해 진정한 KNN("K nearest neighbor") 습성을 도입했습니다. 지리형 KNN이 타원체가 아니라 구체를 기반으로 한다는 점에 주의하십시오. PostgreSQL 9.4 이하 버전에서 지리형을 쓸 수 있긴 하지만, 중심점 상자만 지원합니다.

변경 사항: 2.2.0 버전 -- PostgreSQL 9.5 버전 사용자의 경우, 예전의 하이브리드 문법(Hybrid syntax)이 느릴 수도 있기 때문에 PostGIS 2.2 이상, PostgreSQL 9.5 이상 버전에서만 사용자 코드를 실행하는 경우 이 꼼수를 제거하는 편이 좋을 수도 있습니다. 다음 예시를 참조하세요.

2.0.0 버전부터 사용할 수 있습니다. 약한 KNN이 실제 거리 대신 도형 중심점 거리에 기반한 최근접 탐색을 제공합니다. 포인트의 경우 정확한 결과를 출력하지만, 다른 모든 유형에 대해서는 부정확한 결과를 냅니다. PostgreSQL 9.1 이상 버전에서 이용할 수 있습니다.

예시

SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

그리고 KNN의 가공되지 않은 답은:

SELECT st_distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

사용자가 이 두 쿼리에 대해 "EXPLAIN ANALYZE"를 실행하면 두 번째 쿼리의 성능이 향상되는 것을 볼 수 있을 겁니다.

PostgreSQL 9.5 미만 버전을 실행하는 사용자의 경우, 실제 최근접 거리를 찾으려면 하이브리드 쿼리를 이용하십시오. 먼저 인덱스 지원형 KNN을 이용한 CTE(common table expression) 쿼리를 실행한 다음, 올바른 정렬 순서를 얻기 위해 정확한 쿼리를 실행합니다:

WITH index_query AS (
  SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
        FROM va2005
  ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry LIMIT 100)
  SELECT *
        FROM index_query
  ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

                        

참고

ST_DWithin, ST_Distance, <#>