আমার পোস্টগ্রিজ এসকিউএল 9.1 টেবিল রয়েছে কয়েক হাজার পোস্টজিআইএস পয়েন্ট সহ। এগুলির প্রত্যেকের জন্য আমি পয়েন্টের অন্য সারণির নিকটতম পয়েন্টটি খুঁজতে চাই। দ্বিতীয় সারণীর পয়েন্টগুলি পুরো বিশ্ব জুড়ে গ্রিডকে উপস্থাপন করে, তাই আমি জানি যে সর্বদা 1 ডিগ্রির মধ্যে একটি ম্যাচ হতে চলেছে। এটি আমি এখন অবধি যে কোয়েরিটি ব্যবহার করছি, এটি জিআইএসটি সূচকগুলি ব্যবহার করে, তাই এটি যুক্তিযুক্তভাবে দ্রুত (মোটামুটি 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 মিনিটের পরে ফিরে আসেনি।