পোস্টজিআইএস ব্যবহার করে সমস্ত পয়েন্টকে সংযুক্ত করে এমন ক্ষুদ্রতম নেটওয়ার্কটি কীভাবে গণনা করবেন?


13

আমার কাছে পোস্টগিস স্ক্রিপ্টগুলির একটি সেট রয়েছে যা দুটি টেবিল উত্পন্ন করে - একটি পয়েন্টের একটি সেট এবং দ্বিতীয়টি তাদের চারপাশে থাকা রাস্তার একটি সেট। সমস্ত ডেটা একই অভিক্ষেপে এবং উভয় আউটপুট পোস্টগ্রিস ২.১ সহ পোস্টগ্রিস 9.2 সারণীতে সংরক্ষণ করা হয়

রাস্তা নেটওয়ার্কের পিগ্রাউটিং টপোলজি তৈরি করা হয়েছে এবং পয়েন্ট টেবিলটিতে একটি কলাম রয়েছে যার মধ্যে নিকটতম সড়ক বিভাগ রয়েছে।

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

আমি মডিউলগুলির ভিএন পরিবার ব্যবহার করে কিউজিআইএস / গ্রাসে এটি করতে পারি তবে আদর্শভাবে আমি এসকিউএল-তেও এই চূড়ান্ত পদক্ষেপটি রাখতে চাই।

আমি নতুন এএসপি ওয়ার্সাল পোস্টগিস ফাংশনটি দেখেছি তবে পুরো ক্ষতি করে কীভাবে এটি পুরোপুরি নেটওয়ার্কের সাথে সংযোগ স্থাপনের ক্ষেত্রে এর শক্তিকে কেন্দ্রীভূত করতে উত্সাহিত করা যায় তা নিয়ে আমার ক্ষতি হচ্ছে।

এটি সংক্ষিপ্ত করার জন্য একটি কাঠামো তৈরি করার প্রয়াসে আমি এই শর্ট স্ক্রিপ্টটি একত্রিত করেছি তবে কোন প্রান্তের উপসেটটি দিয়ে শুরু করার জন্য ফাংশনটি ফোকাস করা সম্ভব কোথায় তা আমি দেখতে পাচ্ছি না।

SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM   pgr_apspWarshall('SELECT gid AS id, 
                                source, 
                                target, 
                                st_length(the_geom) AS cost 
                         FROM   road_network
                        ',
                        false, false
                       ) AS tree
JOIN   road_network As roads
ON     tree.id2 = roads.gid

একক পাথের সংক্ষিপ্ত পথের সমস্যার ক্ষেত্রে ক্রিয়াকলাপটি শুরু এবং শেষের জন্য জিজ্ঞাসা করে তবে স্পষ্টতই সমস্ত পয়েন্ট সমস্যার মধ্যে নেই। সমভাবে গ্রাসে v.net.spanningtree এবং v.net.steiner যৌথ নেটওয়ার্ক হিসাবে কাজ করার জন্য পয়েন্ট এবং লাইনগুলির একটি সেট আশা করে।

পোস্টজিআইএসে কীভাবে এটি করা যায় তার জন্য কারও কাছে কোনও পরামর্শ আছে?


আমি নিশ্চিত না যে আমি প্রশ্নটি বুঝতে পেরেছি কিন্তু ডকস.পগ্রোটিং.আরগ / ২ / পি / এসআরসি / এসএসপি / ডক / ইন্ডেক্স এইচটিএমএল#pgr-tsp বিক্রয় বিক্রয় ব্যক্তি অ্যালগোরিদম আপনাকে সহায়তা করে?
সিমপ্লেসিও

1
ধন্যবাদ। আসলেই আমি ভয় পাই না। ট্র্যাভেলিং বিক্রয়কর্মী লিনিয়ার ফ্যাশনে একটি থেকে বি এবং সি পর্যন্ত আরও একটি যাত্রা অনুমান করে। আমি যা চাই তা সর্বনিম্ন নেটওয়ার্ক যা প্রতিটি পয়েন্টকে দক্ষতার সাথে সংযুক্ত করে যে কোনও বিন্দু এই জ্ঞানের যে কোনও পয়েন্টে যাত্রা শুরু করতে পারে যে হারিয়ে যাওয়ার কোনও অতিরিক্ত প্রয়োজনের পথ নেই। অন্যান্য প্ল্যাটফর্মগুলিতে এটি সাধারণত ন্যূনতম স্প্যানিং ট্রি ফাংশন, স্টেইনার ট্রি ( en.wikedia.org/wiki/Steiner_tree_problem ) বা অনুরূপ দ্বারা সম্পন্ন হয়। যদি আপনি চান, লজিস্টিক সংস্থার জন্য টিএসপি দুর্দান্ত তবে তারা যে রাস্তাগুলি ব্যবহার করবে সেগুলি পরিকল্পনা করতে চাই।
অ্যাড্রিয়ান

উত্তর:


2

এই উত্তরটি সম্পূর্ণ বা পরীক্ষিত নয়, তবে এর মতো কিছু চেষ্টা করুন:

প্রশ্ন অনুসারে / 39210 :

