Tôi có một bảng PostgreSQL 9.1 với hàng trăm ngàn ĐIỂM PostGIS. Đối với mỗi trong số này, tôi muốn tìm điểm gần nhất trong một bảng ĐIỂM khác. Các điểm trong bảng thứ hai đại diện cho một lưới trên toàn thế giới, vì vậy tôi biết sẽ luôn có một trận đấu trong vòng 1 độ. Đây là truy vấn tôi đang sử dụng cho đến nay, sử dụng các chỉ mục GIST, do đó, nó khá nhanh (tổng cộng khoảng 30 giây).
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)
Vấn đề duy nhất là dòng thời gian. Các điểm lưới chỉ có vĩ độ 180, không -180. Khi sử dụng phiên bản hình học của ST_Distance, điều này không trả về các điểm ở phía bên kia của đường dữ liệu. Ví dụ. nếu p.pose là POINT(-179.88056 -16.68833)
điểm lưới gần nhất có thể POINT(180 -16.25)
, nhưng truy vấn trên không trả về nó. Cách tốt nhất để khắc phục điều này là gì?
Tôi thực sự không muốn có hai tọa độ cho một điểm lưới đơn (-180 và +180). Tôi đã thử thêm vào hàm riêng của mình để kiểm tra trường hợp cụ thể này, nhưng sau đó truy vấn không trả về sau 5 phút, có lẽ vì nó không thể sử dụng chỉ mục nữa. Tôi cũng đã thử sử dụng phiên bản địa lý của ST_DWithin và truy vấn đó cũng không trở lại sau 5 phút.