মিলবে বিভাগগুলির জন্য অ্যালগরিদম


23

বিভাগগুলি মেলাতে সেরা অ্যালগরিদমগুলি কী কী?

আমি দুটি মানচিত্র উত্স থেকে সংশ্লিষ্ট বিভাগগুলি মেলানোর চেষ্টা করছি, একটি কম নির্ভুল তবে সেগমেন্টের নাম সহ, এবং একটি আরও খন্ডের নাম ছাড়াই নির্ভুল। আমি আরও সঠিক মানচিত্রে সেগমেন্টের নামগুলি আধা-স্বয়ংক্রিয়ভাবে প্রয়োগ করতে চাই।

অনুরোধ করা অ্যালগরিদমের যথেষ্ট অস্পষ্ট বর্ণনা রয়েছে কারণ "ম্যাচ" ভালভাবে সংজ্ঞায়িত হয় না এবং অনেকগুলি কারণ (ওরিয়েন্টেশন, আপেক্ষিক দৈর্ঘ্য, দূরত্ব) বিভিন্ন পরিস্থিতিতে বিভিন্ন ওজন থাকতে পারে; তবে, আমি এই সমস্যাটি পরিচালনা করার জন্য সাধারণ পদ্ধতির বিষয়ে একটি প্রাথমিক জ্ঞান সন্ধান করছি।

মুক্ত উত্স পরিবেশের জন্য কার্যকরী বাস্তবায়ন (PostGIS, সুদৃশ্য, ...) আন্তরিকভাবে স্বাগত।

নমুনা বিভাগ : চিত্রের নীচে বর্ণনা দেখুন।


সেগমেন্টের ঘনত্বের ওভারভিউ দেওয়ার জন্য আপনি কীভাবে আপনার ডেটার একটি স্ন্যাপশট পোস্ট করতে পারেন এবং সেগুলি কতটা আলাদা?
জুলিয়ান

1
আমি ফ্লিকারে কিছু চিত্র পোস্ট করেছি, লিঙ্কটি দেখুন।
আদম মতান

1
আপনি "কনফ্লেশন" সন্ধানের চেষ্টা করতে পারেন।
কर्क কুইকেনডাল

উত্তর:


14

Hausdorff দূরত্ব ব্যবহার করা যেতে পারে: মিলে অংশ এই দূরত্ব অনুযায়ী 'ঘনিষ্ঠ' অংশ হতে পারে। বিভাগগুলিতে গণনা করা এটি বেশ সহজ।