with index_query as (
SELECT
        ,ST_Distance(i.geom, i.b_geom) AS dist
        ,ST_MakeLine(i.geom, i.b_geom) as geom
FROM(
SELECT
        ,a.geom
        ,b.geom AS b_geom
        ,rank() OVER (PARTITION BY a.id ORDER BY ST_Distance(a.centroid_geom, b.the_geom)) AS pos
FROM points a, points b 
WHERE a.id <> b.id) i
WHERE pos = 1
) select ST_Union(geom) from index_query;

আমি মনে করি এটি খুব দক্ষ নয়।


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

2

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

পদক্ষেপ 1 (সমস্ত স্টপকে সংযুক্ত করে এমন একটি রোড নেটওয়ার্ক সাবসেটের উপ-নির্বাচন) এটি একাধিক গন্তব্য (কে ডিজকাস্ট্র পাথ) রাউটিং ফাংশনটি ব্যবহার করে যেগুলির পাথের সংকলন ফিরে আসে (যখন ব্যয় <> -1) আসলে আপনার সমস্তগুলি সংযুক্ত করে স্টপ।

SELECT id1 as path, st_astext(st_linemerge(st_union(b.the_geom))) as the_geom
FROM pgr_kdijkstraPath(
SELECT id, source, target, cost FROM edge_table’,
min(all_your_stop_ids), [array_of_all_your_stop_ids], false, false
) a,
edge_table b
WHERE a.id3=b.id
GROUP by id1
ORDER by id1

আমার যে সমস্যাটি এখানে আছে তা হ'ল আপনার স্টপ টেবিল থেকে একটি অ্যারে একত্র করার সিনট্যাক্স, কারণ এটি আসলে প্রশ্নটিতে বর্ণিত হয়নি। যাইহোক, ধরে নেওয়া যাক এসকিউএল সিন্ট্যাক্স সেই অ্যারেটি একত্রিত করতে পারে এবং সর্বনিম্ন আইডি স্টপটি বাকি টার্গেট স্টপগুলির সমস্ত কে পাথের সূচনার পয়েন্ট হওয়া উচিত।

পদক্ষেপ 2 (উপরের সাবসেট রোড নেটওয়ার্ক পাথগুলির উপর ভিত্তি করে সর্বনিম্ন পাথের চূড়ান্ত নির্বাচন যা সমস্ত স্টপকে সংযুক্ত করে) এটি মূলত আপনি যা শুরু করেছিলেন তা হ'ল, তবে আমি প্রস্তাব দিচ্ছি যে আপনি আইডি 1 (পাথ) এর প্রাথমিক ফলাফলটিতে আপনার রাস্তা নেটওয়ার্ককে সমান-যোগ করুন join যাতে চূড়ান্ত মাঠ-ওয়ারশাল রাউটিংয়ে কেবলমাত্র রাস্তার উপসেট ব্যবহার করা হয় :

SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM   pgr_apspWarshall('SELECT R.gid AS id, 
                                R.source, 
                                R.target, 
                                st_length(R.the_geom) AS cost 
             FROM   road_network AS R JOIN
                   (SELECT id1 as path
                     FROM pgr_kdijkstraPath(
                            ’SELECT id, source, target, cost FROM edge_table’,
                            min(all_your_stop_ids), 
                            [array_of_all_your_stop_ids], false, false
                           ) a,
                     edge_table b
                    WHERE a.id3=b.id
                    GROUP by id1
                    ORDER by id1
                        ',
                        false, false
                  ) AS  Just_K_Paths
         on R.id1 = just_K_paths.id1',       /* this join reduces R down to K paths */
         false, false
        ) AS tree
  JOIN   road_network As roads
  ON     tree.id2 = roads.gid

সুতরাং, সংক্ষেপে ... অভ্যন্তরীণ k_dijkstra_path রাউটিং কোয়েরিটি আপনার সমস্ত স্টপগুলিকে সংযুক্ত করে কেবলমাত্র সমস্ত রাস্তার নেটওয়ার্ককে হ্রাস করে, তবে বহিরাগত fField_Warshal রাউটিং কেবল সেই প্রান্ত আইডিকে প্যাথ-অপ্টিমাইজেশন কোয়েরি সমাধান করার জন্য ব্যবহার করে .... হতে পারে।


আপনাকে ধন্যবাদ - এটি খুব সহায়ক এবং আমার প্রথম নতুন নেতৃত্ব। আমি এখন এটি তাকান। আমি কীভাবে সর্বনিম্ন স্টপ আইডি এবং অ্যারে জেনারেট করব তা নিয়ে চেষ্টা করার চেষ্টা করছি। আমার কাছে প্রয়োজনীয় আইডির একটি টেবিল রয়েছে তবে 'কোড নির্বাচন করুন (আইডি) থেকে নোড_ট্যাবল থেকে' এবং 'নির্বাচন করুন অ্যারে [আইডি] থেকে আপনার কোড প্রবেশ করানোর সময় সিনট্যাক্স ত্রুটি তৈরি করে তবে ফ্রি-স্ট্যান্ডিং কোড হিসাবে কাজ করুন (আমার খারাপ ধারণা আমি নিশ্চিত)
অ্যাড্রিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.