수십만 개의 PostGIS POINT가있는 PostgreSQL 9.1 테이블이 있습니다. 이들 각각에 대해 다른 POINT 테이블에서 가장 가까운 지점을 찾고 싶습니다. 두 번째 표의 점은 전 세계의 격자를 나타내므로 항상 1도 이내에 일치한다는 것을 알고 있습니다. 이것은 지금까지 내가 사용하고있는 쿼리로 GIST 인덱스를 사용하므로 합리적으로 빠릅니다 (총 30 초).
SELECT DISTINCT ON (p.id)
p.id, ST_AsText(p.pos)
, ST_AsText(first_value(g.location) OVER (PARTITION BY p.id ORDER BY ST_Distance(p.pos, g.location::geography)))
FROM point p
JOIN grid g ON ST_DWithin(p.pos::geometry, g.location, 1)
유일한 문제는 날짜 표시 줄입니다. 격자 점의 위도는 180이 아니라 -180입니다. ST_Distance의 지오메트리 버전을 사용하는 경우 날짜 줄의 다른쪽에있는 점을 반환하지 않습니다. 예 : p.pos가 POINT(-179.88056 -16.68833)
가장 가까운 그리드 포인트 인 POINT(180 -16.25)
경우 위의 쿼리는 그것을 반환하지 않습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
단일 그리드 포인트 (-180 및 +180)에 대해 두 개의 좌표를 갖고 싶지 않습니다. 이 특정 사례를 확인하는 자체 함수를 추가하려고 시도했지만 더 이상 인덱스를 사용할 수 없기 때문에 쿼리가 5 분 안에 반환되지 않습니다. 또한 ST_DWithin의 지리 버전을 사용해 보았으며 5 분 후에도 해당 쿼리가 반환되지 않았습니다.