একটি বিনামূল্যে জাভা বাস্তবায়ন জেটিএসে উপলব্ধ - জেটিএস দূরত্ব প্যাকেজ দেখুন । আপনার জেসিএস কনফ্লেশন স্যুট (এখন পরিত্যাগ করা, উত্সগুলির অনুলিপি যেমন https://github.com/oschrenk/jcs এ ) দেখুন।



10

আমি জানি না "সেরা" কী হবে কারণ এটি আপনার বিভাগগুলির বিশদগুলির উপর নির্ভর করবে।

একটি সাধারণ উত্তম পদ্ধতি হল বিভাগগুলিকে গুরুত্বপূর্ণ জ্যামিতিক তথ্যে হ্যাশ করা । এর মধ্যে অন্তত অন্তত, কেন্দ্রের অবস্থান (x, y), ওরিয়েন্টেশন (0 থেকে 180 ডিগ্রি) এবং দৈর্ঘ্য অন্তর্ভুক্ত থাকবে। যথাযথ ওজন প্রয়োগ করা হয়েছে এবং কিছুটা ওরিয়েন্টেশন বাজানো (কারণ 180 টি "প্রায়" মোড়ের সাথে "পিছনে 0 থেকে") এর পরে আপনি সমস্ত বিভাগগুলির সংগ্রহে প্রায় কোনও পরিসংখ্যানগত ক্লাস্টারিং অ্যালগরিদম প্রয়োগ করতে পারেন । ( কে-মানে একটি ভাল বিকল্প হবে, তবে বেশিরভাগ শ্রেণিবদ্ধ পদ্ধতিতে ভালভাবে কাজ করা উচিত Such এই ধরনের ক্লাস্টার বিশ্লেষণগুলি দ্রুত এবং সহজে প্রয়োগ করা যায়) সহজ.

ওরিয়েন্টেশন সমস্যাটি মোকাবেলার একটি উপায় হ'ল লেবেলযুক্ত বিভাগগুলির একটি অনুলিপি। প্রথম অনুলিপিটির অগ্রযাত্রায় 180 ডিগ্রি যুক্ত করুন, যদি এটি 90 এর চেয়ে কম হয়, এবং অন্যথায় ওরিয়েন্টেশন থেকে 180 ডিগ্রি বিয়োগ করুন। এটি আপনার ডেটাসেটকে প্রসারিত করে (স্পষ্টতই) তবে অন্যথায় কোনওভাবেই অ্যালগরিদম পরিবর্তন করে না।

ওজন প্রয়োজন কারণ স্থানাঙ্ক, দৈর্ঘ্য এবং ওরিয়েন্টেশনের পার্থক্য তাদের সম্পর্কিত বিভাগগুলির মিলগুলির বিষয়ে বিভিন্ন ভিন্ন জিনিস বোঝাতে পারে। অনেক অ্যাপ্লিকেশনগুলিতে বিভাগগুলির মধ্যে পার্থক্যগুলি তাদের শেষের পয়েন্টগুলির অবস্থানের পার্থক্য থেকে উত্থিত হয়। মোটামুটি অনুমান হিসাবে আমরা সেগমেন্টের দৈর্ঘ্যের মধ্যে সাধারণত প্রান্তিকের শেষ প্রান্তের মধ্যে প্রায় একই রকমের পার্থক্য আশা করতে পারি। সুতরাং, x, y এবং দৈর্ঘ্যের সাথে যুক্ত ওজন একই রকম হওয়া উচিত। জটিল অংশটি ওজনকে কেন্দ্র করে করা হচ্ছে, কারণ ওরিয়েন্টেশনটি দূরত্বের সাথে সমীকরণ করা যায় না এবং আরও খারাপ এটি হ'ল দীর্ঘ অংশগুলির তুলনায় সংক্ষিপ্ত অংশগুলি ভুল-কেন্দ্রিক হওয়ার সম্ভাবনা বেশি থাকে। একটি ট্রায়াল-অ্যান্ড-ত্রুটি পদ্ধতিটি বিবেচনা করুন যা বিভাগগুলির মধ্যে একটি সাধারণ ব্যবধানের আকারের সাথে কয়েকটি ডিগ্রি অবলুপ্তির সমান করে এবং তারপরে প্রক্রিয়াটি ভালভাবে কাজ করছে বলে মনে হচ্ছে না। গাইডেন্সের জন্য, আসুনL একটি সাধারণ বিভাগের দৈর্ঘ্য হতে পারে। ক্ষুদ্রতর কোণ টি ডিগ্রি দ্বারা অভিমুখীকরণের পরিবর্তনটি প্রায় এল / 2 * টি / 60 (60 টি একটি রেডিয়ানের ডিগ্রির সংখ্যার সমান) কেটে যায়, যা এল / 120 গুণ টি । যে দিয়ে শুরু প্রস্তাব দেওয়া ইউনিট এক্স, y, ও দৈর্ঘ্যের জন্য ওজন এবং একটি ওজন এল ওরিয়েন্টেশনের জন্য / 120 এর ।

সংক্ষেপে , এই পরামর্শটি হ'ল:

  1. লেবেলযুক্ত বিভাগগুলির অনুলিপি তৈরি করুন (ওরিয়েন্টেশনটি ফেনিং করার অনুচ্ছেদে বর্ণিত হিসাবে)।

  2. প্রতিটি বিভাগকে চতুষ্কোণে রূপান্তর করুন (x, y, দৈর্ঘ্য, এল / 120 * ওরিয়েন্টেশন) যেখানে এল একটি সাধারণ বিভাগের দৈর্ঘ্য।

  3. চতুর্ভুজগুলির একটি গুচ্ছ বিশ্লেষণ সম্পাদন করুন। একটি ভাল পরিসংখ্যান প্যাকেজ ব্যবহার করুন ( আর ফ্রি)।

  4. লেবেলযুক্ত অংশগুলিকে নিকটবর্তী লেবেলযুক্ত বিভাগগুলির সাথে যুক্ত করতে ক্লাস্টার বিশ্লেষণ আউটপুটটিকে লুক টেবিল হিসাবে ব্যবহার করুন।


4

আমি প্রায় 5 বছর আগে অনুরূপ প্রয়োজনীয়তা নিয়ে একটি প্রকল্পে কাজ করেছি। এতে হাইওয়ে পারফরম্যান্স মনিটরিং সিস্টেমের (এইচপিএমএস) ট্র্যাফিক নেটওয়ার্ক লিঙ্কগুলির সাথে রাস্তার সেন্টারলাইনগুলি (তুলনামূলকভাবে উচ্চ স্থানাঙ্কিত নির্ভুলতা সহ) স্থানাঙ্কগুলি একত্রিত করা জড়িত ।

এই সময়ে এফএইচডাব্লুএ এই ধরণের জিনিসটি করার জন্য কোনও সরঞ্জাম সরবরাহ করে নি। এটি পরিবর্তিত হতে পারে, আপনি চেক করতে চাইতে পারেন। এমনকি আপনি হাইওয়ে ডেটা নিয়ে কাজ না করলেও, সরঞ্জামগুলি এখনও প্রাসঙ্গিক হতে পারে।

আমি এটি আরকিজিআইএস দিয়ে লিখেছি, তবে যতক্ষণ না এটি আইসেমেন্টগ্রাফের মতো ট্রেসিং ক্ষমতা সরবরাহ করে ততক্ষণ অ্যালগরিদমটি ওপেনসোর্সে কাজ করা উচিত :

// features is a collection of features with higher geometry
// Links are a collection features with attributes but low res geometry
For each Link in lowResFeatureclass
    point startPoint = SnapToClosestPoint(Link.StartPoint, hiResfeatures);
    if(startPoint == null)
       continue;
    point endPoint = SnapToClosest(Link.EndPoint, hiResfeatures);
    if(endPoint == null)
       continue;
    polyline trace = Trace(hiResfeatures,startPoint,endPoint);
    if(polyline != null)
    {
        // write out a link with high precision polyline
        Write(Link,polyline);
    }
Next Link

4

এখানে একটি ধারণা আসে

যদি আপনি তুলনামূলকভাবে পরীক্ষা করার জন্য লাইনস্ট্রিংগুলির মধ্যে একটি ছিঁড়ে ফেলেন এবং ভার্ট এক্সপয়েন্টগুলি তুলনা করার জন্য অন্যান্য লাইনস্ট্রিং থেকে কিছু দূরত্বে রয়েছে তবে আপনি পরীক্ষাটি বিভিন্ন উপায়ে নিয়ন্ত্রণ করতে পারবেন।

এই উদাহরণগুলি পোস্টজিআইএস-এ কাজ করে (যারা অনুমান করতে পারে :-))

