ฉันมีตาราง PostgreSQL 9.1 พร้อมจุด PostGIS นับแสนรายการ สำหรับแต่ละสิ่งเหล่านี้ฉันต้องการค้นหาจุดที่ใกล้ที่สุดในตาราง POINTs อื่น คะแนนในตารางที่สองแสดงตารางทั่วโลกดังนั้นฉันรู้ว่าจะมีการแข่งขันภายใน 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_D ภายในนั้นและแบบสอบถามนั้นก็ไม่ได้กลับมาหลังจาก 5 นาที