পোস্টজিআইএস / পোস্টগ্রিসকিউএল-তে সর্বাধিক ওভারল্যাপের ভিত্তিতে যোগদান করবেন?


11

আমার কাছে দুটি টেবিলে দুটি সেট বহুভুজ রয়েছে। সেটগুলি একে অপরকে ওভারল্যাপ করে। সেট এ এর ​​প্রতিটি বহুভুজের জন্য আমি সেট বি তে বহুভুজটির আইডি পেতে চাই যা এটি সবচেয়ে বেশি ওভারল্যাপ করে। আমি পোস্টগ্রিজ এক্সটেনশন সহ পোস্টগ্রিজ এসকিউএল ব্যবহার করছি।

এসকিউএল সম্পর্কে আমি কেবল যথেষ্ট জানি যে আপনি কেবল সত্য / মিথ্যা শর্তের ভিত্তিতে যোগদান করতে পারেন। সুতরাং এটি কাজ করবে না:

SELECT
  a.id as a_id,
  b.id as b_id,
FROM
  a
JOIN
  b
ON
  max(ST_Area(ST_Intersection(a.geom, b.geom)))

কারণ সর্বোচ্চ () অন ক্লজে থাকতে পারে না।

ST_Intersects()সত্য / মিথ্যা পরীক্ষা, তাই আমি এতে যোগ দিতে পারতাম , তবে সেট এ-তে বহুভুজগুলি প্রায়শই বি বিতে একাধিক বহুভুজ দিয়ে ওভারল্যাপ হয়ে যায় এবং কোনটি সবচেয়ে বেশি ওভারল্যাপ করে তা আমার জানতে হবে । ST_Intersects সম্ভবত ওভারল্যাপের পরিমাণ নির্বিশেষে এটি কেবল প্রথম ওভারল্যাপিং আইডিটি ফিরিয়ে আনবে।

এটি করণে সক্ষম হওয়া উচিত বলে মনে হচ্ছে তবে এটি আমার বাইরে। কোন চিন্তা?

উত্তর:


13

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

এটা তোলে:

1) প্রতিটি (ক, খ) জোড়া রেকর্ডের জন্য ST_Area (ST_Intersication (a.geom, b.geom)) গণনা করে।

২) এআইডি সমান হলে এড এবং আন্তঃ ছেদকৃত অর্ডার দ্বারা তাদের অর্ডার করুন।

3) সমান a.id এর প্রতিটি গ্রুপে এটি প্রথম রেকর্ডটি পিক করে (দ্বিতীয় ধাপে অর্ডার দেওয়ার কারণে প্রথম রেকর্ডটিতে সর্বোচ্চ ছেদকেন্দ্র রয়েছে)।


এটি খুব ঝরঝরে সমস্যার সমাধান করে। ধন্যবাদ ধন্যবাদ! DISTINCT ONআমার কাছে নতুন - এই প্রসঙ্গে খুব সুবিধাজনক।
হিউ সিমিটসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.