প্রথমত, আমরা যদি বলি যে টেবিল_1 তে একটি লাইনস্ট্রিঙের সমস্ত ভার্টেক্স পয়েন্টগুলি 0.5 মিটার (মানচিত্র ইউনিট) বা টেবিল_2 এর একটি লাস্টারিংয়ের কাছাকাছি থাকলে একটি মিল রয়েছে:

SELECT a.id, b.id FROM
(SELECT ST_NPoints(the_geom) as num_of_points,
(ST_Dumppoints(the_geom)).geom as p, id FROM table_1) a 
INNER JOIN 
table_2 b 
ON ST_DWithin(a.p, b.the_geom, 0.5) GROUP BY a.id, b.id
HAVING COUNT(*)=num_of_points;

তারপরে আমরা বলতে পারি যে টেবিল_1 এর একটি লাইনস্ট্রিংয়ের মধ্যে 60০% এরও বেশি ভার্টেক্স_পয়েন্টগুলি টেবিল_2 এ লাইনস্ট্রিংয়ের দূরত্বের মধ্যে থাকলে

SELECT a.id, b.id FROM
(SELECT ST_NPoints(the_geom) as num_of_points, 
(ST_Dumppoints(the_geom)).geom as p, id FROM table_1) a 
INNER JOIN 
table_2 b 
ON ST_DWithin(a.p, b.the_geom, 0.5) GROUP BY a.id, b.id
HAVING COUNT(b.id)/num_of_points::float > 0.6

বা আমরা স্বীকার করতে পারি যে একটি পয়েন্ট সীমার মধ্যে নেই:

SELECT a.id, b.id FROM
(SELECT ST_NPoints(the_geom) as num_of_points, 
(ST_Dumppoints(the_geom)).geom as p, id FROM table_1) a 
INNER JOIN 
table_2 b 
ON ST_DWithin(a.p, b.the_geom, 0.5) GROUP BY a.id, b.id
HAVING COUNT(b.id)-num_of_points <= 1;

বিপরীত ভূমিকার ক্ষেত্রে আপনাকে টেবিল_1 এবং টেবিল_2 দিয়ে ক্যোয়ারী চালাতে হবে।

আমি জানি না এটি কত দ্রুত হবে। এসT_ডামপয়েন্টস বর্তমানে পোস্টজিআইএস-এ একটি স্কেল-ফাংশন এবং এটি কোনও সি-ফাংশন নয় যা এটি হওয়া উচিতের চেয়ে ধীর করে তোলে। তবে আমি মনে করি এটি যাইহোক বেশ দ্রুত হবে।

স্পেসিয়াল ইনডেক্সগুলি এস এস দ্বিথিনকে কার্যকর করতে অনেক সাহায্য করবে।

এইচটিএইচ নিক্লাস


1
+1 এটি অবশেষে আমি ব্যবহার করা পদ্ধতির সাথে খুব মিল (খুব শীঘ্রই একটি উত্তর পোস্ট করবে)।
আদম মতান

4

আমি বাউন্ডারি জেনারেটরে স্লোপি লাইন বিভাগের মিলটি (এবং সেগুলিকে ওভারল্যাপ করতে) পরিচালনা করতে কোড লিখেছি। আমি এর পিছনে (মোটামুটি প্রাথমিক) গণিতটি এখানে লিখেছি: http://blog.shoutis.org/2008/10/inside-boundary-generator-computational.html । কোডটি মুক্ত উত্স এবং সেই ব্লগ পোস্ট থেকে লিঙ্কযুক্ত।

কোডটি একটি খুব সহজ পদ্ধতির অনুসরণ করে:

  • একটি সেগমেন্ট-সেগমেন্ট পরীক্ষা যা আপনাকে বলবে যে দুটি লাইন বিভাগগুলি প্রদত্ত কোণ এবং দূরত্ব সহনশীলতার মধ্যে ওভারল্যাপ হয় এবং ওভারল্যাপের পরিমাণ whether
  • একটি তাত্ক্ষণিক তিনটি স্থানিক সূচক যা ডেটাসেটের অন্যান্য লাইন বিভাগগুলির বিপরীতে ডেটাসেটে প্রতিটি লাইন বিভাগকে পরীক্ষা করার প্রয়োজনকে দূর করে।

এই পদ্ধতির প্রধান সুবিধা হ'ল আপনি বৈধ কোণ, দূরত্ব এবং ওভারল্যাপ দৈর্ঘ্যের জন্য সুন্দরভাবে সুনির্দিষ্ট knobs পান; নেতিবাচক দিক থেকে, এটি সাধারণত দুটি লাইনের খণ্ডগুলির মিলের পরিমাপ করার উপায় নয় সুতরাং উদাহরণস্বরূপ সম্ভাব্য ম্যাচগুলি নির্ধারণের জন্য স্ট্যাটিস্টিকাল ক্লাস্টারিং করা - আপনি সুনির্দিষ্ট knobs দিয়ে আটকে আছেন।

দ্রষ্টব্য: আমি অনুমান করছি যে পর্যাপ্ত এসকিউএল চপস দ্বারা আপনি সেগমেন্ট-সেগমেন্ট পরীক্ষাটি যেখানে একটি বিভাজনে বিভক্ত করতে পারেন ... :)

চিয়ার্স!


+1 এটি একটি দুর্দান্ত পদ্ধতি; চতুষ্কোণ তৈরি এটি গণনামূলকভাবে উন্নত করে তোলে। তবে বিশদগুলিতে যত্ন নেওয়া দরকার: বিভাগের সান্নিধ্য বা সাদৃশ্য নির্ধারণ করার সময় (ছেদ পরিবর্তে), আপনাকে এই তথ্যের জন্য অ্যাকাউন্টিং করতে হবে যে আপনার ডেটা স্ট্রাকচারটি কোনও বিভাগের অনন্য উপস্থাপনা সরবরাহ করে না: খণ্ডটি x এর দিকে শুরু হয়েছে , দিকের দিকে v , দৈর্ঘ্য টি সমানভাবে ভাল এ সেগমেন্ট উদ্ভব হয় এক্স + + T বনাম দিক নির্দেশনা -v দৈর্ঘ্যের টি
whuber

1

আমি এখানে মানচিত্রের মিলের জন্য মোটামুটি প্রোটোটাইপ প্রয়োগ করেছি , যা ব্যবহারের তুলনায় সহজ। এটি ওপেন সোর্স রাউটিং ইঞ্জিনের উপর ভিত্তি করে জাভাতে লিখিত। ব্যবহৃত অ্যালগরিদম এখানে বর্ণিত হয়েছে

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